Você está na página 1de 140

Universidade Federal do Piau

Centro de Educao Aberta e a Distncia

LABORATRIO DE
PROGRAMAO

Jos Ricardo Mello Viana


Ministrio da Educao - MEC
Universidade Aberta do Brasil - UAB
Universidade Federal do Piau - UFPI
Centro de Educao Aberta e a Distncia - CEAD

Laboratrio de
Programao

Jos Ricardo Mello Viana


PRESIDENTE DA REPBLICA Dilma Vana Rousseff Linhares
MINISTRO DA EDUCAO Aloizio Mercadante
GOVERNADOR DO ESTADO Wilson Nunes Martins
REITOR DA UNIVERSIDADE FEDERAL DO PIAU Jos Arimatia Dantas Lopes
PRESIDENTE DA CAPES Jorge Almeida Guimares
COORDENADOR GERAL DA UNIVERSIDADE ABERTA DO BRASIL Joo Carlos Teatini de S. Clmaco
DIRETOR DO CENTRO DE EDUCAO ABERTA E A DISTNCIA DA UFPI Gildsio Guedes Fernandes

COORDENADORES DE CURSOS
ADMINISTRAO Antonella Maria das Chagas Sousa
ADMINISTRAO PBLICA Fabiana Rodrigues de Almeida Castro
CINCIAS BIOLGICAS Maria da Conceio Prado de Oliveira
FILOSOFIA Zoraida Maria Lopes Feitosa
FSICA Miguel Arcanjo Costa
LETRAS PORTUGUS Jos Vanderlei Carneiro
LETRAS INGLS Lvia Fernanda Nery da Silva
MATEMTICA Joo Bencio de Melo Neto
PEDAGOGIA Vera Lcia Costa Oliveira
QUMICA Milton Batista da Silva
SISTEMAS DE INFORMAO Leonardo Ramon Nunes de Sousa

EQUIPE DE DESENVOLVIMENTO CONSELHO EDITORIAL DA EDUFPI


TCNICOS EM ASSUNTOS EDUCACIONAIS Zilda Vieira Chaves Prof. Dr. Ricardo Alaggio Ribeiro ( Presidente )
Ubirajara Santana Assuno Des. Tomaz Gomes Campelo
Djane Oliveira de Brito Prof. Dr. Jos Renato de Arajo Sousa
EDIO Roberto Denes Quaresma Rgo Prof. Dr. Teresinha de Jesus Mesquita Queiroz
PROJETO GRFICO Samuel Falco Silva Prof. Francisca Maria Soares Mendes
DIAGRAMAO Samuel Falco Silva Prof. Iracildes Maria de Moura F Lima
REVISO ORTOGRFICA Maria da Penha Feitosa Prof. Dr. Joo Renr Ferreira de Carvalho
REVISO GRFICA Carmem Lcia Portela Santos

V614L Viana, Jos Ricardo Mello


Laboratrio de Programao/ FJos Ricardo Mello
Viana.--- Teresina: EDUFPI, 2010.
80 p.

1- Programao. 2 - Algoritmos. I. Ttulo

C.D.D. 001.5

2010. Universidade Federal do Piau - UFPI. Todos os direitos reservados.

A responsabilidade pelo contedo e imagens desta obra do autor. O contedo desta obra foi licenciado temporria e gratuita-
mente para utilizao no mbito do Sistema Universidade Aberta do Brasil, atravs da UFPI. O leitor se compromete a utilizar
ocontedo desta obra para aprendizado pessoal, sendo que a reproduo e distribuio ficaro limitadas ao mbito interno
dos cursos. A citao desta obra em trabalhos acadmicos e/ou profissionais poder ser feita com indicao da fonte. A cpia
deste obra sem autorizao expressa ou com intuito de lucro constitui crime contra a propriedade intelectual, com sanses
previstas no Cdigo Penal.
Nosso objetivo neste livro pr em prtica os conceitos vistos
em Algoritmos e Programao I. Durante toda o livro teremos muitos
exemplos, exerccios resolvidos e exerccios propostos com o objetivo de
estimular voc a colocar a mo na massa ao implementar os algoritmos
descritos.
Todas as atividades aqui propostas devem ser realizadas, a fim
de propiciar a voc cada vez mais confiana na resoluo de problemas
atravs de algoritmos computacionais, constituindo-se, assim, uma
disciplina de fundamental importncia na continuidade do curso de
Bacharelado em Sistemas de Informao.
Nossa primeira unidade est voltada para os conceitos iniciais,
como preparao do ambiente de programao (Eclipse + MinGW ou
GNU C) e primeiros exemplos de entrada e sada, utilizando a linguagem
de programao C. Logo em seguida, na unidade 2, iremos pr em prtica
os comandos de seleo e de repetio. Na unidade 3, revisaremos os
conceitos de vetores e matrizes, formas de declarao que nos permitem
criar vrios elementos do mesmo tipo, sequencialmente. A unidade 4
aborda o conceito de estruturas, como declar-las e a melhor forma de
utiliz-las em nossos programas. Por fim, na unidade 5, colocaremos
em prtica os conceitos de funes e procedimentos, como forma de
modularizar nosso programa e facilitar o entendimento e implementao
do mesmo.
Este material foi preparado visando abordar estes conceitos da
melhor forma possvel, sempre pensando no aluno distncia e nesta
particular forma de ensino. Procuramos colocar os exemplos de forma
bastante explicativa, a fim de que voc possa implementar os exemplos
e resolver os exerccios mesmo na ausncia de Internet para eventuais
pesquisas.
Ento, isso. Aproveite o livro para praticar bastante. Mos
obra.

Bons Estudos!
UNIDADE 1
09 PRIMEIROS PASSOS

Instalao do Compilador C................................................................. 11


Instalao do Eclipse........................................................................... 16
Primeiros passos no ambiente de programao................................. 17
Criando um projeto............................................................................. 18
Entendendo o projeto criado.............................................................. 19
Estrutura bsica de um programa C.................................................... 21
Entrada de dados................................................................................ 23
Declarao de variveis....................................................................... 26
Atribuio de valores a variveis......................................................... 27

UNIDADE 2
35 COMANDOS DE SELEO E DE REPETIO

Comandos de Seleo......................................................................... 35
Comandos de Repetio...................................................................... 52

UNIDADE 3
57 VETORES E MATRIZES

Vetores................................................................................................ 73
Strings ou Cadeias de caracteres (Vetores de char)............................78
Matrizes............................................................................................... 84
UNIDADE 4
09 ESTRUTURAS

Estruturas............................................................................................ 95
Declarao de tipos de dados estruturas............................................ 97
Vetores de Estruturas........................................................................ 101
Estruturas de Estruturas.................................................................... 104

UNIDADE 5
09 FUNES E PROCEDIMENTOS

Funes............................................................................................. 111
Criando Funes................................................................................ 112
Procedimentos.................................................................................. 114
Passagem de parmetros.................................................................. 116
Prottipo de funes......................................................................... 126
Recursividade.................................................................................... 128
UNIDADE 01
Primeiros Passos
10 UNIDADE 01
PRIMEIROS PASSOS

Primeiros passos

Antes de comearmos a programar na linguagem C, devemos


preparar o ambiente de programao que servir de apoio no
desenvolvimento de nossos aplicativos. O ambiente escolhido ser o
Eclipse (sua verso para C/C++) e o compilador de C (para Windows o
MinGW e para Linux o GNU C).
Sendo assim, nas prximas sesses sero mostradas as
instalaes e configuraes desse ambiente nessas duas plataformas
(Windows e Linux).

Instalao do Compilador C

Primeiramente, vamos aprender a como instalar o compilador


da linguagem que utilizaremos durante o curso (C). Iremos mostrar a
instalao dos compiladores para os dois ambientes, Windows e Linux,
respectivamente, nesta ordem.

Instalao do MinGW para Windows

O MinGW (Minimalist GNU for Windows) o compilador C/C++


que iremos utilizar para desenvolvermos algoritmos em C para Windows.
Podemos baixar a verso mais recente do MinGW no seguinte endereo:
http://ufpr.dl.sourceforge.net/sourceforge/mingw/MinGW-5.1.4.exe


Para instalarmos o MinGW seguiremos os seguintes passos
especificados nas telas mostradas nas figuras a seguir:

LABORATRIO DE PROGRAMAO 11
Figura 1. Tela inicial de instalao do MinGW

A Figura 1 mostra a tela inicial de instalao do MinGW. A partir
dela vamos continuar com nossa instalao, pressionando no boto
next.

Figura 2. Instalao do MinGW: Modo de download

Ao pressionar next somos redirecionados tela da Figura 2,


onde teremos que escolher se iremos baixar e instalar (Download and
install) o MinGW ou apenas baixar (Download only). Por padro, deixamos
selecionada a primeira opo e pressionamos next novamente.

Figura 3. Instalao do MinGW: licena de uso

12 UNIDADE 01
Prosseguindo, veremos a tela da Figura 3, que mostra a licena
de uso do MinGW. Para continuarmos a instalao, devemos aceitar os
termos da licena clicando em aceito (I agree).

Figura 4. Instalao do MinGW: Pacote a ser instalado

Aps aceitar a licena de uso, veremos a tela da Figura 4. Nela


devemos escolher qual verso do MinGW iremos instalar: verso prvia
(previous), corrente (current) ou candidata (candidate). Aceitaremos a
sugesto dada por padro e escolhemos a opo corrente pressionando
no boto next.

Figura 5. Instalao do MinGW:


escolha de componentes


Aps escolhermos a verso seremos redirecionados para a
tela da Figura 5, na qual devemos escolher quais componentes sero
instalados. Por padro, selecionada a opo MinGW base tools, que
instalar todo o ferramental necessrio para desenvolvermos em C.
Podemos selecion-la e continuarmos pressionando next.

LABORATRIO DE PROGRAMAO 13
Figura 6. Instalao do MinGW: Escolha da pasta

Na tela acima (Figura 6) devemos escolher a pasta onde ser
instalado o compilador. Basta escolhermos uma pasta qualquer, ou
aceitarmos a sugesto do instalador (C:\MinGW) e continuarmos
pressionando next.

Figura 7. Finalizao da instalao do MinGW

Nesta ltima tela (Figura 7) escolhemos onde ser colocado o


MinGW no menu principal do Windows. Basta escolhermos uma opo
ou aceitarmos a sugesto do instalador (MinGW) e pressionarmos Install.
Nesse momento, o instalador ir baixar da Internet os arquivos
necessrios para o correto funcionamento do MinGW. Aps baixar todos
os arquivos, o compilador ser instalado na pasta escolhida e ser
mostrada a tela a seguir (Figura 8).

14 UNIDADE 01
Figura 8. Instalao do MinGW completada

Esta tela (Figura 8) confirma que a instalao foi completada com


sucesso e que estamos aptos a utilizar nosso compilador C para a criao
de algoritmos. Ao clicarmos em next somos redirecionados para a tela
de finalizao a seguir (Figura 9).

Figura 9. Finalizao da instalao do MinGW

Instalao do GNU C para Linux

Para instalarmos o compilador GNU C em ambiente Linux, basta


executarmos o seguinte comando em um terminal:

sudo apt-get install gcc


Feito isso, o Linux se encarregar de baixar da Internet os
arquivos necessrios e instal-los em nosso computador. Ser solicitada
uma senha para a instalao do aplicativo, quando devemos informar a

LABORATRIO DE PROGRAMAO 15
mesma senha usada para efetuar login no sistema. (Em alguns ambientes
Linux o compilador C vem instalado por padro. Para verificarmos isso
basta tentar executar o comando gcc em um terminal. Se o seu Linux
reconhecer o comando e retornar um erro do tipo: no input files, significa
que voc j o possui, caso contrrio execute o comando mostrado
anteriormente).

Instalao do Eclipse

O Eclipse um Ambiente para Desenvolvimento Integrado


(Integrated Development Environment - IDE) disponvel para vrias
linguagens de programao diferentes. Em nosso caso, como estamos
utilizando C, iremos baixar a verso para esta linguagem. No site oficial
do eclipse (www.eclipse.org) podemos encontrar a verso especfica
para desenvolvimento em C/C++ no endereo a seguir:

http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/
heliosr


Nesta pgina podemos encontrar na barra lateral direita os
endereos para baixarmos verses especficas para cada sistema
operacional. Seguem os endereos especficos:

1) Windows 32 bits:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/
downloads/release/helios/R/eclipse-cpp-helios-win32.zip
2) Windows 64 bits:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/
downloads/release/helios/R/eclipse-cpp-helios-win32-x86_64.zip
3) Linux 32 bits:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/
downloads/release/helios/R/eclipse-cpp-helios-linux-gtk.tar.gz
4) Linux 64 bits:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/
downloads/release/helios/R/eclipse-cpp-helios-linux-gtk-x86_64.tar.gz

Aps baixarmos a verso especfica de nosso sistema operacional,


basta extrair o arquivo em uma pasta especfica de nosso computador. A
pasta eclipse ser criada e dentro dela estaro os executveis do eclipse
(OBS.: como feito em Java, necessrio termos o Java instalado para
podermos executar o eclipse).

16 UNIDADE 01
Feito isso, estamos com tudo pronto para comearmos a criar
nossos primeiros programas em C usando o ambiente que acabamos de
instalar.

Primeiros passos no ambiente de programao

Ao executarmos o eclipse, seremos questionados sobre a pasta


na qual ser salvo nosso workspace, como mostra a Figura 10 a seguir:

Figura 10. Seleo de workspace no Eclipse

Nessa tela (Figura 10) devemos selecionar a pasta de nossa


preferncia para o eclipse gravar nossos projetos e clicarmos no boto
ok. Aps isso, o eclipse ser carregado e a janela a seguir (Figura 11)
ser aberta:

Figura 11. Tela inicial do eclipse

LABORATRIO DE PROGRAMAO 17
Se tudo correu bem, estamos aptos a criar nosso primeiro algoritmo
em C usando o ambiente Eclipse + MinGW ou GCC.

Criando um projeto

Antes de codificarmos nossos algoritmos propriamente ditos,


devemos dar ateno forma como nossa IDE trabalha. O eclipse
organiza nosso cdigo em projetos, portanto, antes de criarmos um
arquivo fonte devemos criar e configurar um projeto no nosso ambiente
de programao. Para criar um projeto C no eclipse devemos seguir os
seguintes passos.

Figura 12. Criao de um novo projeto

Comeamos selecionando o menu File -> New -> C-Project,


atravs do qual informamos IDE qual tipo de projeto queremos criar.
Fazendo isso, a janela a seguir (Figura 13) nos ser mostrada.

Figura 13. Dados do novo projeto

18 UNIDADE 01
Nessa janela (Figura 13) vamos configurar nosso projeto.
Primeiramente, devemos dar um nome a nosso projeto, no campo Project
name. Na localizao do projeto, o eclipse j sugere uma pasta com
o mesmo nome que colocamos no projeto dentro do workspace que
escolhemos. Iremos aceitar essa sugesto de modo a organizar nossos
projetos.
Devemos selecionar tambm o tipo de projeto. Por padro, est
selecionado Empty Project, que significa projeto vazio, no entanto,
utilizaremos a opo Hello World ANSI C Project para criao do nosso
projeto. Esta opo cria um arquivo com a implementao do clssico
Hello World, que simplesmente mostra uma mensagem de ol na tela. O
campo de seleo Toolchains s possui a opo MinGW GCC, pois s
temos este compilador instalado neste caso.
Feito isso, clicamos no boto Finish e nosso primeiro projeto ser
criado. A seguinte tela (Figura 14) ser mostrada.

Figura 14. Projeto criado com sucesso

Entendendo o projeto criado

Ao criarmos o projeto, o seguinte arquivo foi criado e aberto


automaticamente para edio no eclipse (Figura 15):

LABORATRIO DE PROGRAMAO 19
Figura 15. Arquivo criado automaticamente pelo eclipse


Neste arquivo so usados os comandos bsicos de C para
implementar um algoritmo que escreva a mensagem !!!Hello World!!! na
tela. Detalhando cada linha, temos o contedo a seguir:

Linhas 1 a 9: Comentrio de vrias linhas (Aberto com /* e fechado com


*/);
Linhas 11 e 12 #include<stdlib.h> e #include<stdio.h>: Incluso das
bibliotecas stdio e stdlib, bibliotecas bsicas para entrada e sada de
dados em C (utilizao das funes printf e scanf principalmente);
Linha 14 int main(void) {: Declarao da funo principal e abertura do
bloco de comandos correspondentes;
Linha 15 puts(!!!Hello World!!!);: Funo para sada de dados (puts
tem a mesma funo que printf) seguida de um comentrio;
Linha 16 return EXIT_SUCCESS;: Retorno da funo principal (EXIT_
SUCCESS corresponde constante 0);
Linha 17 }: Corresponde ao fechamento do bloco de comandos da
funo principal (finalizao do nosso algoritmo).


Para que possamos executar nosso programa, primeiro
necessrio compil-lo, ou seja, gerar o executvel correspondente ao
cdigo fonte digitado. Via eclipse podemos fazer isso de duas maneiras:
clicando no menu Project e selecionando a opo Build All ou atravs
do atalho de teclado Ctrl+B. Depois de compilado podemos executar
nosso programa atravs do boto da barra de ferramentas destacado na
figura a seguir (Figura 16).

20 UNIDADE 01
Figura 16. Executar projeto no eclipse

Feito isso, o resultado da execuo ser mostrado na parte de baixo


da IDE, na aba console (aberta automaticamente quando da execuo
de nosso algoritmo). Podemos verificar o resultado da execuo deste
exemplo na figura a seguir (Figura 17):

Figura 17. Execuo do projeto



Como era de se esperar, nosso programa escreve, no console, a
mensagem: !!!Hello World!!! e no acontecem erros.

Estrutura bsica de um programa C

