Você está na página 1de 113

Laboratrio de Programao

Jos Ricardo Mello Viana


APRESENTAO

Ol pessoal, nosso objetivo nesta disciplina por em prtica os


conceitos vistos em Algoritmos e Programao I. Durante toda a disciplina
teremos muitos exemplos, exerccios resolvidos e exerccios propostos com
o objetivo de estimular o aluno a colocar a mo na massa ao implementar
os algoritmos descritos.

Todas as atividades aqui propostas devem ser realizadas, a fim de


propiciar ao aluno cada vez mais confiana na resoluo de problemas
atravs de algoritmos computacionais. Sendo, 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 por 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 sequenciamente. 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.

Esse material foi preparando 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 os alunos poderem implementar os exemplos
e resolver os exerccios mesmo na ausncia de internet para eventuais
pesquisas.

Ento, isso pessoal, aproveitem a disciplina para praticar bastante.


Mos obra e bons estudos!
Unidade 1 Primeiros passos

Nesta unidade, iremos primeiramente preparar nosso ambiente de


programao. Veremos como instalar nossa IDE, o Eclipse, e como preparar
o compilador para que possamos executar nossos primeiros exemplos na
linguagem de programao C.

Percebendo a diversidade de alunos e plos que devemos encontrar,


esta unidade dispe de instrues para preparao do ambiente tanto para
o sistema operacional Windows como para o sistema operacional Linux.

Vamos, tambm, rever exemplos simples de C para praticar os


comandos de entrada e sada (printf e scanf).
1 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 para nossa
disciplina 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).

1.1 Instalao do Compilador C

Primeiramente iremos 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.

1.1.1 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:

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 pressionarmos next seremos redirecionados a 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

Ao prosseguirmos 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 aceitarmos a licena de uso veremos a tela de Figura 4. Nela,


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

Figura 5. Instalao do MinGW: escolha de componentes

Aps escolhermos a verso seremos redirecionados para a tela da


Figura 5, onde deveremos escolher quais componentes sero instalados. Por
padro, selecionada a opo MinGW base tools, que instalar todo o
ferramental necessrio para desenvolvermos em C. Podemos selecionar
apenas ela e continuarmos pressionando next.

Figura 6. Instalao do MinGW: Escolha da pasta

Na prxima tela (Figura 6) deveremos 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) escolheremos 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).

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 seremos redirecionados para a tela de
finalizao a seguir (Figura 9)

Figura 9. Finalizao da instalao do MinGW

1.1.2 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 encarregara de baixar da internet os arquivos
necessrios e instal-los em nosso computador. Ser solicitada uma senha
para a instalao do aplicativo, devemos informar a mesma senha usada
para efetuar login no sistema. (Em alguns ambientes Linux o compilador C
vem instalado por padro. Para verificarmos isso basta tentarmos 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).

1.2 Instalao do Eclipse

O Eclipse uma Ambiente para Desenvolvimento Integrado


(Integrated Develpment 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 especificar 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).

Feito isso, estamos com tudo pronto para comearmos a criar nossos
primeiros programas em C usando o ambiente que acabamos de instalar.
1.3 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

Nesta 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

Se tudo correu bem, estamos aptos a criar nosso primeiro algoritmo


em C usando o ambiente Eclipse + MinGW ou GCC.

1.4 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

Nesta janela (Figura 13) iremos 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.

Deveremos 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, nesse 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

1.5 Entendendo o projeto criado

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


automaticamente para edio no eclipse (Figura 15):

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 correspondente.
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).

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 segui (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.

1.6 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

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 sada do nosso
programa. Por exemplo: \n (quebra de linha), \t (tabulao), \\ (escreve a
barra), entre outros.

- Exerccios

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:

1.7 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 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 esquecer-nos 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

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

Vale ressaltar 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.

1.8 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.

Os tipos de variveis bsicos em C so:

Tipo em C Significado Exemplos

void Sem tipo -

int Nmeros inteiros 10, 35, 0, -89

float Nmeros reais 3.14, -5.333, 0.0

char Caracteres A, z, 0, ;, *
Alfanumricos

bool Valores lgicos true, false

Tabela2. Tipos bsicos de C

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>

1.8.1 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)

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.