Neste momento, passaremos a nos focar nos algoritmos e sua


implementao em C, utilizando a ferramenta exposta (eclipse) para
desenvolv-los. A partir do projeto criado anteriormente, apagaremos o
contedo do arquivo mostrado na Figura 15 e, em seu lugar, digitaremos
o seguinte contedo:

Figura 18. Primeiro exemplo: Ol mundo

LABORATRIO DE PROGRAMAO 21
A rigor, este exemplo bem parecido com o que foi mostrado
anteriormente. No entanto, est mais condizente com o que vimos em
nossa disciplina anterior de Algoritmos e Programao I. A explicao,
linha por linha, deste cdigo est logo abaixo. Temos apenas um comando
de sada de dados. Vejam que bastante semelhante ao exemplo anterior.

Linha 1 //Primeiro programa em C: Comentrio de uma linha (a partir


do // at o fim da linha);
Linhas 2 e 3 #include<stdlib.h> e #include<stdio.h>: Incluso de
bibliotecas stdlib e stdio para operaes de entrada e sada;
Linha 5 int main(void) {: Declarao da funo main e abertura do
programa;
Linha 6 printf(Ola mundo);: Funo printf, responsvel por escrever a
mensagem Ol mundo na tela;
Linha 7 return 0;: Retorno da funo principal (0);
Linha 8 }: Fechamento do corpo da funo principal (finalizao do
programa).

Lembra disso?

A funo printf, usada nesse exemplo, serve como interface com


o mundo externo. atravs dela que damos sada aos dados em nossos
programas. Ela possui a seguinte sintaxe: printf (texto a ser escrito,
varivel <ou variveis> para preenchimento).
Podemos passar cdigos como parmetros para o texto esta
funo, que sero substitudas pelas variveis ou valores passados como
parmetro logo em seguida. Por exemplo:

Cdigo Tipo de varivel


%d Inteiro (int)
%f Real (float)
%c Caractere (char)
%s Cadeia de caracteres (char[])
Tabela 1. Cdigos para a funo printf


possvel, ainda, passar parmetros capazes de imprimir
caracteres especiais, necessrios, especialmente, para formatarmos a

22 UNIDADE 01
sada do nosso programa. Por exemplo: \n (quebra de linha), \t (tabulao),
\\ (escreve a barra), entre outros.

1. Faa um programa que escreva seu nome.


2. Faa um programa que desenhe um corao usando o caractere *
para fazer o contorno.
3. Faa um programa que escreva suas notas em linhas diferentes com
exatamente uma casa decimal. Use a formatao %.1f para substituir
pelos valores e, a partir disso, explique como esse marcador funciona.
4. (Resolvido) Faa um programa que escreva seu nome e sobrenomes,
cada um em uma linha.

Execuo:

Entrada de dados

Da mesma forma que precisamos dar algum tipo de retorno para


que o usurio saiba o que est acontecendo em nosso programa (funo
printf), muitas vezes precisamos que o usurio interaja com o programa
informando dados para que sejam usados nos clculos que o programa

LABORATRIO DE PROGRAMAO 23
ir executar. Para isso, usaremos a funo scanf, que possui sintaxe
bem parecida com o printf e serve para lermos um valor do teclado e
armazenarmos em uma varivel.

scanf (modo de leitura, endereo da varivel <ou variveis>)

Para informar o modo de leitura das variveis usamos os mesmos


cdigos j vistos para o printf. Para informar o endereo da varivel, no
devemos nos esquecer de colocar o caractere & antes do nome cada
uma das variveis. ele quem diz ao compilador que quero passar o
endereo de memria da varivel, e no o valor da varivel. Vejamos o
exemplo a seguir (Figura 19):

Figura 19. Exemplo de scanf


A seguir a explicao, linha por linha, deste exemplo:

Linha 1 //Leitura de valores com scanf: Comentrio sobre o programa;


Linhas 2 e 3 #include<stdlib.h> e #include<stdio.h>: Incluso de
bibliotecas de entrada e sada;
Linha 5 int main(void) {: Declarao da funo principal e abertura do
bloco do programa;
Linha 6 int idade;: Declarao de uma varivel (explicao logo a
seguir);
Linha 7 printf(Qual a sua idade? );: Sada de uma mensagem para o
usurio;

24 UNIDADE 01
Linha 8 fflush(stdout);: Comando que manda escrever imediatamente
na tela;
Linha 9 scanf(%d, &idade);: Leitura de um valor inteiro (%d) do
teclado e armazenamento em idade;
Linha 10 printf(Sua idade %d, idade);: Escrita de uma mensagem
de retorno com o valor da varivel lida;
Linha 11 return 0;: Retorno da funo principal;
Linha 12 }: Fechamento do corpo da funo principal.

Podemos verificar a sada deste programa na Figura 20 a seguir:

Figura 20. Resultado da execuo



OBS.: Neste momento, cabe uma observao importante. Na
linha 8 tivemos que usar um comando novo (fflush(stdout)), que faz
com que a sada anterior seja escrita imediatamente. S foi necessrio
usar esse comando devido a um problema com a janela de console do
eclipse para ambiente Windows que no mostra todas as sadas at que
as entradas sejam lidas. Vejam, na Figura 21, como seria a execuo do
programa sem o comando fflush:

Figura 21. Execuo do programa sem fflush

LABORATRIO DE PROGRAMAO 25
Vale ressaltar que este problema s ocorre no console do eclipse
para Windows, portanto, se estivermos executando nossos exemplos
em ambiente Linux ou em outros terminais que no o do eclipse para
Windows, este comando se faz desnecessrio. Portanto, se quisermos
usar o console do eclipse para Windows devemos sempre colocar o
comando fflush(stdout) aps os comandos de escrita (printf) em nossos
programas.

Declarao de variveis


Muitas vezes necessrio armazenar algum valor durante a
execuo de nossos programas. Valores esses que, possivelmente, sero
usados mais frente em algum clculo. Para isso, usamos o conceito
de variveis: uma varivel uma posio da memria do computador
onde podemos armazenar um valor para utilizao no nosso programa.
Para usarmos uma varivel, primeiramente precisamos declar-la, ou
seja, informar ao computador que aquela varivel existe. O formato de
declarao de variveis em C :

tipo_da_varivel nome_da_varivel; ou
tipo_da_varivel nome_varivel_1, nome_varivel_2, ..., nome_varivel_n;

Podemos declarar apenas uma varivel por declarao ou


aproveitar o tipo que estamos utilizando para declarar, ao mesmo tempo,
vrias variveis pertencentes a esse tipo. Ao especificarmos o tipo de
uma varivel estamos selecionando o conjunto de valores que esta
varivel pode assumir, as operaes que podem ser efetuadas com ela
e, ainda, o formato de representao para a varivel.
Vale lembrar que, diferente de outras linguagens, bool no existe
por padro na linguagem C como tipo bsico. Para utilizarmos esse tipo
devemos incluir a biblioteca stdbool.h atravs da chamada:
#include<stdbool.h>

Restries para nomes

Para especificao de nomes de variveis devemos seguir


algumas restries, tais como:
a) No se deve iniciar com nmero. Ex: 1var (invlida);

26 UNIDADE 01
b) No se devem utilizar caracteres especiais. Ex: var*, var#, mdia
(invlidas);
c) No se pode colocar espao ou hfen. Ex: valor total, valor total
(invlidas);
i. Utilize, nesses casos, underline. Ex: valor_total
d) Procure utilizar nomes que lembrem o significado da varivel.
Ex: para uma varivel que ir armazenar a mdia: float media.

importante destacarmos, ainda, que a linguagem C case


sensitive (sensvel ao caso). Ou melhor, h diferena entre maisculas e
minsculas. Sendo assim, a varivel total diferente da varivel TOTAL
para a linguagem C.

Atribuio de valores a variveis

Para atribuirmos um valor a uma varivel utilizamos o operador =.


Dessa forma, podemos armazenar um valor em uma varivel previamente
declarada. possvel, ainda, atribuir um valor a uma varivel no momento
de sua declarao.
Para usar o valor que foi atribudo a uma varivel basta utilizarmos
o prprio nome da varivel nos clculos posteriores. Vejamos o exemplo
a seguir (Figura 22):

Figura 22. Exemplo de declarao e utilizao de variveis

Neste exemplo utilizamos os conceitos mostrados anteriormente


de declarao de variveis, atribuio de valores a variveis e, ainda,
atribuio de um valor a uma varivel no momento da declarao da

LABORATRIO DE PROGRAMAO 27
mesma. Vejamos a explicao desse cdigo linha por linha:

Linha 1 //Declarao de variveis e atribuio de valor: Comentrio


sobre o programa;
Linhas 2 e 3 #include<stdio.h> e #include<stdlib.h>: Incluso de
bibliotecas para entrada e sada;
Linha 5 int main(void) {: Declarao da funo main e abertura do
corpo da mesma;
Linha 6 int a, b;: Declarao de duas variveis do tipo inteiro (int);
Linhas 7 e 8 a = 10; e b = 18;: Atribuio de valores s variveis a e b
(valores devem ser inteiros);
Linha 9 int soma = a + b;: Declarao de uma nova varivel e atribuio
do resultado da soma de a e b;
Linha 10 printf(Soma de %d + %d %d, a, b, soma);: Escrita da sada
do programa (Soma de 10 + 18 28);
Linha 11 return 0;: Retorno da funo principal;
Linha 12 }: Fechamento do corpo da funo principal.

O resultado da execuo deste programa pode ser visto na Figura
23, a seguir:

Figura 23.A Resultado da execuo

Expresses

Podemos criar expresses aritmticas relacionais e lgicas usando


os respectivos operadores que a linguagem disponibiliza. Vejamos alguns
deles:

28 UNIDADE 01
Operador Significado
+ Soma
- Subtrao
* Multiplicao
/ Diviso (inteira ou real)
% Resto da diviso inteira
Tabela 3. Operadores aritmticos

Operador Smbolo
Igual =
Maior >
Menor <
Maior ou Igual >=
Menor ou Igual <=
Diferente |=
Tabela 4. Operadores relacionais

Operador Smbolo
Conjuno - E &&
Disjuno - OU II
Negao - NO !
Tabela 5. Operadores lgicos

1. Faa um programa que leia um nmero nome e escreva a mensagem


O nmero digitado foi seguido do nmero recebido: Ex: entrada: 10;
sada: O nmero digitado foi 10.
2. (Resolvido) Faa um programa que receba dois nmeros, calcule e
imprima o resultado da diviso inteira e o resto da diviso inteira entre
eles.

LABORATRIO DE PROGRAMAO 29
Execuo:

3. Faa um programa que crie trs variveis para receber as trs notas
de um aluno e calcule e imprima a mdia desse aluno.
4. Faa um programa que receba sua idade e escreva sua idade daqui a
10 anos.
5. Faa um programa que calcule o resultado da expresso: (537 - 285)
* 10 + (3 * (72 - 17)).
6. Faa um programa que receba um nmero inteiro e calcule o resto da
diviso por 2.
7. Faa um programa que receba o nome e o sobrenome de uma pessoa
e imprima o nome completo em uma linha.
8. Faa um programa que receba um nmero e exiba seu sucessor e
antecessor.
9. Faa um programa que calcule a quantidade de dinheiro gasto por um
fumante dados: a quantidade de anos que ele fuma, o preo da carteira
e o nmero de cigarros por dia.
10. Faa um programa que calcule a rea e o volume do cilindro.
11. Faa um programa que resolva uma equao do primeiro grau (ax +
b = 0).
12. Faa um programa que receba uma temperatura em Celcius e imprima

30 UNIDADE 01
a correspondente converso para Farenheit e Kelvin.
13. Sabendo que lato composto por 70% de cobre e 30% de zinco,
faa um programa que calcule a quantidade de cobre e zinco para uma
determinada quantidade de lato informada pelo usurio.
14. Faa um programa que imprima uma caixa, uma oval, uma seta e um
losango usando asteriscos da seguinte forma:

Nessa unidade preparamos, primeiramente, nosso ambiente de


programao. Vimos como instalar nossa IDE, o Eclipse, e como preparar
o compilador para executar nossos primeiros exemplos na linguagem de
programao C. Percebendo a diversidade de alunos e de polos que
amos encontrar, essa unidade disps de instrues para preparao do
ambiente tanto para o sistema operacional Windows como para o sistema
operacional Linux. Revimos tambm exemplos simples de C para praticar
os comandos de entrada e sada, printf e scanf.

LABORATRIO DE PROGRAMAO 31
UNIDADE 02
Comandos de Seleo
e de Repetio
comandos de seleo
e de repetio

Normalmente, instrues em um programa so executadas uma


aps a outra, na ordem em que so escritas. Isso chamado de execuo
sequencial. No entanto, frequentemente precisamos quebrar essa
sequncia, seja por querer executar o mesmo comando (ou bloco de
comandos) mais de uma vez ou por querer executar determinado conjunto
de comandos somente se uma condio especfica for verdadeira.
Em vista disso, existem as estruturas de controle, que podem
ser os comandos de seleo ou de repetio (loops). Eles servem para
alterarmos o fluxo normal de execuo de nossos algoritmos e, assim,
conseguirmos o objetivo. Nesta unidade veremos esses dois tipos de
comando, comeando pelos comandos de seleo e continuando com os
comandos de repetio na linguagem de programao C.

Comandos de Seleo

Quando estamos desenvolvendo a lgica de nossos algoritmos,


frequentemente precisamos realizar algum tipo de teste e, a partir desse
resultado, executar um bloco de comandos ou no. Com este fim, temos
os comandos de seleo, que podem ser divididos em comandos de
seleo simples ou de seleo mltipla.
Os comandos de seleo que C possui so: if (seleo simples),
if-else e switch (seleo mltipla).

Comando de seleo if

Usamos o comando if quando queremos testar uma condio


e executar uma parte do cdigo somente se ela for verdadeira. Este

LABORATRIO DE PROGRAMAO 35
comando possui a seguinte sintaxe:

if (condio) comandos;

lembrando que a declarao comandos pode ser um comando


simples ou um comando composto. Se for um comando composto (mais
de uma linha) devemos colocar delimitadores ({ e }) para indicar que
mais de um comando deve ser englobado pelo if. Se for um comando
simples, no h necessidade. Exemplificaremos isso logo abaixo (Figura
23.B):

Figura 23 B. Exemplo de if

Veja a explicao linha por linha da aplicao da Figura 23.B:

Linha 1 //Teste de maioridade: Comentrio sobre a funcionalidade do


programa;
Linhas 2 e 3 #include<stdlib.h> e #include<stdio.h>: Incluso das
bibliotecas necessrias para a utilizao das funes de entrada e sada;
Linha 5 int main(void) {: Declarao da funo principal e abertura do
programa;
Linha 6 printf(Digite sua idade: );: Escrita de mensagem para o
usurio;
Linha 7 fflush(stdout);: Fora a escrita imediata da mensagem anterior;
Linha 8 int idade;: Declarao da varivel que ir receber o valor da
idade;
Linha 9 scanf(%d, &idade);: Leitura do valor de idade a partir do
teclado;
Linha 10 if (idade >= 18): Comando de seleo usando a comparao
da varivel idade com o valor 18;

36 UNIDADE 02
Linha 11 printf(Voc maior de idade. Tem %d anos., idade);: Escrita
de mensagem. Esse comando s ser executado se o valor de idade for
maior que 18;
Linha 12 return 0: Valor de retorno da funo principal (main);
Linha 13 }: Fechamento do programa.

Percebam que, nesse exemplo, usamos um dos operadores


relacionais mostrados no captulo 1. Dessa forma, o resultado da
avaliao dessa expresso s pode ser verdadeiro ou falso, que so
os valores que o comando if ir avaliar. Se o resultado da expresso for
verdadeiro ele entra nos comandos do if e executa o printf da linha 11.
Se o resultado da comparao idade >= 18 for falsa, ento ele pular
para o prximo comando, logo aps o if, na linha 12.
Nas figuras a seguir (Figura 24 e Figura 25) vemos o resultado da
execuo desse programa para cada um dos casos: idade >= 18 e idade
< 18.

Figura 24. Resultado da execuo com idade = 24

Figura 25. Resultado da execuo com idade = 15


Vejamos agora outro exemplo usando um comando composto


dentro do if para percebermos a diferena:

LABORATRIO DE PROGRAMAO 37
Figura 26 A. Segundo exemplo de if

Nesse caso, temos duas linhas de cdigo a serem executadas


se a condio idade > 18 for satisfeita. Com isso necessrio que
coloquemos os delimitadores { (abre-chaves) e } (fecha-chaves), pois
assim o programa ir reconhecer que os dois comandos esto englobados
pela estrutura de seleo if. As figuras abaixo (Figura 26.B e Figura 27)
mostram o resultado da execuo desse programa para idade = 24 e
idade = 13.
OBS.: A partir desse exemplo no mostraremos mais a explicao
linha por linha. Isto por considerar que voc j detm o conhecimento
da estrutura bsica dos programas em C, as quais sempre vinham
sendo explicadas em todos os exemplos. Quaisquer dvidas com essa
estrutura, volte aos exemplos anteriores e verifique a explicao. De
agora em diante sero explicadas apenas as linhas com contedo novo.

Figura 26 B. Resultado da execuo com idade = 24

38 UNIDADE 02
Figura 27. Resultado da execuo com idade = 13

Neste terceiro exemplo o programa pedir ao usurio para entrar


com a mdia de um aluno qualquer e, dependendo do valor da mdia ir
mostrar a mensagem Aprovado, se a mdia for maior ou igual a 7, Prova
final, se a mdia for maior ou igual a 4 e menor que 7 e Reprovado, se
a mdia for menor que 4.

Figura 28. Terceiro exemplo de if

Aqui, como tnhamos trs casos diferentes de mdia para testar,