1.9 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 19):

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
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 20,


a seguir:

Figura 23. Resultado da execuo

1.9.1 Expresses

Podemos criar expresses aritmticas, relacionais e lgicas usando os


respectivos operadores que a linguagem disponibiliza. Vejamos alguns
deles:

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 Smbol
o

Conjuno E &&

Disjuno OU ||

Negao NO !

Tabela 5. Operadores lgicos

- Exerccios

1. Faa um programa que leia um nmero 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 e calcule e


imprima o resultado da diviso inteira e o resto da diviso inteira entre
eles.

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 gasta 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. (A = 2 * pi *


r * ( r + h) e V = pi * r * r * h)

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 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:
Unidade 2 Comandos de seleo e de repetio

Nesta unidade, abordaremos os comandos de seleo e de repetio


em C, comandos essenciais no aprendizado de qualquer linguagem de
programao. Os comandos if, if-else e switch nos daro a possibilidade de
escolher uma determinada parte do cdigo para ser executada ou no. J os
comandos for, while e do-while sero responsveis por executar uma
mesma parte do cdigo vrias vezes consecutivas.
2. 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
sequencia, 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.

2.1 Comandos de Seleo

Quando estamos desenvolvendo a lgica de nossos algoritmos,


frequentemente precisamos realizar algum tipo de teste e, a partir do
resultado desse teste, 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 seleo mltipla.

Os comandos de seleo que C possui so: if (seleo simples), if-else


e switch (seleo mltipla).

2.1.1 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 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) deveremos 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):
Figura 23. Exemplo de if

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

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

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 percebemos a diferena:

Figura 26. 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 27 e Figura 28) 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 o aluno 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,
voltem aos exemplos anteriores e verifiquem a explicao. De agora em
diante sero explicadas apenas as linhas com contedo novo.

Figura 26. Resultado da execuo com idade = 24

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 do 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
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

- Exerccios

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


se o primeiro maior que a soma dos outros dois.
Execuo:

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


Imprimir NOME CORRETO se for igual e imprimir NOME 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 30km/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)
6. Faa um programa que receba 3 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 4 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 400 ou se ele for divisvel por 4 mas
no por 100.

2.1.2 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 o valor verdadeiro de uma condio, mas tambm para o valor
falso. Este o objetivo do comando if-else onde, 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, essa estrutura (Figura 32).

Figura 32. Exemplo de if-else


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

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 que 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


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

- Exerccios

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.
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 3 escrever TRIGULO e o valor do


seu permetro.

b. Se o nmero de lados for igual a 4 escrever QUADRADO e o valor


da sua rea.

c. Se o nmero de lados for igual a 5 escrever PENTGONO.

d. Em qualquer outra situao escrever Polgono no identificado.

5. Faa um programa que leia 3 valores e verifique se formam um tringulo


(O valor de cada lado tem que ser menor que a soma dos outros dois).
Caso positivo, classifique esse tringulo em Tringulo equiltero (Possui
os 3 lados iguais), Tringulo issceles (Possui 2 lados iguais) e Tringulo
escaleno (Possui 3 lados diferentes).

6. Faa um programa que leia o valor de 3 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 (possui um ngulo obtuso maior que 90 graus)

7. Faa um programa que leia um nmero e imprima se ele par ou mpar.

8. 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!

9. 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.

10.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.

2.1.2 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;

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

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 indicamos 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

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.

- Exerccios

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 maior que 12 ou menor que 1 dever
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.

9. Utilize a estrutura switch 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.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.

2.2 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.

2.2.1 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. Quando a
condio for falsa, a repetio ir 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 exemplo de 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 ir continuar enquanto o valor de i no
ultrapassar o valor 10. Por ltimo temos o incremento (i++), que significa
que a varivel i ir 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 ir 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
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

- Exerccios

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.
Execuo:

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.

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 0*4=0 0/4=0


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

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.

11.Faa um programa que receba um nmero e verifique se ele primo ou


no.

2.2.2 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 iro 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 repetio ir 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 ira sair da repetio.
Figura 49. Exemplo de utilizao do while

Neste programa, as linhas 9, 10 11, 12, 13 e 14 iro se repetir


atravs do comando while. Essa repetio ir terminar no momento em que
a varivel numero 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