fizemos trs if, uma para cada caso. Percebam que na linha 13 usamos o
operador booleano E (&&) para unir duas condies (media < 7 && media
>= 4). A construo 4 <= media < 7, apesar de correta matematicamente,
no est correta em nossa linguagem de programao. O modo correto
de expressar como na Figura 28.
Outro ponto a ser ressaltado nesse exemplo que podemos usar
no if, mesmo que o comando correspondente no seja composto, os

LABORATRIO DE PROGRAMAO 39
delimitadores { e }. Isso melhora a legibilidade do cdigo. Abaixo temos
o resultado da execuo desse programa para os trs casos possveis:

Figura 29. Resultado da execuo para 4 <= media < 7

Figura 30. Resultado da execuo para media < 4

Figura 31. Resultado da execuo para media > 7

1. (Resolvido) Faa um programa que leia trs valores do teclado e


verifique se o primeiro maior que a soma dos outros dois.

40 UNIDADE 02
Execuo:

2. Faa um programa que leia um nome e informe se ele igual ao seu


dia de nascimento. Imprimir NMERO CORRETO se for igual e imprimir
NMERO INCORRETO, caso contrrio.
3. Faa um programa que receba as 3 notas de um aluno e calcule a
mdia final, mostrando ainda o resultado, seguindo a seguinte regra: se
a mdia for maior ou igual a 7, APROVADO; se a mdia for maior ou
igual a 4 e menor que 7, PROVA FINAL; se a mdia for menor que 4,
REPROVADO.
4. Faa um programa que leia a velocidade mxima permitida em
uma avenida e a velocidade que um motorista estava dirigindo nela e
calcule a multa que ele ter que pagar, sabendo que so pagos: R$50
se o motorista ultrapassar at 10km/h a velocidade permitida (ex: se a
velocidade mxima permitida for 50km/h e ele estiver a 53 ou 60km/h);
R$100 se o motorista ultrapassar de 11 a 30hm/h a velocidade permitida;
e R$ 200 se ele estiver acima de 30km/h da velocidade permitida.
5. Faa um programa que leia dois valores reais (float) do teclado e
calcule a diviso entre eles. Se o segundo for zero imprima (DIVISO
POR ZERO)

LABORATRIO DE PROGRAMAO 41
6. Faa um programa que receba trs nmeros e imprima o menor deles.
7. Faa um programa que receba dois nmeros e os imprima em ordem
crescente.
8. Faa um programa que leia um nmero e verifique se ele par ou
mpar.
9. Faa um programa que leia quatro nmeros e imprima a soma dos que
forem par.
10. Faa um programa que receba um ano e verifique se ele bissexto.
Um ano bissexto se for divisvel por quatrocentos ou se ele for divisvel
por quatro mas no por cem.

Comando de seleo dupla if-else

Em nosso terceiro exemplo de if vimos que testamos vrias


condies para a mesma varivel, onde uma condio exclua a outra.
Seria interessante usar um comando em que pudssemos executar algo
no somente para o valor verdadeiro de uma condio, mas tambm
para o valor falso. Este o objetivo do comando if-else, em que a parte
do if funciona igual vimos anteriormente, mas, colocaremos um novo
comando, o else, que indicar ao programa o que fazer se a condio
testada no if for falsa. A sintaxe do comando a seguinte:

if (condio) comandos_1; else comandos_2;

Da mesma forma que no if, os comandos podem ser simples ou


compostos e usaremos delimitadores para separ-los. Vamos refazer o
exemplo anterior usando, agora, esta estrutura (Figura 32).

Figura 32. Exemplo de if-else

42 UNIDADE 02
Podemos perceber que o algoritmo ficou mais simples e
representativo. O primeiro teste ficou igual, apenas verificando se a
mdia maior ou igual a sete. Se for, apenas escreve Aprovado e a
execuo do programa passa para a prxima linha depois da estrutura
if-else que corresponde linha 19.
Se esta condio no for verdadeira, ou seja, se a mdia for menor
do que sete, o programa entra no bloco do else e ir verificar se a mdia
maior ou igual a quatro. Se for escreve Prova final e passa para a
instruo logo aps o if-else interno, linha 18. Se essa condio no for
verdadeira, a execuo ir entrar no else do if-else interno, ir mostrar
Reprovado e continuar a execuo tambm logo aps o if-else interno,
na linha 18.
As figuras a seguir mostram o resultado da execuo desse
programa para cada um dos trs casos analisados:

Figura 33. Resultado da execuo para mdia > 7

Figura 34. Resultado da execuo para mdia < 4

Figura 35. Resultado da execuo para 4 <= mdia < 7

LABORATRIO DE PROGRAMAO 43
Esse nosso teste teve apenas trs casos diferentes, mas no caso
de existirem mais condies a serem testadas, nosso cdigo tende a ficar
cada vez mais bagunado. Vejamos o exemplo a seguir:

Figura 36. Vrios if-else aninhados

Colocar vrias estruturas de controle uma dentro da outra se


chama aninhar os comandos. Para evitar esta forma de escrita e
melhorar a legibilidade de nosso cdigo, a linguagem C nos propicia a
forma de escrita compacta de clusulas else juntamente com a prxima
clusula if, como demonstrado na Figura 37.

Figura 37. if-else-if compacto

44 UNIDADE 02
Assim, as diferenas desse exemplo para o anterior so nas
linhas 12, 14 e 16, onde juntamos a clusula else com o prximo if,
dando ao nosso cdigo mais expressividade e legibilidade. Nota-se ainda
que, usando essa estrutura, necessrio finalizarmos com uma ltima
clusula else (sem if), que casar quando todas as condies anteriores
forem falsas, assim como est exemplificado na linha 18.
Se alguma das condies for verdadeira, ser executado o bloco
de comandos correspondente quela clusula e depois o controle ser
passado para fora de toda a estrutura if-else-if, na linha 21. Por exemplo,
se as condies das linhas 10 e 12 forem falsas e a da linha 14 for
verdadeira, ser executado o comando prinft da linha 15 e o prximo
comando a ser executado ser o da linha 21. O resultado dessa execuo
est na Figura 38.

Figura 38. Exemplo de execuo do exemplo de if-else-if

1. Faa um programa que leia os trs coeficientes de uma equao e


imprima as solues, quando existirem. Lembrando que a existncia
das solues depende de delta: a) Se delta for menos que zero no h
solues reais (imprima a mensagem NO H SOLUES REAIS);
b) Se delta for igual a zero existe apenas uma soluo real (imprima a
mensagem EXISTE UMA SOLUO REAL, x = valor); c) Se delta for
maior do que zero, temos duas solues reais (imprima a mensagem
EXISTEM DUAS SOLUES REAIS, x1 = valor_1 e x2 = valor_2).
2. Faa um programa que receba um ms do ano (em formato numrico)
e imprima a quantidade de dias que ele possui (considere fevereiro
contendo 28 dias).
3. (Resolvido) Faa um programa que receba trs valores e imprima a
soma dos dois maiores.

LABORATRIO DE PROGRAMAO 45
Execuo:

4. Faa um programa que leia o nmero de lados de um polgono regular,


e a medida do lado. Calcular e imprimir o seguinte:
a. Se o nmero de lados for igual a trs, escrever TRIGULO e o
valor do seu permetro.
b. Se o nmero de lados for igual a quatro, escrever QUADRADO e
o valor da sua rea.
c. Se o nmero de lados for igual a cinco escrever PENTGONO.
5. Em qualquer outra situao escrever Polgono no identificado.
6. Faa um programa que leia trs valores e verifique se formam um
tringulo (o valor de cada lado tem que ser a soma dos outros dois). Caso
positivo, classifique esse tringulo como tringulo equiltero (possui os
trs lados iguais), tringulo issceles (possui dois lados iguais) e tringulo
escaleno (possui trs lados diferentes).
7. Faa um programa que leia o valor de trs ngulos de um tringulo e
escreva se o tringulo acutngulo (Possui 3 ngulos agudos menores
que 90 graus), retngulo (Possui um ngulo reto 90 graus), obtusngulo

46 UNIDADE 02
(possui um ngulo obtuso maior que 90 graus).
8. Faa um programa que leia um nmero e imprima se ele par ou
mpar.
9. Utilize a estrutura if para fazer um programa que retorne o nome
de um produto a partir do cdigo do mesmo. Considere os seguintes
cdigos:
a. 001: Parafuso;
b. 002: Porca;
c. 003: Prego;
d. Para qualquer outro cdigo indicar: diversos!

10. Escreva um algoritmo que solicita ao usurio para digitar um nmero


inteiro positivo, e mostre-o por extenso. Este nmero dever variar entre
1 e 10. Se o usurio introduzir um nmero que no pertena a este
intervalo, mostre a frase nmero invlido.
11. Faa um programa que leia dois nmeros (x e y) e verifique se o
primeiro divisvel pelo segundo. Se o primeiro for divisvel pelo
segundo, imprima: x divisvel por y. Se o primeiro no for divisvel
pelo segundo, imprima: x no divisvel por y.

O comando switch

Em nosso ltimo exemplo de if-else-if, pudemos verificar a


existncia de vrias condies consecutivas testando a mesma varivel.
Em casos como esses, o comando switch mais recomendvel, pois,
sendo um comando de seleo mltipla, d mais expressividade e
legibilidade para estruturas onde testamos inmeros casos para a mesma
varivel. Temos, a seguir, a sintaxe para este comando:

switch (varivel) {
case contante_1: comandos_1;
break;
case contante_2: comandos_2;
break;
...
default: comandos_default;
break;
}

LABORATRIO DE PROGRAMAO 47
Com este comando, passamos a varivel que queremos testar e,
dependendo do seu valor, o programa ir executar um caso diferente.
Apesar do poder dessa estrutura, temos algumas limitaes, como, por
exemplo: no se podem passar expresses para serem testadas, apenas
variveis simples. Os tipos de variveis que podem ser testadas so
somente int e char, no sendo possvel passar float, double ou string, por
exemplo.
Cada caso indicado pela palavra-chave case, seguida do valor
de teste e de dois pontos (:). Aps os dois pontos sero colocados os
comandos correspondentes a cada caso. Ao final dessa sequncia de
comandos, necessrio que coloquemos o comando break, pois ele
quebrar a execuo e redirecionar o fluxo para fora do switch. Sendo
assim, o break que informa at onde vo os comandos de cada opo,
no sendo necessrios delimitadores para cada caso (apenas para o
prprio comando switch).
Ao final de todos os casos, podemos especificar um caso default,
que funcionar da mesma forma que um else em uma sequncia de
if-else-if. Ou seja, se nenhum dos casos da estrutura switch for casar
com o valor da varivel de entrada, o programa entrar no caso default
e executar as instrues ali especificadas. Para esse caso, no
necessrio colocarmos o comando break finalizando o mesmo, visto que
ele ser sempre o ltimo caso, no entanto, para melhorar a legibilidade de
nossos programas, o ideal no nos esquecermos de coloc-lo, mesmo
nesse caso.
Vejamos o exemplo (Figura 39) para entendermos o funcionamento
desta estrutura:

Figura 39. Exemplo de switch

48 UNIDADE 02
Nesse exemplo pedimos para o usurio entrar com um nmero
identificando o tipo de veculo. Tipo 1 corresponde a carro de passeio
(linha 12), nesse caso o pedgio ser de R$ 0,50 (linha 13). O tipo 2
corresponde a nibus (linha 15), para eles o pedgio ser de R$ 1,00
(linha 16). No ltimo caso, tipo 3, temos caminho (linha 18), com
pedgio de R$ 2,00 (linha 19). Se nenhum desses valores for recebido, o
sistema retornar a mensagem veculo desconhecido (linha 21).
Ao final, linha 24, imprimimos a mensagem valor do seu pedgio:
R$ e o valor selecionado logo em seguida. Atentem para a formatao
do valor para sada na linha 24 (%.2f), nesse caso estamos indicando
que ser impresso um valor real (f) com duas casas decimais (.2). Abaixo
temos as sadas do programa para cada uma das opes escolhidas
(Figura 40, 41, 42 e 43).

Figura 40. Resultado da execuo para tipo de veculo 1

Figura 41. Resultado da execuo para tipo de veculo 2

Figura 42. Resultado da execuo para tipo de veculo 3

LABORATRIO DE PROGRAMAO 49
Figura 43. Resultado da execuo para tipo de veculo 8

Podemos ter ainda 2 (ou mais) case para a mesma seo de


cdigo. Para isto, basta no colocarmos o comando break entre as
opes como no exemplo a seguir:

Figura 44. Exemplo de 2 cases para o mesmo conjunto de comandos

Dessa forma, se a opo escolhida pelo usurio for a letra a


minscula ou a letra A maiscula, os comandos executados so o
mesmo, ou seja, mostrar a mensagem Voc escolheu a letra A, para o
usurio.

1. Faa um programa que exiba um menu ao usurio com as seguintes


opes: 1-Incluso, 2-Excluso, 3-Sair. Ao usurio selecionar uma
opo o programa dever mostrar um texto correspondendo opo
selecionada. Mostre opo invlida, caso seja diferente de 1, 2 ou 3.

2. (Resolvido) Faa um programa que receba o valor inteiro e retorne o


ms do ano equivalente (1 = janeiro, 2 = fevereiro, 3 = maro, ..., 12 =
dezembro). Se o valor recebido for maior que 12 ou menor que 1 dever

50 UNIDADE 02
imprimir ms invlido.

Execuo:

3. Faa um programa que receba dois valores e exiba um menu para o


usurio escolher uma das quatro operaes aritmticas. Baseado nessa
escolha o programa dever calcular e imprimir o resultado.
4. Faa um programa que leia um nmero e o escreva por extenso se
estiver no intervalo de 0 a 20. Caso contrrio, escreva nmero invlido.
5. Faa um programa que receba a letra inicial do estado civil de
uma pessoa e imprima a descrio: Casado(a), Solteiro(a), Vivo(a),
desquitado(a), Divorciado(a), Invlido.
6. Faa um programa que leia o preo e a categoria de um produto. O
programa deve calcular e mostrar o reajuste de acordo com a categoria:
A = 50%, B = 25%, C = 15% e outros = 5%.
7. Faa um programa que leia uma letra do alfabeto e imprima das
mensagens a seguir a correspondente para cada caso: Vogal maiscula,
Vogal minscula, Consoante.
8. Faa um programa que leia a categoria da carteira de motorista do
usurio e imprima os tipos de veculos que ele pode dirigir.

LABORATRIO DE PROGRAMAO 51
9. Utilize a estrutura switch para fazer um programa que retorne o nome
de um produto a partir do seu cdigo. Considere os seguintes cdigos:
a. 001: Parafuso;
b. 002: Porca;
c. 003: Prego;
d. Para qualquer outro cdigo indicar: diversos!
10. Faa um programa que receba um cdigo equivalente s 27 unidades
federativas brasileiras e imprima o nome e a capital correspondente.
Receba nmeros de 1 a 27, considerando os estados organizados em
ordem alfabtica.

Comandos de Repetio

Em nossos programas, frequentemente necessitamos que uma


parte do nosso cdigo seja repetida uma determinada quantidade
de vezes. Para isso, a linguagem de programao C disponibiliza
trs operadores de repetio, so eles: for, while e do-while. A seguir,
detalharemos cada um deles.

O comando for

O primeiro comando de repetio a ser apresentado ser o for.


Especialmente adequado quando conhecemos a quantidade de iteraes
que nosso bloco de comandos ter, o comando for necessita de trs
parmetros: a inicializao, a condio para continuidade e o incremento.
A sintaxe desse comando a seguinte:

for (inicializao; condio; incremento) comando;

O primeiro parmetro indica o incio da contagem. Atravs dele


atribumos o valor inicial da varivel que controlar o lao. O segundo
parmetro representa a condio de continuidade, ou melhor, a condio
que far o lao continuar a repetir. Sendo assim, enquanto essa condio
for verdadeira a repetio ir continuar. Por ltimo, temos o incremento.
Esse parmetro indicar a variao da varivel de controle em cada
passo da repetio.
Sendo assim, a estrutura for ir inicializar a varivel de contagem
e executar o comando (simples ou composto) passado para ele. A cada
passo ir executar o incremento e testar novamente a condio para
continuar ou no a repetio antes de executar novamente o comando.

52 UNIDADE 02
Quando a condio for falsa, a repetio terminar e o programa passar
para a prxima instruo, logo aps o for. Veremos o funcionamento na
prtica no exemplo a seguir (Figura 45):

Figura 45. Utilizao do for

Nesse exemplo temos, na linha 7, um comando for. Na linha


anterior (linha 6) declaramos uma varivel inteira i que vai controlar a
quantidade de iteraes do loop. Na declarao do for inicializamos o
contador com valor 1 (i = 1). Como condio de parada temos a condio
i <= 10, dessa forma, a repetio continuar enquanto o valor de i no
ultrapassar o valor 10. Por ltimo temos o incremento (i++), que significa
que a varivel i aumentar de 1 em 1 a cada iterao (o operador i++
equivale a i+=1 que, por sua vez, equivale a i = i + 1).
Assim, o comando da linha 8 ser repetido 10 vezes. Dessa
forma, a cada passo, o comando printf escrever o valor da varivel i
seguido de um espao em branco. Com isso, a sada desse programa
a seguinte (Figura 46):

Figura 46. Resultado da execuo

A seguir (Figura 47) temos outro exemplo de utilizao do comando


for. Nesse caso, queremos imprimir os nmeros mpares de 1 a 50. Como
os nmeros mpares variam de 2 em 2, usamos outro comando para

LABORATRIO DE PROGRAMAO 53
incremento. Vejamos o exemplo:

Figura 47. Imprimir os nmeros mpares de 1 a 50