- Exerccios

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,
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 numero inicial da contagem: 5

Entre com o numero final da contagem: 9

56789

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 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 numero: 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 invalida! 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 media: 5.66

Continuar (sim/no)? no

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 imprime na tela a srie de


Fibonacci at um nmero dado. Esta sria 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:

2.2.2 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 ira executar nenhuma vez. Entretanto,
no do-while, pelo teste ser depois, o 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, inicializamos 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
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

Podemos, ainda, usar esse 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


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).

- Exerccios

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

2. Escreva um programa que dados dois nmeros, imprime o MMC.

3. Escreva um programa que dados dois nmeros, imprime o MDC

4. Escreva um programa que imprime 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 dado uma entrada, diga se o


nmero primo ou no.
Execuo:

6. Escreva um programa que imprime 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 imprime 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.

2.2.3 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.

2.2.3.1 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.

2.2.3.2 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.
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

- Exerccios

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


imprimir a metade de cada um deles.
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.

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 pra
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, onde um escolhe a rvore
em que o marciano ir se esconder, e o outro tenta acertar.
Unidade 3 Vetores e matrizes

Veremos, nesta unidade, uma forma de agruparmos diversos dados


em uma mesma estrutura, os vetores (e matrizes). Atravs deles, podemos
armazenar, em sequncia, diversos elementos do mesmo tipo e,
posteriormente, acess-los de forma simples e rpida. Abordaremos um
vetor especial, o vetor de char, tambm chamado de string, atravs do qual
podemos manipular cadeias de caracteres na linguagem de programao C.
3.1 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 (aluno1, aluno2, ..., aluno30), 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 declaramos
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

Com a declarao de um vetor, criamos uma sequncia de elementos


no qual podemos armazenar vrios valores e acess-loa 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
esta linha 12 atravs de um comando de repetio. Vejamos essa
transposio na Figura 64, a seguir:

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:

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

- Exerccios

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


deles.

3) Faa um programa que leia 10 valores em um vetor. Depois de ler o


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.

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

3.2 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]

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 ir 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

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

- Exerccios
1) (Resolvido) Faa um programa que receba seu nome e escreva bom dia
para voc.

Execuo:

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.

3.2.1 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 ser 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)

strcmp(string1, string2) Comparao entre duas strcmp(nome,


strings (0: iguais; endereco)
diferente de 0 caso
contrrio)

strcpy(string1, string2) Cpia do contedo de strcpy(nome, endereco)


string2 em string1

strcat(string1, string2) Concatena 2 string: strcat(nome, endereco)


junta string2 no final de
string1

Tabela 6. Funes para trabalhar com strings

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

- Exerccios

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
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
seqncia de caracteres. Ex.: ASA, SUBI NO ONIBUS. Desconsidere os
espaos.

10) Faa um programa que receba 3 nome e os coloque em ordem


alfabtica. Dica: use a funo strcmp.

3.3 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

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 inicializar 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 inicializado 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

Esta forma de inicializao 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 inicializao da matriz na prpria declarao,


temos a seguinte sada (Figura 76):

Figura 76. Sada do programa com inicializao 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:

Figura 77. Utilizao de vetores de string

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 inicializando a matriz no momento da declarao;
Figura 78. Inicializao de uma matriz de strings

Na figura 79 temos a sada para este programa. Percebam tanto na


leitura, atravs do gets, quanto na escrita, pelo printf, o acesso string se
d apenas por um ndice.

Figura 79. Possvel sada do programa com matrizes de strings

- Exerccios

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 um a 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.
Execuo:

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


matriz e sua transposta. Na matriz transposta se troca linhas por colunas
e colunas por linhas da matriz original. Veja a figura a seguir:
5) Faa um programa que receba uma matriz e verifique se ela uma
matriz simtrica. Uma matriz simtrica significa que ela igual a 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
inicializadas 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:

11) Faa um programa que receba 5 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 10 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
atestado contm a string testa, ento deve ser impressa.

13) Faa um programa que receba 10 nomes em uma matriz de strings e


imprima os nomes que forem repetidos.

14) Faa um programa que receba 10 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:
Unidade 4 Estruturas

Na unidade anterior, estudamos vetores e matrizes, construes


homogneas da linguagem C. Ou seja, s podamos armazenar valores do
mesmo tipo. Nesta unidade iremos introduzir o conceito de estruturas,
atravs das quais podemos armazenar dados de tipos diferentes na mesma
construo. 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.
4.1 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.

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

Aqui, declaramos 2 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 amanha. 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


4.2 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:

Figura 83. Criao de um tipo de dados

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


criar 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 declaramos 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

Usando a definio de tipos, 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 nas 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 formas de
declarao. Inclusive o resultado da execuo desses programas permanece
o mesmo, j mostrado na Figura 82.

- Exerccios
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

b. Mostrar pessoa: com escrita na tela de todos os dados


correspondente 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 devera
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

4.3 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 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

Neste 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:
Figura 88. 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 89.

Figura 89. Resultado da execuo

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


estruturas que contenham vetores como membros. Dessa forma, podemos
tambm inicializ-lo de forma prtica, no momento da declarao, como
vimos na unidade anterior. Segue, na Figura 90, um exemplo de utilizao
desta forma:
Figura 90. 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 91.

Figura 91. Resultado da execuo

4.4 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 92).
Figura 92. 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.

- Exerccios

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 inicializ-lo no momento da declarao. Dever, ainda,
mostrar uma tabela de nomes e telefones com os dados armazenados no
vetor.
Execuo:

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

i. O usurio dever poder escolher qualquer das opes


qualquer quantidade de vezes. Somente ao escolher a
opo sair o programa deve ser finalizado.

d. 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

i. Se j houverem vinte funcionrios cadastrados (limite do


nosso vetor), o programa dever mostrar a mensagem
Impossvel cadastrar. Vetor cheio

e. 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 reduzida de um. Caso contrrio, dever ser
exibida a mensagem Impossvel excluir. Posio invlida

f. 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

g. 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

h. 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

i. Quando a opo sair for escolhida, o programa dever finalizar


Unidade 5 Funes e Procedimentos

Nesta ltima unidade, estudaremos os conceitos de funes e


procedimentos, como forma de modularizar nossos programas, ou seja,
transformar problemas grandes em problemas menores e mais fceis de
resolver, de lidar e de usar. Dessa forma, daremos mais clareza a nossos
programas e reduziremos a quantidade de linhas de cdigo por funo.
Sendo assim, nossos programas ficaro mais fceis de entender, de
manipular e de alterar futuramente, caso seja necessrio.
5.1 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 as 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 93) e que no faa nada para verificarmos o conceito e o modo de
declarao de funo.

Figura 93. 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:

tipo_de_retorno nome_da_funo ( ) {

comandos;

A primeira a 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 colocamos 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 parntesis. Entre esses parntesis
ficaro os parmetros da funo, s que, no momento, no abordaremos
isso, ficando mais para frente. Feito isso a declarao est 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.

5.2 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,
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 parntesis. Como, em
nosso caso, ainda no teremos parmetros, basta colocar os parntesis
vazios. Vejamos o exemplo a seguir na Figura 94.

Figura 94. 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 impressas os dois textos da 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 95.

Figura 95. Resultado da execuo

Na Figura 96, temos outro exemplo de funo que calcular a soma


de dois valores e retornar esse valor como resultado da funo.

Figura 96. 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). Percebamos 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.

5.3 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.

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
97.

Figura 97. 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 parntesis (como no h nenhum ainda, ficam somente os
parntesis). O resultado da execuo deste programa est na Figura 98.

Figura 98. 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.

5.4 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 parntesis 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 99:
Figura 99. Declarao de funo com parmetros

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

Figura 100. 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.

- Exerccios

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.

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
deveremos 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 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.

5.5 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 globais e variveis locais.

5.5.1 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. Em outro
lugar do programa, variveis locais no podem ser usadas. Vejamos o
exemplo da Figura 101:
Figura 101. 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


102:

Figura 102. Resultado da execuo

5.3.2 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 103):
Figura 103. 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 104):
Figura 104. Anlise de variveis globais

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 105, o resultado da
execuo desse programa:

Figura 105. 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.

5.6 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.

5.6.1 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 106:

Figura 106. 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 numero 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 107. Resultado da execuo

5.6.2 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 108:

Figura 108. 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, e


no um inteiro propriamente dito, devemos passar um endereo de
memria. Para isso usamos o operado &, 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


109:

Figura 109. Resultado da execuo

- Exerccios
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.

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).

5.7 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, 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 110):

Figura 110. 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 111 temos um exemplo dessa utilizao:

Figura 111. Supresso de nomes de parmetros no prottipo

O resultado da execuo deste programa encontra-se na Figura 112:

Figura 112. 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.

5.8 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 essa
chama a primeira.
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 113):

Figura 113. 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) =

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 114.

Figura 114. 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.

- Exerccios

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


receba dois nmeros e calcule o mdc (Mximo Divisor Comum) entre
eles.
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 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 3 floats para armazenar as
notas do aluno naquela disciplina. Com essa estrutura faa as seguintes
operaes:

a. Crie um vetor de 20 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 5 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 aluno, listar aluno de determinada disciplina, listar alunos
aprovados e sair. Cada funcionalidade deve ser feita como uma
funo em separado.

i. 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 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
i. Se j houverem vinte alunos cadastrados (limite do nosso
vetor), o programa dever mostrar a mensagem
Impossvel cadastrar. Vetor cheio.

f. 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.

g. 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.

h. 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.

i. Quando a opo listar todos os alunos for selecionada, o programa


deve exibir todos os dados de todos os aluno cadastrados at o
momento. Se nenhum funcionrio estiver cadastrado, dever
exibir a mensagem Nenhum funcionrio cadastrado.

j. 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.

k. Quando a opo listar alunos aprovados, o programa dever


procurar os alunos cadastrados que possuem como mdia (soma
das 3 notas na disciplina dividida por 3) um valor maior ou igual a
7. 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.


REFERNCIAS BIBLIOGRFICAS

[1] 33 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.

[2] 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.

[3] C++ Language Tutorial. Disponvel por www em:


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

[4] C++ Programming. Disponvel por www em:


http://users.evtek.fi/~hannuvl/ke06/cplusplus_cap.htm, acesso em 10 de
agosto de 2010 as 22:00.

[5] CORMEN, Thomas H. Algoritmos: teoria e prtica. 1 ed. Rio de


Janeiro: CAMPUS, 2002.

[6] 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.

[7] 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.

[8] 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.

[9] 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.

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


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.

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


ed. Bookman, Brasil, 2006.

[12] 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.
[13] FARRER, Cristiano G. Becker; FARIA, Eduardo; ET al. Algoritmos
Estruturados. 3 ed. So Paulo: LTC, 1999.

[14] FRIGERI, Alceu Heinke; COPSTEIN, Bernardo; PEREIRA, Carlos Eduardo.


Curso de C++. Porto Alegre, 1996.

[15] GUIMARES, A. M. e LAGES, N. C. Algoritmos e Estrutura de


Dados. LTC, 1994.

[16] HARBISON III, Samuel P.; STEELE/JR., Guy; HARTMANN, Savannah. C:


manual de referncia. 1 ed. Rio de Janeiro: Cincia Moderna, 2002.

[17] JNIOR, Edwar Saliba. Estruturas de Dados. Notas de Aula.


Faculdade de tecnologia INED, Belo Horizonte, 2007.

[18] KERNIGHAN, Brian. The C Programming Language, 2nd edition.


Prentice Hall, 1988.

[19] KNUTH, D. E. The Art of Computer Programming. Vol. 1.


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

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


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

[21] MIZRAHI, Victorine Viviane. Treinamento em linguagem C:


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

[22] 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.

[23] SCHILDT, Herbert. C Completo e Total. 3 edio revista e


atualizada. So Paulo: Makron Books, 1996.

[24] SZWARCFITER, J. L. E MARKEZON, LILIAN. Estrutura de dados e


seus algoritmos. Editora LTC. 1996.

[25] TENEMBAUM, Aaron Ai; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J.


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

[26] VELOSO, Paulo, Et Alli: Estrutura de Dados. Editora Campos, 2a


edio, 1984

[27] ZIVIANI, Nivio. Projeto de algoritmos com implementaes


Pascal e C. 4. ed. So Paulo: Pioneira, 1999.
SOBRE O AUTOR

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.