Nesse exemplo a nica diferena est no parmetro de incremento.
Aqui usamos i += 2, que indica que, a cada passo, o valor da varivel i
mudar de 2 em 2, pois o que necessitamos para imprimir os nmeros
mpares. O resultado da execuo deste programa est na Figura 48, a
seguir:

Figura 48. Resultado da execuo: impresso dos


nmeros mpares de 1 a 50

1. Faa um programa que escreva os nmeros pares de 25 a 318.


2. Faa um programa que calcule a soma dos 100 primeiros nmeros
naturais.
3. Faa um programa que imprima os mltiplos de 9 menores que 300.
4. Faa um programa que calcule e imprima os nmeros divisveis por 3
entre 10 e 450.
5. (Resolvido) Faa um programa que calcule os divisores de um nmero
qualquer, informado pelo usurio.
6. Faa um programa que receba as idades dos 30 alunos de uma turma
e, ao final, calcule e escreva a mdia das idades desses alunos.

54 UNIDADE 02
Execuo:

7. Faa um programa que leia 10 valores, mostre quantos deles esto no


intervalo de [10, 100] e quantos deles no esto.
8. Faa um programa que calcule o fatorial de um nmero qualquer
(Lembrando o clculo do fatorial: n! = n * n-1 * n-2 * ... * 2 * 1. Por
exemplo: 5! = 5 * 4 * 3 * 2 * 1 = 120).
9. Faa um programa que imprima a tabuada do nmero 4, com as quatro
operaes, no seguinte formato:

0+4=4 4-4=4 0*4=0 0/4=0


1+4=5 5-4=5 1*4=4 4/4=1
2+4=6 6-4=6 2*4=8 8/4=2
3+4=7 7-4=7 3 * 4 = 12 12 / 4 = 3
4+4=8 8-4=8 4 * 4 = 16 16 / 4 = 4
5+4=9 9-4=9 5 * 4 = 20 20 / 4 = 5
6 + 4 = 10 10 - 4 = 10 6 * 4 = 24 24 / 4 = 6
7 + 4 = 11 11 - 4 = 11 7 * 4 = 28 26 / 4 = 7
8 + 4 = 12 12 - 4 = 12 8 * 4 = 32 32 / 4 = 8
9 + 4 = 13 13 - 4 = 13 9 * 4 = 36 36 / 4 = 9
10 + 4 = 14 14 - 4 = 14 10 * 4 = 40 40 / 4 = 10

10. Faa um programa que imprima a tabuada de um nmero qualquer.


Similar questo anterior, no entanto, o usurio indicar a tabuada de
qual nmero o programa ir mostrar.

LABORATRIO DE PROGRAMAO 55
11. Faa um programa que receba um nmero e verifique se ele primo
ou no.

O comando while

O comando while tambm serve para repetirmos um comando


(simples ou composto) determinada quantidade de vezes. Diferentemente
do for, este comando mais adequado quando no sabemos, a princpio,
a quantidade de repeties que ir ocorrer. Isso acontece porque no h
contador, apenas um teste de continuidade para verificar se a repetio
ir parar ou no. Vejamos a sintaxe deste comando:

while (condio) comando;

Aqui teremos apenas uma condio controlando a repetio.


Enquanto essa condio for verdadeira a repetio continuar. Quando a
condio no for mais verdadeira, a repetio terminar. Dessa forma,
importante que, em algum momento, forcemos essa condio a ser falsa,
pois, caso contrrio, o programa nunca sair da repetio. Esse o erro
chamado de loop infinito, que trava o programa dentro do while e no
mais sai de l.
Vejamos um exemplo de utilizao do while a seguir (Figura 49).
Nesse exemplo, iremos calcular a soma de todos os nmeros digitados
pelo usurio. Nosso valor para sada da repetio ser -1, ou seja, quando
o usurio entrar com -1 como valor o programa sair da repetio.

Figura 49. Exemplo de utilizao do while

56 UNIDADE 02
Neste programa, as linhas 9, 10 11, 12, 13 e 14 iro se repetir
atravs do comando while. Essa repetio terminar no momento em
que a varivel nmero assumir o valor -1. Isso acontecer quando, na
linha 11, o usurio inserir o valor adequado. Enquanto no houver essa
entrada, a repetio ir continuar.
importante observar ainda que, quando a entrada for -1, esse
valor no deve ser considerado para os clculos, ou seja, para a soma
dos nmeros inseridos pelo usurio. Desta forma, precisamos colocar
um comando if na linha 12 que s autorizar o clculo a ser atualizado
se o valor de numero for diferente de -1. Abaixo (Figura 50) temos um
exemplo de sada para este programa:

Figura 50. Execuo do exemplo de while

1. Faa um programa que escreva os nmeros de 10 a 500.


2. Faa um programa que crie um menu com as opes a seguir, sendo
que, quando o usurio selecionar uma opo, o programa apenas ir
apresentar o texto Opo nome_da_opo escolhida, com exceo da
opo 4 que far o programa terminar sua execuo:
1 Cadastrar
2 Alterar
3 Excluir
4 Sair
3. Faa um programa que leia dois nmeros inteiros, o primeiro o
valor inicial de um contador, e o segundo o valor final do contador (o
valor inicial fornecido inferior ao valor final). Usando o comando while,

LABORATRIO DE PROGRAMAO 57
escreva na tela uma contagem que comece no primeiro nmero lido,
escreva os nmeros seguintes colocando apenas um nmero em cada
nova linha da tela, at chegar ao valor final indicado. Exemplo de tela de
sada:
Entre com o nmero inicial da contagem: 5
Entre com o nmero final da contagem: 9 5 6 7 8 9
4. Fazer um programa que calcule e imprima o fatorial de um nmero
fornecido pelo usurio, usando o comando while. Repetir a execuo
do programa tantas vezes at o usurio responder no (Lembrando o
clculo do fatorial: n! = n * n-1 * n-2 * ... * 2 * 1. Por exemplo: 5! = 5 * 4 *
3 * 2 * 1 = 120). Exemplo de tela de sada:
Entre com um nmero: 5
O fatorial de 5 120
Outro nmero (sim/no)? no.
5. Ler o nome de um aluno e suas duas notas A e B, e aps calcular
a mdia ponderada entre estas notas (A tem peso 1 e B tem peso 2).
Repetir este procedimento para uma turma composta por trs alunos,
usando o comando while.
6. Alterar o programa anterior de maneira que possamos trabalhar com
turmas compostas por um nmero varivel de alunos. Aps calcular e
imprimir a mdia de um aluno, exibir uma mensagem perguntando ao
usurio se existem mais alunos (resposta: sim / no). Se tiver mais
alunos, continuar o procedimento de leitura das notas e o clculo da
mdia at que o usurio responda no.
7. Alterar o programa anterior de maneira a validar as notas fornecidas
pelo usurio (notas devem ser valores positivos entre 0.0 e 10.0). Indicar
ao usurio se a nota fornecida invlida e pedir para fornecer uma
nova nota, repetindo este processo at que o usurio informe uma nota
correta. Usar uma varivel de controle booleana (flag) dentro do lao
while de leitura da nota, e gerar uma sada conforme o exemplo de tela
de sada abaixo.
Entre com o nome do aluno: Joo da Silva
Entre com a nota A: 15.3
ERRO: Nota invlida! Digite novamente a nota.
Entre com a nota A: 5.0
Entre com a nota B: 6.0
O aluno Joo da Silva tem uma mdia: 5.66
Continuar (sim/no)? no

58 UNIDADE 02
8. Escrever um programa que calcule todos os nmeros divisveis por certo
valor indicado pelo usurio (o resto da diviso por este nmero deve ser
igual a zero), compreendidos em um intervalo tambm especificado pelo
usurio. O usurio deve entrar com um primeiro valor correspondente ao
divisor e aps ele vai fornecer o valor inicial do intervalo seguido do valor
final deste intervalo. Exemplo:
Entre com o valor do divisor: 3
Incio do intervalo: 17
Final do intervalo: 29
Nmeros divisveis por 3 no intervalo de 17 a 29: 18 21 24 27.
9. Seu Manoel tem um comrcio e precisa de um programa que lhe
apresente o total de produtos vendidos e o valor total de vendas. Faa um
programa que leia a quantidade de cada produto e seu valor e apresente
esses resultados (Continuar inserindo valores at que o usurio digite a
-1).
10. (Resolvido) Escreva um programa que imprima na tela a srie de
Fibonacci at um nmero dado. Esta srie comea com dois nmeros 1s
e os prximos nmeros so obtidos pela soma dos dois anteriores.
Ex: 1 1 2 3 5 8 13 21 34 55.

Execuo:

LABORATRIO DE PROGRAMAO 59
O comando do-while

O comando do-while bastante parecido com o while, atravs


dele podemos repetir um comando, ou sequncia de comandos, vrias
vezes. A diferena maior reside no fato de o teste de continuidade no
while ser logo no incio do comando, enquanto que no do-while este teste
realizado ao final. Sendo assim, se a condio de continuidade no
for verdadeira antes da entrada na repetio, o while no ir executar
nenhuma vez. Entretanto, no do-while, pelo fato do teste ser depois,
os comandos correspondentes sero executados ao menos uma vez.
Vejamos a sintaxe desse comando:

do {
} while(condio);


Nesta estrutura de controle a repetio ser controlada pela
condio colocada depois do fechamento do bloco iniciado pelo do.
Dessa forma, a condio s testada depois da execuo dos comandos
contidos no bloco e, caso seja verdadeira, a repetio continuar, caso
seja falsa, a repetio ir parar e o programa continuar sua execuo
logo aps o comando do-while. Com isso, vemos que os comandos
devem ser executados pelo menos uma vez, mesmo se a condio for
falsa. Vejamos o exemplo a seguir (Figura 51):

Figura 51. Exemplo de utilizao do do-while

Nesse exemplo iniciamos o nmero com 0. Na repetio vamos


decrementando (operador --) o valor de nmero e mostrando os valores
enquanto o valor da varivel for maior que zero. Note que, nesse caso, a

60 UNIDADE 02
sada ser apenas o nmero 0, pois aps o primeiro passo da repetio,
o valor de nmero ser -1 e a repetio terminar. Vejamos a sada desse
programa na Figura 52:

Figura 52. Resultado da execuo do exemplo de do-while


Atravs desse exemplo podemos perceber a diferena de
funcionamento do while para o do-while. Se tivssemos usado o comando
while, como mostra a Figura 53 a seguir, a repetio no seria executada,
pois a condio seria falsa e o programa no executaria os comandos
dentro do while.

Figura 53. Implementao do exemplo de do-while com while


A diferena na execuo desse programa pode ser vista na Figura


54. Vejamos que, usando o while, o resultado da execuo diferente:

Figura 54. Resultado da execuo: nenhuma sada

LABORATRIO DE PROGRAMAO 61
Podemos, ainda, usar esses dois comandos para implementar
o mesmo algoritmo. Vejamos, na Figura 55, uma implementao do
exemplo de while (Figura 49) usando o comando do-while. Nesse caso, o
resultado da execuo ser exatamente o mesmo de quando foi usado a
estrutura while.

Figura 55. Reimplementao do exemplo de while com do-while



A diferena na implementao bem pequena. Na linha 8, ao
invs de colocarmos o comando while, colocamos a estrutura do, que
inicia o bloco de repetio para a estrutura do-while. E, ao final, na linha
15, ao invs de apenas fecharmos a chave, colocamos, aps a chave, o
comando while com o teste a ser executado para verificar se a repetio
continuar ou no. Vemos, na Figura 56, a seguir, que o resultado da
execuo permanece o mesmo:

Figura 56. Resultado da execuo do exemplo de do-while

62 UNIDADE 02
Com isso, o que podemos perceber que os comandos while e do-
while podem ser intercambiveis, dependendo da aplicao que estamos
pretendendo fazer. Na verdade, poderamos fazer este mesmo algoritmo
tambm com a estrutura for (tente como exerccio), produzindo a mesma
sada. Sendo assim, qualquer programa que necessite de repeties
pode ser feito usando qualquer das trs estruturas de repetio vistas
aqui.
No entanto, como vimos nesta unidade, cada comando tem os
casos onde mais indicado utiliz-lo. Portanto, devemos estar atentos
a isso para que a sequncia lgica de nossos algoritmos fique a mais
simples possvel (for para repetio nmero definido, while para repetio
sem nmero definido e com teste antes e do-while para repetio sem
nmero definido e com teste depois).

1. Escreva um programa que, dados 15 nmeros, imprima seus quadrados.


2. Escreva um programa que, dados dois nmeros, imprima o MMC.
3. Escreva um programa que, dados dois nmeros, imprima o MDC.
4. Escreva um programa que imprima os seguintes dados na tela.
1-1 1-2 1-3 1-4 1-5
2-1 2-2 2-3 2-4 2-5
3-1 3-2 3-3 3-4 3-5
4-1 4-2 4-3 4-4 4-5
5-1 5-2 5-3 5-4 5-5
5. (Resolvido) Escreva um programa que, dada uma entrada, diga se o
nmero primo ou no.

LABORATRIO DE PROGRAMAO 63
Execuo:

6. Escreva um programa que imprima os primos at um nmero digitado.


7. Escreva um programa que imprima os nmeros de 100 a 600 que so
mltiplos de 5.
8. Escreva um programa onde o usurio diz quantos nmeros quer digitar,
em seguida solicite a ele que digite todos os nmeros e diga qual o maior
nmero daqueles digitados.
9. A srie de RICCI difere da srie de FIBONACCI porque os dois nmeros
iniciais so dados pelo usurio e os outros termos so gerados a partir
da soma dos dois anteriores. Escreva um programa que imprima os 20
primeiros nmeros a partir de duas entradas do usurio.
10. Dado um pas A, com 5.000.000 de habitantes e uma taxa de natalidade
de 3% ao ano, e um pas B com 7.000.000 de habitantes e uma taxa de
natalidade de 2% ano. Calcular e imprimir o tempo necessrio para que
a populao do pas A ultrapasse a do pas B.

64 UNIDADE 02
Extra: comandos break e continue

sabido que os comandos for, while e do-while servem para


repetir determinada parte do cdigo. No entanto, muitas vezes queremos
alterar a sequncia natural dessas repeties, ou quebrando a repetio
ou ignorando determinados passos se uma condio especfica for
satisfeita. nesse ponto que entram os comandos break e continue.

O comando break

J vimos esse comando quando estudamos a estrutura de seleo


mltipla switch. Aqui ele ter uma funo bastante parecida. Dentro de
uma repetio, se o programa alcanar um comando break a repetio
ir parar naquele momento sem executar os passos faltantes. Ou seja,
ele servir para quebrar a repetio e continuar a execuo do programa
fora do lao. Vejamos o exemplo a seguir (Figura 57).

Figura 57. Exemplo de utilizao do break

Nesse exemplo, que aparentemente teria um loop infinito por


causa da condio do while ser 1 (1 e qualquer coisa diferente de zero
verdadeiro em C, 0 falso), isso no acontecer. A sada da repetio
se dar da mesma forma que os exemplos anteriores, atravs da entrada
do nmero -1. Mas, para esse programa, quando isso acontecer, o if da
linha 12 ser verdadeiro e o programa ir para a linha 13 e executar o
break, saindo da repetio. Temos, aqui, mais uma forma de implementar
o mesmo algoritmo visto anteriormente.

LABORATRIO DE PROGRAMAO 65
O comando continue

A instruo continue possui a funo de saltar, mas apenas o passo


corrente, de um comando iterativo. Ou seja, durante uma repetio, se o
programa alcanar o comando continue, aquele passo da repetio ser
abortado e o programa continuar no incio da prxima iterao. Vejamos
o exemplo a seguir (Figura 58):

Figura 58. Exemplo de continue

Analisando este exemplo, temos um comando de repetio for


(linha 7) controlado pela varivel i que inicia em 1 e vai at 10. No entanto,
quando o valor de i for 5, o teste do if na linha 8 resultar verdadeiro e
o continue da linha 9 ser executado. Nesse caso, a repetio passar
para o prximo passo, com i = 6, e o restante do passo anterior no ser
executado. Portanto, a sada exibida por esse programa no mostrar o
nmero 5. Vejamos na Figura 59:

Figura 59. Resultado da execuo do programa com continue


Vejamos agora esse mesmo exemplo trocando o comando
continue pelo break, para notarmos a diferena de um para o outro.

66 UNIDADE 02
Figura 60. Exemplo trocando continue pelo break

O que acontecer, nesse caso, que no momento em que a


varivel de controle do for, i, assumir valor 5, o teste da linha 8 novamente
ser verdadeiro e o comando da linha 9 ser executado. Como agora se
trata de um break, a repetio ser terminada e a execuo sair do for.
Sendo assim, a sequncia exibida ir somente at o nmero 4, como na
Figura 60, a seguir:

Figura 61. Resultado da execuo

1. (Resolvido) Faa um programa que o usurio entre com cinco nmeros


e imprima a metade de cada um deles.

LABORATRIO DE PROGRAMAO 67
Execuo:

2. Escreva um programa que imprima na tela os nmeros de 100 a 600


que so mltiplos de 5 e de 3 (os dois ao mesmo tempo).
3. Escreva um programa onde o usurio diz quantos nmeros quer
digitar, em seguida solicite a ele que digite todos os nmeros e diga qual
o menor nmero daqueles digitados.
4. Faa um programa que calcule a multiplicao de dois nmeros atravs
de somas sucessivas.
5. Entrar com 20 nmeros e imprimir a soma dos nmeros cujos quadrados
so menores do que 225.
6. Ler uma determinada quantidade de nmeros e dizer quantos so
pares e quantos so mpares.

68 UNIDADE 02
7. Entrar com um nmero (n) e imprimir na tela o valor de H de tal modo
que:
H=1+1/2+1/3+1/4+...+1/n
8. Entrar com um nmero (n) e imprimir na tela o valor de H de tal modo
que:
H=1-1/2+1/3+1/4+...+1/n
9. Repare a seguinte caracterstica do nmero 3025: 30 + 25 = 55 e 55**2
= 3025.
Criar um programa que possa ler vrios nmeros inteiros de 4 algarismos, um
de cada vez, e diga se o nmero apresenta a mesma caracterstica (repare que
3025/100=30 com resto 25). O algoritmo para quando for lido um valor menor
que 1000 ou maior que 9999.
10. Criar um programa que recebe vrios nmeros e imprima o produto
dos mpares e a soma dos pares.
11. Desafio - um marciano chegou a uma floresta e se escondeu atrs de
uma das 100 rvores quando viu um caador. O caador s tinha cinco
balas em sua espingarda. Cada vez que ele atirava, e no acertava,
claro, o marciano dizia: estou mais direita ou mais esquerda. Se o
caador no conseguir acertar o marciano, ele ser levado para marte.
Implementar este jogo para dois jogadores, em que um escolhe a rvore
onde o marciano ir se esconder e o outro tenta acertar.

Nesta unidade abordamos os comandos de seleo e de


repetio em C, comandos essenciais no aprendizado de qualquer
linguagem de programao. Vimos que os comandos if, if-else e switch
nos do a possibilidade de escolher uma determinada parte do cdigo
para ser executada ou no, e que os comandos for, while e do-while
so responsveis por executar uma mesma parte do cdigo vrias vezes
consecutivas.

LABORATRIO DE PROGRAMAO 69
UNIDADE 03
Comandos de Seleo
e de Repetio
comandos de seleo
e de repetio

Vetores

Um vetor (array) uma estrutura homognea que serve para


armazenarmos diversos valores do mesmo tipo. Por exemplo, se em
nosso programa quisermos armazenar as notas da primeira prova dos
30 alunos da turma de Laboratrio de Programao, no precisamos
criar diversas variveis (aluno 1, aluno 2, ...,aluno 30), basta usarmos
um vetor que teremos todas as notas em uma s estrutura mais fcil de
manipular. A sintaxe para declarao de um vetor a seguinte:

tipo nome_da_varivel[quantidade_de_posies]

Um vetor pode guardar diversos valores do mesmo tipo, no entanto,


devemos especificar previamente quantos valores ele ter, atravs
de um nmero inteiro (quantidade_de_posies) entre colchetes. Ao
declararmos um vetor, estamos reservando uma quantidade de posies
consecutivas em memria para armazenar esses valores. Vejamos na
Figura 62, a seguir, um esquema de representao da memria para um
vetor:

Figura 62. Representao em memria de um vetor de 4 posies

LABORATRIO DE PROGRAMAO 73
Com a declarao de um vetor, criamos uma sequncia de
elementos no qual podemos armazenar vrios valores e acess-los
facilmente da seguinte maneira:

nome_da_varivel[posio]

A posio indicar qual dos espaos de memria ser acessado


para obteno do contedo. Vejamos, no exemplo a seguir (Figura 63), a
declarao e utilizao de um vetor na prtica:

Figura 63. Exemplo de declarao e utilizao de vetor

Declaramos um vetor de inteiros com 5 posies (linha 6). Para


cada posio atribumos um valor, tambm do tipo inteiro (linhas 7 a 11).
Por fim, acessamos cada posio do vetor na hora de escrever no printf
da linha 12 quando colocamos cada posio. Devemos observar que o
ndice inicial de um vetor 0, portanto, as posies acessveis para um
vetor de 4 posies declarado como int vetor[4] so 0, 1, 2 e 3.
fcil notar, ainda, que temos uma forma mais prtica de
reescrever essa linha 12 atravs de um comando de repetio. Vejamos
essa transposio na Figura 64, a seguir:

74 UNIDADE 03
Figura 64. Reescrita do exemplo usando for

Assim, temos uma forma prtica e direta de manipular um conjunto


de valores. Atravs do for da linha 14, percorremos todas as posies
do vetor e acessamos os valores de cada uma das posies atravs
da varivel i. A seguir (Figura 65) temos o resultado da execuo deste
programa.

Figura 65. Resultado da execuo

Da mesma forma que usamos o for para escrever os valores


do vetor, podemos tambm usar um for (ou while, ou do-while) para
preencher os valores desse vetor. Nesse caso, podemos aproveitar
para pedir para o usurio digitar os valores. Vejamos o mesmo exemplo
anterior modificado para que a entrada de valores seja efetuada pelo
usurio atravs de um for, na Figura 66 a seguir:

LABORATRIO DE PROGRAMAO 75
Figura 66. Utilizao do for para preenchimento do vetor

Vejamos que na linha 8, o for que usamos para preencher
exatamente igual ao de escrita. Na linha 9 usamos os ndices i do vetor
para pedir cada posio ao usurio. Somamos com 1 para que no comece
em 0, mas em 1. Na linha 11 fazemos a leitura dos valores para o vetor,
passando para o scanf a posio do vetor (&idade[i]). Um possvel resultado
para a execuo deste programa encontra-se na Figura 67 abaixo.

Figura 67. Resultado da execuo

1. Faa um programa que leia 10 valores reais em um vetor e, logo aps,


calcule a mdia desses valores e a imprima para o usurio.
2. Faa um programa que leia um vetor de 10 valores e imprima o menor.
3. Faa um programa que leia 10 valores em um vetor. Depois de ler o

76 UNIDADE 03
vetor, o programa deve percorr-lo e imprimir apenas os valores mpares
que foram armazenados.
4. Faa um programa que preencha 2 vetores, com 5 elementos cada.
Como resultado, o programa deve apresentar um vetor com os elementos
dos dois vetores intercalados. Vejamos um exemplo a seguir:
Vetor 1: [5, 8, 10, 3, 1]
Vetor 2: [4, 2, 9, 7, 6]
Vetor Resultado: [5, 4, 8, 2, 10, 9, 3, 7, 1, 6].
5. (Resolvido) Faa um programa que receba 10 valores para um vetor e
o imprima ao contrrio.

Execuo:

6. Faa um programa que receba dez nmeros inteiros e armazene-os em


um vetor. O programa deve calcular e mostrar dois vetores resultantes,
sendo o primeiro com os nmeros pares e o segundo com os nmeros
mpares do vetor lido.

LABORATRIO DE PROGRAMAO 77
7. Faa um programa que receba dois vetores de 5 elementos cada e
retorne um vetor resultado contendo a soma das posies correspondentes
dos vetores de entrada. Por exemplo:
Vetor 1: [5, 8, 10, 3, 1]
Vetor 2: [4, 2, 9, 7, 6]
Vetor Resultado: [9, 10, 19, 10, 7].
8. Faa um programa que leia um vetor de 10 elementos. Logo em seguida
leia um valor a ser encontrado nesse vetor. Pesquise o valor no vetor e
retorne a posio onde o valor est localizado. Se no for encontrado
escreva a mensagem: valor no encontrado.
Vetor: [10, 8, 4, 2, 7, 12, 19, 21, 37, 18]
Valor a ser procurado: 18
Resultado: Encontrado na posio: 9.
9. Leia dois vetores: R de 5 elementos e S de 10 elementos. Gerar
um vetor X de 15 elementos cujas 5 primeiras posies contenham os
elementos de R e as 10 ltimas posies os elementos de S. Escrever
o vetor X.
10. Faa um programa que receba 10 valores em um vetor e os coloque
em ordem crescente. Sero necessrios dois percorrimentos sobre os
elementos desse vetor, para pesquisar cada elemento e depois para
verificar se so menores que os j verificados. Veja a seguir:

para i de 0 at tamanho[vetor] - 1
para j de i at tamanho[vetor]
se vetor[i] > vetor[j]
aux = vetor[i]
vetor[i] = vetor[j]
vetor[j] = aux

Strings ou cadeias de caracteres (vetores de char)



Conhecendo a estrutura de vetores e sabendo da existncia do
tipo char, que pode armazenar apenas um caractere, podemos deduzir
facilmente o que so strings. Atravs da construo de um vetor de char,
representamos, em C, palavras ou frases, enfim, cadeias de caracteres.
A declarao de uma string segue o mesmo formato de um vetor
convencional:

char nome_da_variavel[quantidade_de_posies]

78 UNIDADE 03
A quantidade de posies deve ser tal qual possa comportar a
palavra que queremos armazenar, ou seja, esse valor quantidade_de_
posies especificado indica o tamanho mximo da nossa string - 1.
Tamanho subtrado de 1, porque devemos sempre deixar uma posio
a mais, visto que ao final de toda string haver sempre o caractere nulo,
como na representao a seguir (Figura 68).

Figura 68. Representao de uma string

Mesmo que todas as posies no sejam preenchidas, o caractere


nulo ser armazenado logo aps o ltimo caractere de nossa palavra, ou
seja, ele quem indicar o final da string, independente do vetor estar
todo preenchido ou no.
Para fazermos a leitura de uma varivel do tipo string, usamos uma
funo especial ao invs do scanf, chamada gets. No exemplo a seguir
(Figura 69) veremos tanto a declarao de string quanto a utilizao do
mtodo gets para leitura das mesmas.

Figura 69. Utilizao de strings

LABORATRIO DE PROGRAMAO 79
Nesse exemplo declaramos nossa string na linha 6 e usamos a
funo gets para ler um valor do tipo string e armazenar nessa varivel.
Por isso temos que passar nossa varivel para a funo gets, para que
ele possa atribuir o valor lido do teclado varivel especificada em sua
declarao.
Um possvel resultado para a execuo deste programa est logo
abaixo na Figura 70:

Figura 70. Resultado da execuo do programa

1. (Resolvido) Faa um programa que receba seu nome e escreva bom


dia para voc.

Execuo:

80 UNIDADE 03
2. Faa um programa que receba seu nome e sobrenome em variveis
separadas e imprima seu nome completo numa s linha.
3. Faa um programa que receba um nome e o imprima ao contrrio.
4. Faa um programa que receba um nome e conte quantos caracteres
possui a palavra recebida.
5. Faa um programa que receba duas strings, percorra as duas
comparando cada um dos seus elementos e, ao final, imprima se as duas
so iguais ou no.

Funes de string

Existem funes especficas para trabalharmos com strings.


Como no so variveis simples, os operadores que conhecemos at
agora no funcionam com este tipo. Podemos fazer muitas coisas
com strings, como, por exemplo, ver seu tamanho, juntar mais de uma
palavra, comparar duas palavras diferentes, etc. Estas funes esto na
biblioteca string.h. Sendo assim, para que possamos utiliz-las, devemos
incluir esta biblioteca atravs da declarao:

#include <string.h>

Na Tabela 6, a seguir, temos as principais funes com seu


significado:

Funo Significado Exemplo

Strlen (string) Tamanho da string strlen (nome)

Comparao entre
duas strings (0: iguais;
strcmp (string1, string2) strcmp(nome, endereo)
diferente de 0 caso
contrrio)
Cpia do contedo de
strcpy(string1, string2) strcpy(nome, endereo)
string2 em string1

Concatena 2 string:
strcat(string1, string2) junta string2 no final de strcat(nome, endereo)
string1

Tabela 6. Funes para trabalhar com strings

LABORATRIO DE PROGRAMAO 81
extremamente importante para a programao lidar com strings,
pois elas so a base de qualquer arquivo e principalmente controles
de rotina (por exemplo: rotinas e procedimentos de banco de dados, o
SQL; endereamento de arquivos; modificao de configuraes...). A
seguir, Figura 71, temos um exemplo com todas as funes bsicas de
manipulao de string vistas at aqui:

Figura 71. Utilizao das funes de string

Na Figura 72, a seguir, temos um possvel resultado da execuo


deste programa:

Figura 72. Resultado da execuo do programa

82 UNIDADE 03
1. (Resolvido) Faa um programa que receba um nome e compare com
o seu. Se for igual escreva NOME CORRETO, caso contrrio, escreva
NOME INCORRETO.

Execuo:

2. Faa um programa que receba duas palavras, concatene as duas e


conte quantos caracteres possui o resultado dessa juno. Imprima a
palavra concatenada e a quantidade de caracteres da concatenao.
3. Faa um programa que receba duas strings e troque os valores dessas
variveis. Imprima os novos valores das duas strings.
4. Faa um programa que receba uma string e conte quantas letras
maisculas existem numa string recebida como parmetro.
5. Faa um programa que receba uma string e conte quantas letras
minsculas existem numa string recebida como parmetro.
6. Faa um programa que receba uma string e troque todas as letras
maisculas por minsculas e as minsculas por maisculas de uma string
recebida como parmetro.
7. Escreva um programa em C para ler uma frase e contar o nmero de
palavras existentes na frase. Considere palavra um conjunto qualquer de

LABORATRIO DE PROGRAMAO 83
caracteres separados por um conjunto qualquer de espaos em branco.
8. Escreva um programa em C para ler um caractere e logo aps um
nmero indeterminado de frases. Para cada frase informada imprimir
o nmero de ocorrncias do caractere na frase. O programa deve ser
encerrado quando a frase digitada for a palavra "fim".
9. Faa um programa que leia uma string do teclado e diga se ela
palndromo. Uma string palndromo quando pode ser lida tanto de
trs pra frente quanto de frente para trs e possui exatamente a mesma
sequncia de caracteres. Ex.: ASA, SUBI NO ONIBUS. Desconsidere os
espaos.
10. Faa um programa que receba 3 nomes e os coloque em ordem
alfabtica. Dica: use a funo strcmp.

Matrizes

Podemos definir uma matriz como uma extenso dos vetores para
mais dimenses. Ou ainda, redefinir um vetor como sendo uma matriz
unidimensional. Sendo assim, a definio de matriz a mesma de vetor,
uma estrutura que armazena uma sequncia de valores do mesmo tipo.
No entanto, as matrizes podem ter 2, 3 ou mais dimenses. A declarao
de uma matriz feita da maneira a seguir:

tipo nome_da_varivel[posies1][posies2]...[posiesn]

Dessa forma, podemos declarar nossa matriz com a quantidade


de dimenses que quisermos, sendo mais natural e compreensvel a
utilizao de matrizes com 2 ou 3 dimenses. Vejamos a seguir (Figura 73)
um exemplo de declarao e utilizao de uma matriz com 2 dimenses.

Figura 73. Utilizao de matriz com 2 dimenses

84 UNIDADE 03
Nesse exemplo temos uma matriz bidimensional declarada na
linha 6, com 4 linhas e 3 colunas: o primeiro nmero indica a quantidade
de linhas e o segundo a quantidade de colunas. Para iniciar essa matriz,
usamos dois comandos iterativos for aninhados nas linhas 8 e 9 (um
dentro do outro), sendo que um servir para percorrer as linhas e o outro,
dentro de cada linha, para percorrer as colunas. Para acessar cada
posio usamos uma estrutura idntica a de vetores, com a diferena de
colocarmos as 2 componentes, j que se trata de uma matriz:

nome_da_variavel[linha][coluna]

Cada componente ter seus colchetes correspondentes. Aps as


leituras de todas as notas, usamos outro lao for para calcular e imprimir
as mdias na linha 15. Nesse instante, usamos apenas uma iterao,
pois, a cada passo, iremos acessar as trs notas de cada aluno para
o clculo da mdia, linha 16. Para imprimir a mdia usamos o printf
normalmente com a formatao %.1f que indicar a escrita de apenas
uma casa decimal.
Poderamos ter iniciado a matriz (vetores tambm) no momento
da declarao, assim como fazemos com variveis comuns. A sintaxe
para isso, para uma matriz bidimensional, por exemplo, a seguinte:

tipo nome_da_variavel[linhas][colunas] = { {elementos_linha1}, {elementos_


linha2}, ... }

Para ficar mais claro, vejamos o mesmo exemplo anterior usando


esse tipo de declarao na Figura 74, a seguir:

Figura 74. Inicializao de uma matriz

LABORATRIO DE PROGRAMAO 85
Esta forma de iniciao pode ser usada tambm para vetores,
onde, logicamente, teremos apenas uma componente ao invs de duas.
Se tivssemos uma matriz tridimensional teramos trs componentes e
assim por diante. A seguir, Figura 75, temos uma possvel sada para o
exemplo de utilizao de matrizes visto.

Figura 75. Possvel sada para o programa

Para o exemplo com a iniciao da matriz na prpria declarao,


temos a seguinte sada (Figura 76):

Figura 76. Sada do programa com iniciao da matriz

Como podemos armazenar quaisquer tipos de valores nas matrizes,


logicamente tambm podemos armazenar strings. Como strings j so
vetores por definio na linguagem C, temos algumas particularidades
na utilizao de matrizes de strings. Analisemos o exemplo da Figura 77,
a seguir:

86 UNIDADE 03
Figura 77. Utilizao de vetores de matrizes

Para declarar uma matriz de strings, usamos o mesmo modo de


declarao de matrizes com o tipo char, como podemos ver na linha 6.
A diferena maior est no modo de acesso a cada string, ao invs de
passarmos os 2 ndices para acesso posio, passamos apenas 1,
indicando a linha onde est armazenada a string. Dessa forma, ser
retornada a palavra armazenada naquela linha da matriz (linha 11 e linha
15).
Se quisermos inicializar uma matriz desse tipo no momento da
declarao, faremos da mesma forma vista anteriormente, no entanto,
para cada linha colocaremos a string correspondente entre aspas
duplas(), ao invs de entre chaves com cada elemento separado por
vrgula quando usamos o tipo float, por exemplo. Vejamos, a seguir (Figura
78), como ficaria o programa anterior iniciando a matriz no momento da
declarao;

Figura 78. Iniciao de uma matriz de strings


Na Figura 79 temos a sada para este programa. Percebam que


tanto na leitura, atravs do gets, quanto na escrita, pelo printf, o acesso

LABORATRIO DE PROGRAMAO 87
string se d apenas por um ndice.

Figura 79. Possvel sada do programa com matrizes de strings

1. Faa um programa que receba os elementos de uma matriz e imprima


a soma de todos os seus elementos.
2. Faa um programa que receba os elementos de uma matriz 4x4. Exiba
a matriz e verifique se ela a identidade. Na figura a seguir temos um
exemplo de matriz identidade para dimenso 2x2.
3. (Resolvido) Faa um programa que receba os elementos de uma
matriz 4x4. Depois receba um valor do mesmo tipo dos elementos da
matriz. Verifique e imprima quantas vezes esse valor existe na matriz. Se
no encontrar imprima no existe.

88 UNIDADE 03
Execuo:

4. Faa um programa que receba os elementos de uma matriz. Exiba


a matriz e sua transposta. Na matriz transposta trocam-se linhas por
colunas e colunas por linhas da matriz original. Veja a figura a seguir:

LABORATRIO DE PROGRAMAO 89
5.Faa um programa que receba uma matriz e verifique se ela uma
matriz simtrica. Uma matriz simtrica significa que ela igual sua
transposta.
6.Faa um programa que receba uma matriz 5x5 e verifique se essa matriz
triangular. Uma matriz triangular possui todos os elementos abaixo ou
acima da diagonal principal so iguais a zero.
7.Faa um programa que receba uma matriz 3x3 e calcule seu
determinante. O determinante de uma matriz 3x3 calculado atravs de
suas diagonais, conforme a figura a seguir:

8.Faa um programa que receba uma matriz 4x4 e uma constante e


imprima a matriz resultante da multiplicao da matriz pela constante.
9.Faa um programa que receba duas matrizes 4x4 e imprima o resultado
da soma das duas matrizes.
10.Faa um programa que multiplique duas matrizes. No necessrio
pedir para o usurio digitar os valores, ou seja, declare as matrizes iniciadas
no momento da declarao. Para que seja possvel a multiplicao, o
nmero de colunas da primeira deve ser igual ao nmero de linhas da
segunda. O clculo da multiplicao faz-se como segue:

90 UNIDADE 03
11.Faa um programa que receba cinco nomes em uma matriz de strings
e os exiba, todos na mesma linha, concatenados atravs de um for (ou
while, ou do-while).
12.Faa um programa que receba dez nomes em uma matriz de strings e
outra string seq em separado. Imprima as palavras pertencentes matriz
que contenham a string seq recebida. Por exemplo, a string atestada
contm a string testa, ento deve ser impressa.
13.Faa um programa que receba dez nomes em uma matriz de strings
e imprima os nomes que forem repetidos.
14.Faa um programa que receba dez nomes em uma matriz de strings
e os imprima em ordem alfabtica.
15.Faa um programa que contenha duas matrizes, uma com as trs
notas de cada aluno e outra com os nomes dos alunos de determinada
turma. Ao final imprima o relatrio da turma com os nomes de cada aluno,
seguido das respectivas notas, da mdia e do resultado final, sendo
aprovado (AM) para mdia >= 7, prova final (EF) para 4 <= mdia < 7 e
reprovado (RP) para mdia < 4. Por exemplo:

LABORATRIO DE PROGRAMAO 91
Nessa unidade vimos como agrupar diversos dados em uma
mesma estrutura, os vetores (e matrizes) por meio dos quais podemos
armazenar, em sequncia, diversos elementos do mesmo tipo e,
posteriormente, acess-los de forma simples e rpida. Abordamos um
vetor especial, o vetor de char, tambm chamado de string, atravs
do qual podemos manipular cadeias de caracteres na linguagem de
programao C.

92 UNIDADE 03
UNIDADE 04
Estruturas
ESTRUTURAS

Estruturas

Usar uma estrutura significa criar um tipo de dado que armazene


vrios membros de tipos de dados diferentes. A rigor, criaremos variveis
que possuem, como componentes, outras variveis de tipos distintos.
A grande vantagem disso a organizao de nossos programas, por
exemplo, quando quisermos armazenar os campos de um aluno como
nome, matrcula, notas, etc. no precisamos mais criar variveis em
separado. Dentro da mesma estrutura agruparemos todos os dados
referentes a um aluno.
A especificao de um tipo de dados estrutura se d atravs da
palavra chave struct. As variveis dentro da struct se chamam membros.
Vejamos o formato de declarao:

struct nome_da_estrutura {
tipo_do_membro1 nome_do_membro1;
tipo_do_membro2 nome_do_membro2;
...
tipo_do_membro2 nome_do_membro2;
} variveis_estrutura;

Atravs dessa declarao temos nossa estrutura com os membros


descritos. Por exemplo, temos na Figura 80 um exemplo de declarao
de estrutura data, possuindo os campos dia, ms e ano. No entanto, no
temos nenhuma varivel declarada.

LABORATRIO DE PROGRAMAO 95
Figura 80. Declarao de struct para armazenar uma data

Nas linhas de 5 a 8 declaramos nossa estrutura. A partir dessa
declarao, podemos criar variveis que armazenem dados com esses
trs campos. Para fazermos isso, colocamos logo frente da declarao
da struct, aps a chave de fechamento, o nome das variveis que
queremos declarar. A partir da varivel podemos ter acesso aos campos
atravs do operador ponto (.). Se declararmos uma varivel de nome
hoje e tipo data, o acesso aos campos se d atravs das chamadas hoje.
dia, hoje.mes, hoje.ano.
A utilizao de estruturas possibilita o isolamento dos membros,
ou seja, para cada varivel do tipo data que criarmos, cada uma ter seus
prprios valores para dia, ms e ano, possibilitando um gerenciamento
organizado e evitando a mistura dos valores. Vejamos na Figura 81 um
exemplo de declarao e uso de variveis desse tipo.

Figura 81. Exemplo de uso de structs

96 UNIDADE 04
Aqui declaramos duas variveis do tipo de nossa estrutura data:
hoje e amanh (linha 9). Na funo main possvel verificar a chamada
aos membros dessa estrutura. Nas linhas 12, 13 e 14 atribumos valores
para os membros da varivel hoje. Nas linhas 15, 16 e 17 fazemos o
mesmo para os membros da varivel amanh. J nas linhas 18 e 19
fazemos uma chamada aos atributos para escrevermos seus valores
na tela. Atravs da sada desse programa vista abaixo (Figura 82),
verificamos que cada varivel possui seus prprios dados, e uma no
interfere no contedo da outra.

Figura 82. Resultado da execuo

Declarao de tipos de dados estruturas


Percebemos, atravs dos exemplos anteriores, que h uma
pequena limitao nessa forma de utilizao. Todas as variveis que
precisarmos do tipo da estrutura devem ser declaradas no momento da
especificao da estrutura. Para contornarmos isso, podemos declarar
um tipo de dados atravs da palavra-chave typedef, da seguinte forma:

typedef especificao_do_tipo nome_do_tipo;

Utilizando esta declarao, criamos um novo tipo, personalizado,


que ser identificado atravs do identificador nome_do_tipo que
colocamos como ltimo componente dessa especificao. Dessa forma,
podemos alterar nossos primeiros exemplos de struct incluindo a criao
do tipo e, assim, podermos criar variveis a qualquer momento em nosso
programa, no somente na declarao da estrutura. Em outras palavras,
utilizamos nosso tipo como qualquer dos outros tipos que j estudamos.
Por exemplo, vejamos a definio de um tipo de dados nome
(Figura 83) usando a definio de string que vimos na unidade anterior:

LABORATRIO DE PROGRAMAO 97
Figura 83. Criao de um tipo de dados

Atravs da declarao na linha 5 criamos o novo tipo nome. Para


criarmos nossa varivel aluno usamos, agora, nossa nova definio e
no mais o vetor de char (linha 8). Com isso, damos mais expressividade
ao nosso cdigo, facilitando a leitura e a interpretao do mesmo. Mas,
cuidado, no devemos redefinir tipos bsicos da linguagem, como int,
float, char, etc. pois dessa forma acabamos obtendo o efeito contrrio, ou
seja, prejudicando a leitura do nosso cdigo.
Para declararmos um novo tipo com a definio de uma estrutura,
seguimos o mesmo princpio. Vejamos no exemplo a seguir (Figura 84)
como feita. Usaremos a mesma estrutura para datas vista anteriormente:

Figura 84. Especificao de tipo a partir de uma struct

98 UNIDADE 04
Usando a definio de tipo, o nome que precede a definio da
estrutura, logo aps a chave de fechamento (tipoData, na linha 9), ser
o nome que usaremos para nos referenciar a este tipo. Sendo assim,
podemos declarar variveis em qualquer lugar do nosso programa
atravs do nome especificado (tipoData), como foi feito na linha 12.
Poderamos ainda separar a definio da estrutura da declarao
do tipo. No exemplo abaixo (Figura 85) temos a definio feita dessa
forma.

Figura 85. Definio do tipo separada da


definio da estrutura

Os dois cdigos tm rigorosamente o mesmo significado, sendo


assim, fica a critrio do programador escolher entre uma ou outra forma
de declarao. Inclusive o resultado da execuo desses programas
permanece o mesmo j mostrado na Figura 82.

LABORATRIO DE PROGRAMAO 99
1. (Resolvido) Faa um programa que defina uma estrutura com os
dados de um carro, a saber: modelo (string), fabricante (string), ano
(inteiro), quantidade de portas (inteiro), potncia do motor (float), tipo
de combustvel (string), vidro eltrico (bool), trava eltrica (bool), ar
condicionado (bool), direo hidrulica (bool).

2. Faa um programa que possua uma estrutura pessoa com os seguintes


membros: nome do tipo string, endereo do tipo string, bairro do tipo
string, cidade do tipo string, estado do tipo string, CEP do tipo string,
idade do tipo inteiro, altura do tipo float e peso do tipo float. Seu programa
dever possuir as seguintes funes:
a. Cadastrar pessoa: com leitura do teclado de todos os dados da
pessoa;

100 UNIDADE 04
b. Mostrar pessoa: com escrita na tela de todos os dados
correspondentes pessoa cadastrada;
c. Alterar pessoa: escolha um dos campos a serem alterados
na pessoa cadastrada e coloque um novo valor nesse campo,
mostrando depois todos os campos para que se possa verificar o
valor alterado.
3. Faa um programa que contenha uma estrutura aluno com os seguintes
membros: nome do tipo string, matrcula do tipo string, nota1 do tipo float,
nota2 do tipo float e nota3 do tipo float. Seu programa dever receber
todos os dados de um aluno e ao final exibir o relatrio do mesmo da
seguinte forma:
Aluno nome de matrcula matrcula, possui notas: nota1, nota2 e nota3.
Sendo assim, est (aprovado|reprovado|de prova final), com mdia media
4. Crie um programa que contenha uma estrutura retngulo com os
seguintes membros: base de tipo float e altura de tipo float. Seu programa
dever pedir para o usurio entrar com os dados de base e altura e
imprimir a rea desse retngulo.
5. Faa um programa que contenha as definies de registros para os
seguintes dados: (OBS: cada item corresponder a uma estrutura).
a. Um veculo novo de uma concessionria de automveis;
b. Um eletrodomstico de uma loja;
c. Um prato em um restaurante.
6. Defina um tipo de registro para armazenar dados de um voo, como por
exemplo os nomes das cidades de origem e de destino, datas e horrios
de partida e datas e horrios de chegada. Seu programa dever conter:
a. Uma opo para cadastrar o voo, lendo todos os dados que o
usurio digitar;
b. Uma opo para alterar o voo cadastrado, alterando apenas o
dado escolhido pelo usurio para alterao;
c. Uma opo para mostrar todos os dados do voo cadastrado.

Vetores de Estruturas

Podemos unir os dois conceitos estudados nessa unidade e na


anterior. Ou seja, podemos criar vetores de estruturas e, assim, armazenar
cadastros de vrios elementos de dados do tipo da estrutura. Dessa

LABORATRIO DE PROGRAMAO 101


forma, podemos criar cadastros e gerenciar dados de vrias entidades
em nossos programas. Vejamos o exemplo a seguir (Figura 86).

Figura 86. Exemplo de vetor de estruturas

Nesse exemplo temos a mesma aplicao anterior, no entanto,


armazenamos as duas datas na mesma varivel, que agora um vetor, em
duas posies diferentes. Acessamos as posies do vetor normalmente,
da forma como vimos na unidade anterior e os campos de cada posio
so acessados pelo operador ponto (.), como podemos visualizar nas
linhas 15 a 20. O resultado da execuo o mesmo visto na Figura 82.
Podemos, tambm, utilizar vetores como membros de nossas
estruturas. Por exemplo, se quisermos armazenar as trs notas de um
aluno, melhor utilizarmos um vetor para isso do que trs variveis
distintas. Tambm podemos utilizar strings que, a rigor, tambm significa
utilizarmos vetores em nossa estrutura. Vejamos o exemplo da Figura 87
a seguir:

102 UNIDADE 04
Figura 87. Utilizao de vetores como campos de estruturas

Agora, acessamos o membro da estrutura atravs do operador


ponto (.) e, aps, atravs dos colchetes acessamos a posio especfica
do vetor membro, como pode ser visto nas linhas 16, 17 e 18. O resultado
da execuo deste exemplo est na Figura 88.

Figura 88. Resultado da execuo

possvel mesclar as duas coisas, ou seja, criar um vetor de


estruturas que contenham vetores como membros. Dessa forma, podemos
tambm iniciali-lo de forma prtica, no momento da declarao, como
vimos na unidade anterior. Segue, na Figura 89, um exemplo de utilizao
desta forma:

LABORATRIO DE PROGRAMAO 103


Figura 89. Exemplo de utilizao de vetores com estruturas

Neste programa, vemos como se d o acesso a posies de


elementos do tipo vetor em vetores de estruturas. Cada chamada ter
dois ndices entre colchetes, o primeiro indicando a posio do vetor de
estruturas. O segundo indicando a posio do vetor membro da estrutura.
O resultado da execuo deste programa encontra-se na Figura 90.

Figura 90. Resultado da execuo

Estruturas de Estruturas


Temos a possibilidade, ainda, de introduzir membros nas
estruturas que so tambm estruturas. Por exemplo, se quisermos que a
estrutura aluno tenha um membro data de nascimento, usando a estrutura
mostrada no incio desta unidade, podemos fazer este agrupamento da
seguinte maneira (Figura 91):

104 UNIDADE 04
Figura 91. Uso de estruturas de estruturas

Para acessar os membros que so estruturas, tambm usamos


o operador ponto (.) seguido do nome do membro, e para acessar os
membros desses atributos, colocamos novamente o operador ponto (.)
seguido, agora, do nome do membro na estrutura interna (linhas 24, 25
e 26). Dessa forma, a cada nvel que entrarmos em nossa estrutura,
colocaremos um novo ponto indicando membros de membros, tanto para
leitura quanto para escrita de dados.

LABORATRIO DE PROGRAMAO 105


1. (Resolvido) Crie um programa de agenda telefnica, com os dados
de nome do tipo string e telefone do tipo string, para cada contato,
armazenados em um registro. O programa dever criar um vetor de 10
posies e inici-lo no momento da declarao. Dever, ainda, mostrar
uma tabela de nomes e telefones com os dados armazenados no vetor.

Execuo:

106 UNIDADE 04
2. Crie uma estrutura para representar os dados de um funcionrio, com
matrcula de tipo inteiro, nome de tipo string, estado civil de tipo string,
endereo do tipo string, cargo de tipo string, salrio de tipo float e data de
nascimento de tipo data. O tipo data deve ser definido como uma estrutura
com os membros dia, ms e ano de tipo inteiro. Com essa estrutura faa
as seguintes operaes:
a. Crie um vetor de 20 posies para armazenar o cadastro de
funcionrios de uma empresa fictcia;
b. Crie uma varivel fim que demarcar a ltima posio atualmente
preenchida em seu cadastro de funcionrios;
c. Faa com que o programa apresente um menu onde o usurio
possa escolher entre as funes de cadastrar funcionrio, excluir
funcionrio, alterar funcionrio, buscar funcionrio, listar todos os
funcionrios e sair.
d. O usurio dever poder escolher qualquer das opes, qualquer
quantidade de vezes. Somente ao escolher a opo sair o programa
deve ser finalizado;
e. Quando a opo cadastrar funcionrio for escolhida, leia todos
os dados de um funcionrio e o inclua na primeira posio livre do
vetor. A varivel fim deve ser aumentada de um.
f. Se j houver vinte funcionrios cadastrados (limite do nosso vetor),
o programa dever mostrar a mensagem Impossvel cadastrar.
Vetor cheio;
g. Quando a opo excluir funcionrio for escolhida, o programa
dever solicitar a posio que o usurio deseja excluir. Caso a opo
esteja preenchida com um funcionrio no vetor, todos os elementos,
a partir daquela posio para frente devem ser puxados uma
posio para trs, para refletir a excluso. A varivel fim deve ser

LABORATRIO DE PROGRAMAO 107


reduzida de um. Caso contrrio, dever ser exibida a mensagem
Impossvel excluir. Posio invlida;
h. Quando a opo alterar funcionrio for escolhida, o usurio dever
escolher a posio a alterar. Caso esta posio esteja preenchida
com os dados de um funcionrio, o programa dever mostrar os
dados atuais e pedir para o usurio digitar novamente todos os
dados para aquele funcionrio. Caso contrrio, dever mostrar a
mensagem Impossvel alterar. Posio no preenchida;
i. Quando a opo buscar funcionrio for escolhida, o programa
dever solicitar ao usurio o nome a procurar. Aps isso, o
programa ir buscar, entre os funcionrios cadastrados, um com
nome procurado (ou parte dele). Caso encontre, dever mostrar
todos os dados desse funcionrio. Caso contrrio, dever exibir a
mensagem Funcionrio no encontrado;
j. Quando a opo listar todos os funcionrios for selecionada,
o programa deve exibir todos os dados de todos os funcionrios
cadastrados at o momento. Se nenhum funcionrio estiver
cadastrado, dever exibir a mensagem Nenhum funcionrio
cadastrado;
l. Quando a opo sair for escolhida, o programa dever finalizar.


Na unidade trs estudamos vetores e matrizes, construes
homogneas da linguagem C, ou seja, s podamos armazenar valores
do mesmo tipo. Nessa unidade introduzimos o conceito de estruturas,
atravs das quais armazenamos dados de tipos diferentes na mesma
construo. Vimos que, aliando estruturas ao uso de vetores ou matrizes,
podemos alar nossos programas a um nvel bem mais complexo e com
manipulao de dados mais simples, na mesma construo, ao invs de
criarmos vrios vetores.

108 UNIDADE 04
UNIDADE 05
Funes e
Procedimentos
funes e
procedimentos

Funes

Assim como na matemtica, funes so usadas em programao


para aplicarmos a determinadas entradas e obtermos um valor resultante.
Primeiramente, veremos a declarao de funes simples, sem parmetros,
para depois passarmos a noo de passagem de parmetros e s formas
de se fazer isso.
Usando funes criamos pequenos pedaos de cdigos separados
do programa principal. Na verdade, tudo que escrevemos em C so funes.
A prpria main uma funo, como estamos chamando desde o incio dos
estudos. Tendo o nome de principal, ela a funo mais importante do
programa, pois a partir dela que nosso programa iniciar sua execuo.
Sendo assim, sua existncia no programa obrigatria.
Analisemos um exemplo que possui somente uma funo main
(Figura 92) e que no faa nada para verificarmos o conceito e o modo de
declarao de funo.

Figura 92. Exemplo de funo main

Este o programa mais simples que podemos fazer na linguagem


C. Temos apenas a funo main declarada e, dentro do bloco da funo,
os comandos que ela ir executar. Vamos detalhar essa declarao
mostrando a forma geral de declarao de funes em C:

LABORATRIO DE PROGRAMAO 111


tipo_de_retorno nome_da_funo ( ) {
comandos;
}

A primeira coisa a ser feita especificar qual tipo a funo ir


retornar. Assim como funes matemticas que calculam um valor, as
funes em C tambm o fazem, podendo ser retornado qualquer tipo dos
que foram vistos anteriormente, inclusive vetores e estruturas. Em nossa
funo main o tipo de retorno padro int (linha 2).
Logo aps colocarmos o nome da funo, atravs desse nome a
funo pode ser chamada de outras partes do programa, como veremos
posteriormente. Para a especificao do nome, valem as mesmas regras
que vimos para nomenclatura de variveis. O nome main um nome
de funo especial, que indicar que se trata da funo principal do
programa, aquela que ser chamada no momento do incio da execuo
(linha 2).
Em seguida abrimos e fechamos parnteses. Entre esses
parntesis ficaro os parmetros da funo, s que, no momento, no
abordaremos isso, ficando mais para frente. Feito isso a declarao
estar finalizada (linha 2), podemos abrir o bloco de comandos da funo
com { para comear a escrever os comandos que a funo ter. Aps o
ltimo comando da funo devemos fech-la com }.
Toda funo deve retornar um valor do tipo que foi especificado
em sua declarao. Isso feito atravs do comando return, atravs
dele especificamos que valor vai ser retornado. Dessa forma, o ltimo
comando em toda funo sempre um return. No caso da funo main,
que sempre retorna inteiro, o valor padro de retorno 0, como podemos
ver na linha 3.
Com exceo da funo main, todas as outras funes so
secundrias, o que significa que elas podem existir ou no. As grandes
vantagens de usarmos funes em nossos programas so porque elas
retornam valores, ajudam a fragmentar o cdigo em partes menores e
podem ser utilizadas mais de uma vez no mesmo programa.

Criando funes

Primeiramente, veremos as funes sem parmetros em C. Uma


funo como uma varivel que guarda vrias linhas de cdigo. Sendo
assim, para que possamos cham-las em determinada parte do cdigo,

112 UNIDADE 5
preciso que primeiro tenhamos declarado as mesmas. Sendo assim, toda
funo deve ser declarada antes da funo main.
Para chamarmos uma funo, basta evocarmos o nome que
usamos para cri-la, seguido da lista de parmetros entre parnteses.
Como, em nosso caso, ainda no teremos parmetros, basta colocar os
parnteses vazios. Vejamos o exemplo a seguir na Figura 93:

Figura 93. Declarao e uso de uma funo


Temos uma funo chamada dez (linha 5) que deve retornar algum
valor do tipo inteiro. Devido a isso, na funo main, atribuiremos esse
resultado a uma varivel do mesmo tipo (linha 13) para capturarmos o
valor retornado pela funo. A partir disso, essa varivel assumir o valor
10 e poderemos us-la no decorrer do programa.
Como resultado da execuo desse programa, a funo ser
chamada, sero impressos os dois textos das linhas 6 e 7 e, por fim, ser
retornado o valor 10 pela funo. Na linha 13, o valor da varivel x, que,
nesse caso, o valor retornado pela funo, ser impresso. Podemos ver
esse resultado da execuo na Figura 94.

Figura 94. Resultado da execuo

LABORATRIO DE PROGRAMAO 113


Na Figura 95 temos outro exemplo de funo que calcular a
soma de dois valores e retornar esse valor como resultado da funo.

Figura 95. Funo que calcula a soma

Nesse exemplo, dentro da prpria funo soma, pedimos para


o usurio digitar dois valores (linhas 7 a 12) e, ao final, retornamos a
soma dos dois valores lidos (linha 13). Observamos que podemos usar
qualquer tipo de expresso na chamada return, contanto que o resultado
dessa expresso seja do tipo de retorno da funo (nesse caso, int).
importante percebermos tambm que a chamada da funo
no necessita ser um comando isolado. Nesse exemplo usamos a
funo soma direto na chamada da funo printf (linha 17), pois apenas
queremos imprimir o resultado e no armazenar esse valor numa varivel
para ser usada depois.

Procedimentos

Um procedimento tem a mesma definio de uma funo e,


consequentemente, a mesma forma de declarao. Tambm representa
um bloco de cdigo funcional que pode ser chamado a partir de qualquer
lugar do programa.

114 UNIDADE 5
A diferena est no fato de que um procedimento no retorna valor
algum. Por causa disso, em um procedimento no teremos o comando
return. E para indicarmos que ser um procedimento e no uma funo,
usamos um tipo especial que dir ao programa que a funo no tem
retorno. Esse tipo o void.
Sendo assim, o formato de declarao padro de um procedimento
o seguinte:

void nome_do_procedimento ( ) {
}

Usamos procedimentos quando queremos executar um conjunto


de linhas de cdigo em vrias partes distintas de nosso programa, mas
no queremos retornar nenhum valor especfico. Vejamos o exemplo da
Figura 96.

Figura 96. Exemplo de procedimento

O procedimento mensagem, declarado na linha 5, tem apenas


dois comandos de escrita (printf nas linhas 6 e 7), ou seja, no precisa
retornar valor algum. A chamada a esse procedimento feita da mesma
forma que as funes (linha 11), atravs do nome do procedimento
seguido dos parmetros entre parnteses (como no h nenhum ainda,
ficam somente os parnteses). O resultado da execuo deste programa
est na Figura 97.

LABORATRIO DE PROGRAMAO 115


Figura 97. Resultado da execuo

As funes e os procedimentos tm utilizaes diferentes em


nossos programas. Em resumo, podemos dizer que tudo so funes,
mesmo os procedimentos podem ser definidos como funes que no
retornam nada. Ficar a cargo do programador escolher qual dos dois
tipos se enquadra no problema que est querendo resolver.

Passagem de parmetros

As funes que vimos at agora no precisavam de nenhum valor


de entrada, ou seja, no tinham parmetros. Se quisermos passar algum
valor como entrada para a funo (ou procedimento), para ser usado em
seus clculos internos, devemos especific-los entre os parnteses aps
o nome da funo, da seguinte forma:

tipo_de_retorno nome_da_funo (tipo1 nome1, ... , tipon nomen ) {


comandos;
}

Podemos declarar quantos parmetros quisermos, todos com seu


prprio tipo e separados por vrgula. Dessa forma, podemos reescrever
a funo soma para que no precisemos, dentro da funo apenas, pedir
para o usurio digitar os parmetros. Vejamos na Figura 98:

Figura 98. Declarao de funo com parmetros

116 UNIDADE 5
Vejamos que, nesse caso, nossa funo est bem mais compacta.
Esta a grande vantagem de programarmos utilizando funes. Cada
item que quisermos implementar, em separado, pensamos em funes de
forma a simplificar a programao e facilitar o entendimento. O resultado
da execuo desse programa pode ser visto na Figura 99:

Figura 99. Resultado da execuo

Vale ressaltar, ainda, que podemos ter vrias funes com o


mesmo nome, mas com parmetros diferentes. A distino no momento
da chamada feita de acordo com os parmetros passados.

1. Faa um programa que contenha uma funo subtrao, que receba


dois valores e retorne a subtrao dos dois.
2. Faa um programa que contenha uma funo que receba um nome e
escreva Bom dia para esse nome recebido.
3. Faa um programa que contenha duas funes que recebam o raio
de um crculo e retornem: uma a rea da circunferncia e a outra o
comprimento da mesma.
4. Faa um programa que contenha quatro funes: soma, subtrao,
multiplicao e diviso. Seu programa dever proporcionar ao usurio,
atravs de uma funo menu, a escolha de qual das operaes deseja
executar.
5. (Resolvido) Faa um programa que contenha uma funo receba
uma temperatura em graus Celcius e retorne sua correspondente
transformao para Farenheit.

LABORATRIO DE PROGRAMAO 117


Execuo:

6. Faa um programa que contenha um procedimento que receba um


vetor e imprima todos os seus valores. Para que uma funo receba
um vetor como parmetro, declaramos da seguinte forma: void escreve
(int[10] vetor), por exemplo. Se no quisermos especificar o tamanho do
vetor, podemos fazer da seguinte forma: void escreve (int[] vetor), no
entanto, devemos informar a quantidade de posies de alguma forma.
A maneira mais simples atravs de outro parmetro: void escreve (int[]
vetor, int tamanho).
7. Faa um programa que contenha uma funo que receba dois vetores
e retorne o vetor resultante da soma desses dois. Para que uma funo
retorne um vetor, devemos declar-la com um asterisco logo antes do
nome, por exemplo: int *soma(int[] vetor1, int tam1, int[] vetor2, int tam2).
8. Faa um programa que contenha uma funo que receba os valores
da base e altura de um retngulo e retorne sua rea.
9. Faa um programa que contenha uma estrutura pessoa com os
seguintes membros: nome (string), endereo (string), telefone (string)
e data de nascimento (tipo data, com membros dia, ms e ano). Seu

118 UNIDADE 5
programa dever ter funes (ou procedimentos) que executem as
seguintes tarefas:
a. Receber todos os dados de uma pessoa;
b. Escrever na tela todos os dados de uma pessoa;
c. Apagar todos os dados lidos da pessoa (ou seja, inserir vazios
nos valores string e zeros nos valores numricos);
d. Verificar se a pessoa com os dados colocados maior de idade
(mais de 18 anos);
e. Faa um menu para que o usurio possa escolher qual das
operaes quer escolher.
10. Faa um programa que contenha uma funo que receba trs valores
e retorne o menor entre eles.
11. Faa um programa que contenha uma funo que receba uma string
e retorne quantas consoantes existem na string recebida.
12. Faa um programa que contenha uma funo que receba uma string e
retorne outra string com todas as letras substitudas pela correspondente
maiscula.
13. Faa um programa que contenha uma funo que receba um valor
inteiro e retorne o nmero com seus dgitos invertidos. Por exemplo, dado
o nmero 4892, a funo deve retornar o valor 2984.
14. Faa um programa que contenha duas funes que recebam dois
inteiros e retornem: uma o mdc e outra o mmc entre os nmeros recebidos.
15. Faa um programa que contenha uma funo que receba um nmero
e verifique se ele primo ou no.

Variveis locais e globais

Quando comeamos a usar funes e procedimentos em nossos


programas, devemos entender dois novos conceitos que nos ajudaro
no desenvolvimento de nossos programas: variveis locais e variveis
globais.

Variveis locais


Variveis locais so variveis declaradas dentro de funes
especficas. Por causa disso, essas variveis so visveis apenas dentro
daquela funo, ou seja, s podem ser usadas na prpria funo. Variveis

LABORATRIO DE PROGRAMAO 119


locais no podem ser usadas em outro lugar do programa. Vejamos o
exemplo da Figura 100:

Figura 100. Variveis locais


A varivel i, declarada dentro do procedimento imprime (linha 6),


s pode ser usada dentro deste procedimento. Ou seja, o programador s
pode atribuir valores a ela ou usar o valor nela contido enquanto estiver
dentro do procedimento imprime. Da mesma forma, o vetor x, declarado
na linha 13, s pode ser usado na funo main.
O resultado da execuo deste programa pode ser visto na Figura
101:

Figura 101. Resultado da execuo

Variveis globais

Variveis globais so visveis em qualquer ponto do programa.


So declaradas fora de qualquer funo e, normalmente, logo no incio do
programa, pois, a nica limitao, nesse caso, que s pode ser usada
aps ser declarada. Podem ser usadas dentro de qualquer funo e,
por consequncia, dentro da main. Vejamos o mesmo exemplo anterior,
agora, usando variveis globais (Figura 102):

120 UNIDADE 5
Figura 102. Uso de variveis globais

A varivel i, declarada dentro da funo imprime, continua sendo


varivel local ao procedimento imprime. A varivel x foi levada para fora
da funo main, antes da funo imprime, sendo assim, uma varivel
global e podemos us-la diretamente nas funes imprime e main, como
fizemos na linha 10.
Isso evita, ainda, que tenhamos que passar o vetor x como
parmetro (linha 15), j que temos acesso a ele nas duas funes. O
resultado da execuo deste programa o mesmo j visto na Figura 102.
No entanto, devemos ficar atentos ao usar variveis globais.
Ser varivel global significa estar na memria durante toda a execuo
do programa, sendo assim, qualquer alterao na varivel modificar
verdadeiramente a varivel. Vejamos o exemplo a seguir (Figura 103):

Figura 103. Anlise de variveis globais

LABORATRIO DE PROGRAMAO 121


Vejamos o que acontece nesse exemplo. Estamos usando duas
variveis: a global x e a local a. Na linha 15 imprimimos o contedo inicial
das duas variveis, na linha 16, chamamos a funo imprime, passando a
varivel a como parmetro. Na funo imprime, alteramos o contedo das
duas variveis nas linhas 8 e 9 e imprimimos os respectivos contedos
(linha 10). Na linha 17, ao final do programa, imprimimos novamente
os contedos dessas variveis. Vejamos, na Figura 104, o resultado da
execuo desse programa:

Figura 104. Resultado da execuo

importante perceber que, no primeiro caso, os valores iniciais


8 e 2 so impressos. No segundo passo, dentro da funo imprime, os
valores alterados das funes so mostrados. No entanto, ao final, so
impressos novamente os valores e a varivel a volta a ter seu contedo
inicial. Isso acontece porque, dentro do procedimento, a varivel a
representada pelo parmetro y, uma varivel local. Dessa forma, o
contedo de y no se mantm fora do procedimento, diferente de x, por
ser uma varivel global.
Devemos sempre evitar o uso de variveis globais, pois diminui a
legibilidade do cdigo e pode causar problemas de alteraes de variveis
no previstas. Tambm diminui a independncia de nossas funes com
relao a outros cdigos. Se quisermos refletir esse comportamento
que acabamos de analisar devemos usar o mecanismo de passagem de
parmetros por referncia.

Passagem de parmetros por valor e por referncia


Os valores que colocamos como entrada de nossas funes
podem ser passadas de duas formas: por valor ou por referncia. Vamos
analisar cada uma delas.

122 UNIDADE 5
Passagem de parmetros por valor

Passar um parmetro por valor significa que somente o valor da


varivel ser copiado para dentro da funo (ou procedimento). Usamos
esta forma de passagem da forma como j vnhamos fazendo desde o
incio, apenas declarando os parmetros com nome e tipo. Sendo assim,
os exemplos vistos anteriormente usam passagem de parmetros por
valor. Vejamos mais um exemplo na Figura 105:

Figura 105. Passagem de parmetros por valor

Neste exemplo passamos a varivel n para a funo imprime


usando passagem por valor. Sendo assim, apesar de alterarmos o valor
do parmetro nmero na linha 7, essa alterao no ser refletida fora do
programa. Por isso, quando imprimimos novamente a varivel n na linha
15, seu valor ser o original, ou seja, 2.

Figura 106. Resultado da execuo

LABORATRIO DE PROGRAMAO 123


Passagem de parmetros por referncia

A passagem por referncia faz o contrrio da passagem por valor.


Ou seja, as modificaes feitas dentro de uma funo so refletidas na
varivel passada como parmetro. E, fora da funo, o novo valor obtido
dentro da funo poder ser utilizado.
Para passarmos por valor usamos a notao * antes do nome da
varivel que estamos querendo, junto ao nome, da seguinte forma:

tipo nome_da_funo (tipo *parmetro_passado_por_referencia) {


}

Na verdade, fazendo isso estamos passando uma referncia
para o local de memria onde est realmente armazenada a varivel
passada, ou seja, um ponteiro. assim que se torna possvel simular a
passagem por referncia: passamos o endereo de memria e a funo
altera quem estiver naquele endereo, no caso, uma varivel declarada
fora da funo. Com isso, tambm devemos colocar o * antes do nome
da varivel sempre que quisermos usar essa varivel dentro da funo.
Vejamos o exemplo da Figura 107:

Figura 107. Passagem de parmetros por referncia



Nesse caso, a varivel n realmente ser alterada dentro da funo
imprime. Aps a chamada desta funo na linha 14, n ir adquirir um
novo valor na atribuio da linha 7. Seu novo valor dever ser impresso
pelo printf da linha 15 (50).
Devemos perceber ainda que como o parmetro um ponteiro

124 UNIDADE 5
e no um inteiro, propriamente dito, devemos passar um endereo de
memria. Para isso, usamos o operador &, da mesma forma que usamos
no scanf, para indicar o endereo de memria da varivel e no somente
a varivel.
O resultado da execuo deste programa pode ser visto na Figura
108:

Figura 108. Resultado da execuo

1. Faa um programa que contenha uma funo que receba dois


parmetros inteiros por referncia e troque o valor dessas variveis.
2. (Resolvido) Faa um programa que contenha uma funo que receba
dois nmeros e calcule a potncia do primeiro em relao ao segundo,
retornando o valor atravs da passagem por referncia do primeiro
parmetro.

LABORATRIO DE PROGRAMAO 125


Execuo:

3. Faa um programa que contenha uma funo que receba trs


parmetros por referncia e os ordene, alterando para ser o primeiro
parmetro o menor, o segundo parmetro o intermedirio e o terceiro
parmetro o maior.
4. Faa um programa que contenha uma funo que receba um valor
inteiro como referncia e retorne o resto da diviso deste nmero por 10.
Altere tambm o valor da varivel passada por referncia, dividindo-a por
10.
5. Faa um programa que contenha uma funo que receba uma string
por referncia e altere essa string para seu valor ao contrrio.
6. Faa um programa que contenha uma funo que receba um nmero
i e retorne o i-simo nmero primo existente nesse mesmo parmetro
passado por referncia.
7. Faa um programa que contenha uma funo, receba um parmetro
(inteiro, por valor) com o total de minutos passados ao longo do dia e
receba tambm dois parmetros (inteiros, por referncia) no qual deve
preencher com o valor da hora e do minuto corrente. Seu programa
dever ler do teclado quantos minutos se passaram desde meia-noite e
imprimir a hora corrente (use a sua funo).

Prottipo de funes

Conforme explicado anteriormente, todas as funes precisam
ser declaradas antes de serem utilizadas. No entanto, normalmente,
a primeira funo que implementamos a prpria main, de forma a
mantermos nosso cdigo organizado e identificarmos facilmente qual a
funcionalidade principal do nosso programa. Somente aps a main viro
nossas funes personalizadas.
No entanto, precisamos usar as funes que implementaremos,

126 UNIDADE 5
a partir de agora, aps a funo main. Para que nossas funes sejam
reconhecidas dentro da main, declaramos apenas o prottipo das funes
antes da funo principal. Dessa forma, elas sero reconhecidas e
podemos us-las na principal, mesmo sem termos implementado ainda.
Para declarar o prottipo de uma funo, basta escrevermos o
cabealho da funo com os mesmos parmetros que ela ter, seguida
de ponto e vrgula. Colocamos somente essa assinatura antes da main,
e depois dela implementamos a funo propriamente dita. Vejamos
exemplo usado anteriormente com a declarao do prottipo (Figura
109):

Figura 109. Prottipo de funes

Dessa forma, a funo imprime, cujo prottipo est descrito na


linha 5, ser reconhecida e, por conseguinte, pode ser usada mesmo sem
ter sido implementada antes da funo main. O resultado da execuo
deste programa o mesmo visto na Figura 109.

Vale ressaltar ainda que, no prottipo da funo, podemos
suprimir os nomes dos parmetros, deixando para especific-los apenas
no momento da declarao. Na figura 110 temos um exemplo dessa
utilizao:

LABORATRIO DE PROGRAMAO 127


Figura 110. Supresso de nomes de
parmetros no prottipo

O resultado da execuo deste programa encontra-se na Figura


111:

Figura 111. Resultado da execuo

Usando a prototipagem simplificamos nosso cdigo. Teremos uma


parte destinada a declarar as funes (prottipos) e logo aps temos a
funo principal que o programa. Logo abaixo da funo principal esto
as funes secundrias implementadas.

Recursividade

Recursividade no um comando propriamente dito e sim uma


tcnica ou habilidade que diversas linguagens proporcionam. Recurso
quando uma funo chama a si prpria ou chama outra funo e esta
chama a primeira.

128 UNIDADE 5
Para usar a recursividade basta chamarmos uma funo, como j
vnhamos fazendo, s que agora dentro do bloco de comandos da prpria
funo que est sendo definida. Essa caracterstica especialmente til
quando a funo que estamos implementando definida em termos dela
mesma.
Vamos pensar na funo fatorial: como sabemos, o fatorial de um
nmero N o valor N multiplicado pelo fatorial de N-1. Ou seja, a funo
fatorial eminentemente recursiva. Vejamos como ficaria sua definio
na linguagem de programao C (Figura 112):

Figura 112. Implementao recursiva do fatorial


Vejamos que, na linha 16, dentro da prpria funo fatorial


fazemos uma chamada funo fatorial. Dessa forma, definimos a funo
exatamente da forma como ela na realidade.
Devemos ter o cuidado de sempre que usarmos recursividade
colocarmos uma condio de parada, ou seja, uma condio que
terminar com as chamadas repetidas. Se isso no acontecer, nosso
programa entrar em um loop de profundidade e nunca finalizar sua
execuo. No caso do fatorial, a condio de para n = 1, pois para ele
o resultado do fatorial conhecido e igual a 1 (linha 13).
As chamadas funo fatorial esto descritas logo a seguir:

fatorial(5) =
5 * fatorial(4) =

LABORATRIO DE PROGRAMAO 129


5 * 4 * fatorial(3) =
5 * 4 * 3 * fatorial(2) =
5 * 4 * 3 * 2 * fatorial(1) =
5*4*3*2*1=
5*4*3*2=
5*4*6=
5 * 24 = 120

Vejamos que somente ao chegar condio de parada (n = 1)


a recurso volta e calcula o resultado das multiplicaes para obter o
resultado final. O resultado da execuo deste programa pode ser
conferido na Figura 113.

Figura 113. Resultado da execuo

No entanto, esta facilidade tem seu custo. Apesar de simplificar


nossos algoritmos, o uso da recursividade torna a execuo do nosso
programa mais custosa, visto que so efetuadas vrias chamadas de
funo. Uma chamada de funo leva mais tempo para ser processada
que um comando de repetio comum.
Portanto, a recursividade deve ser usada com cautela. s vezes,
um algoritmo um pouco mais complexo que usa um pouco mais de
variveis pode ser necessrio para que se tenha um desempenho melhor.

1. (Resolvido) Faa um programa que contenha uma funo


recursiva que receba dois nmeros e calcule o mdc (Mximo Divisor
Comum) entre eles.

130 UNIDADE 5
Execuo:

2. Faa um programa que contenha uma funo recursiva, receba um


nmero i e retorne o i-simo termo da srie de Fibonacci. Use-o para
fazer receber o nmero i do usurio e escrever a srie at esse i-simo
termo. A srie de Fibonacci tem seus nmeros obtidos a partir da soma
dos dois valores anteriores, sendo que os dois primeiros so um: 1 1 2
3 5 8 13.
Ex: Entrada: 5. Sada: 1 1 2 3 5
3. Implemente, atravs de funes recursivas, o algoritmo conhecido
como torres de Hanoi. Nesse problema voc tem n pinos na torre A, cada
um de um tamanho, e deve mov-los para a torre B com a ajuda de uma
torre auxiliar C. A nica restrio que um pino maior no deve ficar sobre
um menor. Dica: esse problema parecido com o fatorial, para resolver
o problema grande devemos resolver o problema imediatamente menor
(n - 1) e assim por diante at chegarmos ao problema mais simples, onde

LABORATRIO DE PROGRAMAO 131


h somente um pino em A para mov-lo para B. Veja o esquema:
hanoi(n, A, B) =
hanoi(n-1, A, C)
passa o pino grande de A para B
hanoi(n-1, C, B)

4. Trabalho Final: Crie uma estrutura para representar os dados de um


aluno, com matrcula de tipo inteiro, nome de tipo string, endereo do
tipo string, data de nascimento de tipo data e um vetor de disciplinas do
tipo disciplina. O tipo data deve ser definido como uma estrutura com os
membros dia, ms e ano de tipo inteiro. O tipo disciplina tambm deve
ser definido como uma estrutura com nome do tipo string, professor do
tipo string e notas como sendo um vetor de trs floats para armazenar as
notas do aluno naquela disciplina. Com essa estrutura faa as seguintes
operaes:
a. Crie um vetor de vinte posies para armazenar o cadastro de
alunos da Universidade Aberta do Piau.
b. Crie uma varivel fim que demarcar a ltima posio atualmente
preenchida em seu cadastro de alunos.
c. Preencha os dados de cinco alunos automaticamente via
comandos, para que seja possvel testar todas as funes mesmo
sem cadastrar manualmente alguns alunos.
d. Faa com que o programa apresente um menu atravs de
uma funo onde o usurio possa escolher entre as funes de
cadastrar aluno, excluir aluno, alterar aluno, buscar aluno, listar
todos os alunos, listar aluno de determinada disciplina, listar alunos
aprovados e sair. Cada funcionalidade deve ser feita como uma
funo em separado.
e. O usurio dever poder escolher qualquer das opes, qualquer
quantidade de vezes. Somente ao escolher a opo sair o programa
deve ser finalizado.

132 UNIDADE 5
f. Quando a opo cadastrar aluno for escolhida, leia todos os
dados de um aluno e o inclua na primeira posio livre do vetor. A
varivel fim deve ser aumentada de um
g. Se j houver vinte alunos cadastrados (limite do nosso vetor), o
programa dever mostrar a mensagem Impossvel cadastrar. Vetor
cheio.
h. Quando a opo excluir aluno for escolhida, o programa dever
solicitar a posio que o usurio deseja excluir. Caso a opo esteja
preenchida com um aluno no vetor, todos os elementos, a partir
daquela posio para frente devem ser puxados uma posio
para trs, para refletir a excluso. A varivel fim deve ser reduzida
de um. Caso contrrio, dever ser exibida a mensagem Impossvel
excluir. Posio invlida.
i. Quando a opo alterar aluno for escolhida, o usurio dever
escolher a posio a alterar. Caso esta posio esteja preenchida
com os dados de um aluno, o programa dever mostrar os dados
atuais e pedir para o usurio digitar novamente todos os dados
para aquele aluno. Caso contrrio, dever mostrar a mensagem
Impossvel alterar. Posio no preenchida.
j. Quando a opo buscar aluno for escolhida, o programa dever
solicitar ao usurio o nome a procurar. Aps isso, o programa ir
buscar, entre os aluno cadastrados, um com nome procurado (ou
parte dele). Caso encontre, dever mostrar todos os dados desse
aluno. Caso contrrio, dever exibir a mensagem Aluno no
encontrado.
l. Quando a opo listar todos os alunos for selecionada, o programa
deve exibir todos os dados de todos os alunos cadastrados at o
momento. Se nenhum funcionrio estiver cadastrado, dever exibir
a mensagem Nenhum funcionrio cadastrado.
m. Quando a opo listar alunos de determinada disciplina for
selecionada, o programa deve solicitar ao usurio o nome de uma
disciplina e procurar e mostrar, entre os alunos cadastrados, os
que estejam naquela disciplina. Liste todos os alunos com as
respectivas notas, mdias e resultados finais (AM para mdia >= 7,
EF para 7 > mdia >= 4 e RN para mdia < 4). Caso no encontre
nenhum, mostrar a mensagem Nenhum aluno encontrado para a
disciplina procurada.
n. Quando a opo listar alunos aprovados for selecionada, o
programa dever procurar os alunos cadastrados que possuem

LABORATRIO DE PROGRAMAO 133


como mdia (soma das trs notas na disciplina dividida por trs)
um valor maior ou igual a sete. Caso no seja encontrado nenhum
aluno, mostrar a seguinte mensagem: Nenhum aluno aprovado
encontrado.
l. Quando a opo sair for escolhida, o programa dever finalizar.

Nessa ltima unidade estudamos os conceitos de funes e


procedimentos, como forma de modular nossos programas, ou seja,
como transformar problemas grandes em problemas menores e mais
fceis de resolver, de lidar e de usar. Dessa forma, damos mais clareza
a nossos programas e reduzimos a quantidade de linhas de cdigo por
funo. Assim, os nossos programas ficam mais fceis de entender, de
manipular e de alterar futuramente, caso necessrio.

134 UNIDADE 5
Exerccios de Introduo a algoritmos. Disponvel por www em: http://
www.guj.com.br/posts/list/120244.java, acesso em 10 de agosto de 2010,
s 22:00.

ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene A. V.i de.


Fundamentos da Programao de Computadores algoritmos: Pascal
e C/C++. 1 ed. So Paulo: Pearson Education, 2003.

C++ Language Tutorial. Disponvel por www em: http://www.cplusplus.


com/doc/tutorial/, acesso em 10 de agosto de 2010, s 22:00.

C++ Programming. Disponvel por www em: http://users.evtek.


fi/~hannuvl/ke06/cplusplus_cap.htm, acesso em 10 de agosto de 2010
s 22:00.

CORMEN, Thomas H. Algoritmos: teoria e prtica. 1 ed. Rio de Janeiro:


CAMPUS, 2002.

Curso de Linguagem C. Disponvel por www em: http://ultradownloads.


uol.com.br/download/Curso-de-Linguagem-C/, acesso em 10 de agosto
de 2010, s 22:00.

Curso de Programao C++. Disponvel por www em: http://s2i.das.


ufsc.br/downloads/Curso_Programacao_Cplusplus_LCI.pdf, acesso em
10 de agosto de 2010, s 22:00.

Curso de Programao C da UFMG. Disponvel por www em: http://www.


descolando.com.br/resources/Curso_de_C_da_UFMG_1.pdf, acesso em
10 de agosto de 2010, s 22:00.

Curso de Programao em C++. Disponvel por www em: http://www.


ift.unesp.br/users/mmenezes/cpp/cpp.html, acesso em 10 de agosto de
2010, s 22:00.

De Objective Caml para C e C++/Os tipos bsicos. Disponvel

LABORATRIO DE PROGRAMAO 135


por www em: http://pt.wikibooks.org/wiki/De_Objective_Caml_
para_C_e_C%2B%2B/Os_tipos_b%C3%A1sicos, acesso em 10 de
agosto de 2010, s 22:00.

DEITEL, H. M. e DEITEL, P. J. C++: Como programar. Porto Alegre: 5


ed. Bookman, Brasil, 2006.

Exerccios de programao II. Linguagem de Programao C. Disponvel


por www em: http://fit.faccat.br/~fpereira/apostilas/exercicios_c_mar2008.
pdf, acesso em 10 de agosto de 2010, s 22:00.

FARRER, Cristiano G. Becker; FARIA, Eduardo; ET al. Algoritmos


Estruturados. 3 ed. So Paulo: LTC, 1999.

FRIGERI, Alceu Heinke; COPSTEIN, Bernardo; PEREIRA, Carlos


Eduardo. Curso de C++. Porto Alegre, 1996.

GUIMARES, A. M. e LAGES, N. C. Algoritmos e Estrutura de Dados.


LTC, 1994.

HARBISON III, Samuel P.; STEELE/JR., Guy; HARTMANN, Savannah.


C: Manual de Referncia. 1 ed. Rio de Janeiro: Cincia Moderna, 2002.

JNIOR, Edwar Saliba. Estruturas de Dados. Notas de Aula. Faculdade


de Tecnologia INED, Belo Horizonte, 2007.

KERNIGHAN, Brian. The C Programming Language, 2nd edition.


Prentice Hall, 1988.

KNUTH, D. E. The Art of Computer Programming. Vol. 1. Fundamental


Algorthms. Addison Wesley, Reading, Mass., 1973.

MANZANO, J.A.N.G.. Algoritmos: lgica para desenvolvimento de


programao de computadores. 1 ed. So Paulo: Erica, 2002.

MIZRAHI, Victorine Viviane. Treinamento em linguagem C: mdulos 1 e


2 : PLT.. 1 ed. So Paulo: Pearson Prentice Hall, 2007.

Parmetros interessantes do scanf e do printf em C. Disponvel por


www em: http://www.vivaolinux.com.br/artigo/Parametros-interessantes-
do-scanf-e-do-printf-em-C/, acesso em 10 de agosto de 2010, s 22:00.

SCHILDT, Herbert. C Completo e Total. 3 edio revista e atualizada.


So Paulo: Makron Books, 1996.
SZWARCFITER, J. L. E MARKEZON, LILIAN. Estrutura de dados e
seus algoritmos. Editora LTC. 1996.

TENEMBAUM, Aaron Ai; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J.


Estruturas de Dados Usando C. So Paulo: Makron Books, 1995.

VELOSO, Paulo, Et Alli: Estrutura de Dados. Editora Campos, 2a edio,


1984

ZIVIANI, Nivio. Projeto de algoritmos com implementaes Pascal e


C. 4. ed. So Paulo: Pioneira, 1999.

Jos Ricardo Mello Viana

Possui graduao em
bacharelado em Cincia da
Computao pela Universidade
Federal do Piau (2006) e
mestrado em Engenharia de
Sistemas e Computao pela
Universidade Federal do Rio de
Janeiro (2009). Tem experincia na
rea de Cincia da Computao,
com nfase em Computao
Grfica e Programao, atuando
principalmente nos seguintes
temas: Algoritmos e Programao, Estruturas de Dados, Computao
Grfica, Programao em GPU, Programao para a Web, entre outros.
Atualmente professor efetivo da Universidade Federal do Piau, lotado
no Campus Senador Helvdio Nunes de Barros, em Picos.