Anda di halaman 1dari 62

Algoritmos

Prof. Hilton Cardoso Marins Junior.

IF Sudeste MG - Campus Juiz de Fora

Ncleo de Informtica

2015
1. Introduo
Para termos sucesso em nosso curso ser necessrio entender alguns termos relacionados
programao de computadores. O primeiro termo a ser abordado ser Processamento de
dados. Voc j deve ter uma ideia do que venha a ser processamento de dados.
Processamento, isoladamente, indica transformao, a obteno de um resultado a partir da
transformao de algo fornecido inicialmente. Pode-se falar em processamento de laranja em
suco, de sucata em placas metlicas, dentre outros. Estamos interessados somente no
processamento de dados, ou seja, na transformao de dados. Para que o processamento de
dados ocorra necessrio haver dados de entrada e a transformao destes em outros dados,
chamados de dados de sada ou resultado. Processar dados produzir novas informaes
atravs de dados iniciais.

Entrada Processamento Sada de


de Dados de Dados Dados

Processamento de Dados

Em nosso curso iremos nos concentrar especificamente em processamento de dados


automtico. Para que o processamento de dados seja classificado como automtico, no deve
haver interferncia do homem durante o processamento. Mas como processar dados sem a
interferncia humana? Existe alguma mquina capaz de realizar isso? Sim, existe e essa
mquina o computador.

O computador realiza o processamento de dados automaticamente e isso s possvel porque


ele consegue executar as instrues que lhe so dadas previamente. O computador uma
mquina capaz de processar dados de forma automtica atravs de instrues que lhe so
fornecidas.

Podemos utilizar o computador para realizar uma tarefa, desde que ele seja instrudo de forma
adequada. Agora surge uma nova questo: como instruir o computador a executar uma tarefa
para resolver um determinado problema?

Para resolver um problema atravs do computador necessrio encontrar em primeiro lugar


uma maneira de descrev-lo de uma forma clara e precisa. Se voc no consegue descrever a
soluo de um problema no conseguir instruir o computador a resolv-lo. Devemos
encontrar uma sequncia de passos que conduzam soluo. Chamamos esta sequncia de
passos de algoritmo.

Algoritmo a descrio de uma sequncia de aes para realizar alguma tarefa. So exemplos
de algoritmos: receita de um bolo, manual de montagem de um mvel, instrues de como
chegar a um determinado local, dentre outros. Passaremos boa parte do nosso curso
desenvolvendo algoritmos e em todas as situaes devemos nos preocupar com as
caractersticas presentes em qualquer algoritmo:

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 2 de 62
1) Todo algoritmo, ao resolver um problema, produz a soluo do mesmo. Sempre
produzir algum resultado, que de agora em diante chamaremos de sada.
2) Deve sempre terminar aps um nmero finito de passos (instrues).
3) Cada passo, de um algoritmo, deve ser precisamente definido. As aes devem ser
definidas rigorosamente e sem ambiguidades.
4) As aes definidas no algoritmo necessitam de dados para que possam produzir as
sadas. Esses dados so as entradas.

Nota: Pode haver mais do que um algoritmo para resolver um problema. Por exemplo, para ir
de casa at o trabalho, posso escolher diversos meios de transportes em funo do preo,
conforto, rapidez, etc..

Alguns exemplos de algoritmos

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 3 de 62
Para facilitar o processo de construo de algoritmos, surgiram formas de represent-los.
Algumas mais importantes:

1) Descrio Narrativa: algoritmos so expressos diretamente em linguagem natural.


2) Fluxograma: uma representao grfica de algoritmos onde formas geomtricas
diferentes implicam aes (instrues, comandos) distintas. Tal propriedade facilita o
entendimento das idias contidas nos algoritmos e justifica sua popularidade.
3) Portugol: Representao de algoritmos em um linguagem muito semelhante ao
Portugus.

inicio
leia (NOTA1, NOTA2)
MEDIA = (NOTA1+NOTA2)/2
se MEDIA >= 7 ento
mostra("Aprovado")
seno
mostra("Reprovado")
fim_se
fim.

Portugol

Fluxograma

Em nossos estudos s nos interessa os algoritmos computacionais, que descrevem sequncia


de aes que possam ser implementadas no computador. Tais algoritmos devem passar por
um processo de adequao para que o computador possa execut-los. Um algoritmo em um
formato adequado para execuo pelo computador chamado de programa. Um programa de
computador, nada mais do que um algoritmo em determinado formato que o computador
consegue execut-lo. A elaborao de um programa consiste na codificao precisa de um
algoritmo, segundo uma linguagem de programao especfica.

Uma linguagem de programao uma forma de padronizar a comunicao de instrues


para um computador. Assim como h muitos idiomas, h muitas linguagens de programao
(C, Java, PHP, etc). Mas como o computador entender as instrues escritas em uma
determinada linguagem de programao?

Os circuitos eletrnicos de cada computador podem reconhecer um conjunto limitado de


instrues primitivas. Estas instrues formam uma linguagem que torna possvel s pessoas
se comunicarem com o computador. Tal linguagem denominada linguagem de mquina.
Programar em linguagem de mquina difcil e tedioso. Infelizmente, todos os programas,
para serem executados pelo computador, devem ser escritos em linguagem de mquina. Para
resolver este problema, criamos programas utilizando o conjunto de instrues

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 4 de 62
disponibilizadas pela linguagem de programao escolhida. Isso bem mais conveniente para
as pessoas do que usar o conjunto de instrues em linguagem de mquina. Criar programas
utilizando instrues de uma linguagem de programao conveniente apenas para ns e no
para o computador, visto que este s conseguir executar um programa em linguagem de
mquina. Uma vez escrito o programa em C (por exemplo), o mesmo precisa ser traduzido
para a linguagem do computador para ser executado. Um dos mtodos de traduo de um
programa escrito em uma linguagem de programao para o correspondente em linguagem de
mquina chama-se compilao. O arquivo gerado, resultante do processo de compilao,
conhecido como programa objeto.

O Compilador um programa que converte o programa fonte, escrito em uma linguagem de


alto nvel, em programa objeto escrito em linguagem de mquina. Cada linguagem de
programao possui seu prprio compilador.

muito comum que um programa faa referncia a instrues localizadas em outro programa.
Dizemos que um programa chama ou invoca outro programa. Devido a este fato, um
programa objeto no executvel. Precisamos unir todos os programas objetos de todos os
programas fontes em um nico programa, este sim chamado de programa executvel e
como o prprio nome indica, pode ser executado pelo computador. Este processo de conexo
de um programa objeto, com outro programa objeto denomina-se ligao. Um
linkeditor/ligador um programa que rene mdulos compilados e arquivos (de dados ou de
bibliotecas) para criar um programa executvel.

Bibliotecas so arquivos que disponibilizam determinadas funcionalidades aos programas.


Geralmente as bibliotecas agrupam funes especficas, tais como para entrada e sada de
dados, matemticas e diversas outras. As bibliotecas disponibilizam funcionalidades que no
fazem parte diretamente do problema a resolver, elas apenas prestam um servio auxiliar.
Para ilustrar o conceito de bibliotecas no desenvolvimento de programas, imagine a situao
em que voc precisa desenvolver um programa para calcular a medida de uma escada para a
situao abaixo.

escada
parede

cho

Sabendo que

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 5 de 62
ento =

Voc percebeu que o nosso problema calcular a medida da escada, entretanto ser
necessrio o clculo do Sen , que no o clculo principal, mas importante para a soluo do
problema inicial. Precisamos de uma funo, localizada em uma biblioteca, para calcular o
seno do ngulo. A vantagem do uso de bibliotecas no nos preocuparmos com as
funcionalidades que no esto diretamente relacionadas soluo do problema. No caso
acima, o clculo do seno pode ser realizado por alguma funo de uma determinada
biblioteca. A implementao da funo que realiza o clculo do seno fica na biblioteca e no
no nosso programa. Ao realizar a link-edio todos os programas fontes sero ligados s
bibliotecas, gerando finalmente o programa executvel.

A figura abaixo ilustra os conceitos relacionados s etapas necessrias para a gerao de um


programa executvel.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 6 de 62
INCIO

Programa fonte em C
*.c

Compilador

Erro sim
?

no

Programa Objeto
Bibliotecas
*.o

LinkEditor

Erro sim
?
no

Programa Executvel

FIM

Criao de um programa executvel na linguagem C

Uma vez que o arquivo executvel tenha sido gerado, o programa est pronto para ser
executado. Depois que o programa executvel carregado na memria, a CPU executa o
programa instruo por instruo.

Existe outro mtodo de traduo para linguagem de mquina. Pelo mtodo de interpretao,
cada comando do cdigo fonte lido pelo interpretador, convertido em cdigo executvel e
imediatamente executado, antes que o comando seguinte seja lido.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 7 de 62
Conhecendo o ambiente de programao
Vamos agora conhecer nosso ambiente de desenvolvimento de programas e identificar na
prtica as fases da criao de um programa executvel. Codificaremos o nosso primeiro
programa de computador. Este programa muito simples, ele apenas mostra na tela do
computador a seguinte mensagem: Alo Mundo !!!

Em nosso curso usaremos o CodeBlocks como ambiente de programao. Existem outros e


voc pode ficar a vontade para escolher aquele que mais lhe agradar. Ambiente de
programao um programa cujo objetivo facilitar o trabalho de codificao atravs de
disponibilizao de funcionalidades como editar, salvar, abrir, compilar, executar programas,
dentre muitas outras. fortemente indicado que instale em seu computador pessoal. Basta
seguir o roteiro:

Acessar http://www.codeblocks.org.
Escolha a opo Downloads
Acesse o link Download the binary release
No caso do Windows, escolha uma das duas opes indicadas abaixo.

Instale e execute o Codeblocks. Digite o cdigo fonte abaixo.

Programa alomundo.c

1 main(){
2 printf(Alo Mundo !!!);
3 }
4
Salve o arquivo em sua pasta de trabalho com o nome de alomundo.c. A extenso do arquivo
deve ser c pois todo programa fonte escrito na linguagem C deve possuir esta extenso.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 8 de 62
Nome do programa fonte

Tipo de arquivo. No nosso


caso ser um programa
fonte da linguagem C ou
C++

Voc acabou de criar o seu programa fonte. O prximo passo gerar o executvel. Solicite a
criao do executvel e execute o programa (No CodeBlocks escolha a opo Build/ Build and
run). Agora acesse sua pasta de trabalho e verifique a existncia de trs arquivos. O arquivo
alomundo.c o seu programa fonte, o alunomundo.o o programa objeto e o
alunomundo.exe o programa executvel. O objetivo principal desta atividade prtica foi
mostrar os passos necessrios para gerar um programa executvel e possibilitar a identificao
dos diversos arquivos envolvidos no processo: programa fonte, programa objeto e programa
executvel.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 9 de 62
2. Tipos de dados primitivos
Sabemos que um programa constitudo de um conjunto de instrues que manipulam dados
e tem como objetivo solucionar um problema atravs do computador. Os dados so os valores
que sero utilizados na soluo do problema. Esses valores podem ser fornecidos por algum
dispositivo de entrada (teclado, mouse, disco rgido, dentre outros) ou originados de algum
clculo.

Para que um programa possa processar os dados fornecidos como entrada ou aqueles
resultantes de algum clculo, tais dados devem estar armazenados na memria. E como
fazemos isso? A soluo est no uso de variveis de memria.

Variveis de memria so locais na memria do computador que possuem a capacidade de


armazenar os valores a serem processados por um programa. Os valores so armazenados na
memria em compartimentos identificados por um endereo nico. O contedo
armazenado nesses endereos pode variar, entretanto armazenar um valor de cada vez, ou
seja, se colocarmos um segundo valor em uma varivel de memria o valor anterior perdido.

Para facilitar a referncia a um endereo de memria, as linguagens de programao


permitem nomear cada endereo utilizado em um programa. Ao implementar programas
devemos declarar os dados manipulados por este programa. Esta declarao corresponde a
rotular um local de memria com um nome e determinar o tipo de valores que este local pode
armazenar e por consequncia as operaes que pode efetuar. A este local chamamos de
varivel de memria. Uma varivel composta por dois elementos bsicos: o valor da varivel
e seu identificador. O identificador da varivel o seu nome (rtulo) e atravs dele que ser
possvel fazer referncia varivel dentro do programa.

Ao implementar um programa devemos solicitar a alocao de espao na memria para todas


as variveis que sero utilizadas. Essa ao chamada de declarao de varivel. As operaes
a serem realizadas com estas variveis devem levar em conta seus respectivos tipos. A
liberao deste espao da memria alocado s ir acontecer quando o programa finalizado.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 10 de 62
Exemplo de declarao de variveis
1 int telefone;
2 double salario;
3 float taxa = 0.5;
4 char turma = A

Linha Comentrio
1 Foi alocado um espao na memria para armazenar valores inteiros e este local foi
rotulado de telefone. Dentro do nosso programa, se desejarmos manipular o valor
que est armazenado neste endereo de memria, utilizaremos o identificador da
varivel, que nesse caso telefone.
2 Foi alocado um espao na memria para armazenar valores reais e este local foi
rotulado de salrio.
3 Foi alocado um espao na memria para armazenar valores reais e este local foi
rotulado de taxa. Simultaneamente declarao da varivel foi dado um valor
inicial de 0.5. Opcionalmente o programador pode, ao declarar uma varivel, inici-
la com um valor desejado.
4 Foi alocado um espao na memria para armazenar caractere (letra, algarismo e
smbolo). E este local foi rotulado de turma. Simultaneamente declarao da
varivel foi atribudo o caractere A. Para que o compilador entenda o A como um
caractere e no como o nome de outra varivel, por exemplo, devemos delimitar
com aspas simples.

Chamamos de tipos de dados primitivos aqueles tipos de dados pr-definidos na linguagem


de programao. Os tipos de dados vistos acima so exemplo de tipos de dados primitivos da
linguagem C.

Voc percebeu no exemplo acima o uso de dois tipos primitivos reais, o double e o float. A
diferena fica por conta da capacidade e preciso dos valores armazenados.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 11 de 62
3. Operadores

Em nosso curso criaremos programas que realizaro operaes com as variveis. Precisamos
conhecer alguns operadores da Linguagem C.

Operadores Comentrio
Aritmticos
* Multiplicao
/ Diviso
% Mdulo ou resto da diviso
+ Adio
- Subtrao

Operadores Comentrio
Relacionais
> Maior
>= Maior ou igual
< Menor
<= Menor ou igual
== Igualdade
!= Diferente

Operadores Comentrio
Lgicos
&& E
|| OU
Obs.: Os operadores lgicos so usados para concatenar expresses que estabelecem uma
relao entre valores.

Condio A Condio B A ou B (A ||B)


V V V
V F V
F V V
F F F
A expresso toda ser verdadeira se e somente se,
pelo menos, uma das condies for verdadeira.

Condio A Condio B A e B (A && B)


V V V
V F F
F V F
F F F
A expresso toda ser verdadeira se e somente se
todas as condies forem verdadeiras.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 12 de 62
E por fim temos o operador de atribuio. Como prprio nome diz, tem a funo de atribuir
valores s variveis.

Exemplo do uso do operador de atribuio

1 salario = 3600.80;
2 faltas = 5;
3 nome = Jos da Silva;
4 turma = 'A';
5 faltas = faltas + 1;

Linha Comentrio
1 Ateno para o separador de decimal (.)
3,4 Na linguagem C toda cadeia de caracteres (string) deve ser delimitada por aspas
duplas e todo caractere deve ser delimitado por aspas simples.
5 O smbolo de atribuio (=) no tem o mesmo significado que o usual da matemtica
que representa a igualdade de valores. Em C, representa a atribuio do valor ou
expresso localizada direita do operador de atribuio varivel localizada
esquerda do operador de atribuio. No caso desta linha, no se l que faltas igual
a faltas + 1. Diz-se que o valor da varivel faltas acrescido de 1 unidade ser
atribudo prpria varivel faltas, neste caso a varivel faltas passar a ter o valor 6.

Exerccios.
1. Qual o contedo das variveis n1 , n2, n3 e n4 ao final da execuo das linhas abaixo:

int n1, n2, n3, n4;


n1 = 17;
n2 = 2;
n3 = n1 / n2;
n4 = n1 % n2;

2. Qual o contedo da varivel n1 ao final da execuo das linhas abaixo:

int n1=10;
n1 = n1 + 1;

3. Qual o contedo das variveis n1 e n2 ao final da execuo das linhas abaixo:

int n1=0, n2=10;


n1 = n1 + 1;
n2 = n2 * 2;

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 13 de 62
4. Conceitos Iniciais na Linguagem C

Estamos perto de criar programas mais interessantes do que o alomundo.c. Para nos preparar
continuaremos a apresentao de alguns conceitos bsicos da linguagem C.

Comearemos com o conceito de funo. Uma funo um trecho de cdigo j pronto que
pode ser utilizado dentro do seu programa. Para usar uma funo pronta, basta escrever o
nome dela no seu cdigo. Dizemos que estamos chamando (ou invocando) a
funo. Como estas funes no esto implementadas em nosso cdigo e sim em outros
programas (bibliotecas), precisamos avisar ao compilador C o nome desta biblioteca.
Bibliotecas so conjuntos de funes prontas. O comando em C para incluir bibliotecas em um
programa :

#include <nome da biblioteca>

O conceito de funo muito importante e no futuro aprenderemos a criar nossas prprias


funes. Por enquanto, invocaremos funes j prontas e disponibilizadas nas bibliotecas da
linguagem C.

Outro aspecto importante relacionado funo o fato de que toda aplicao precisa ter um
ponto de partida, a partir do qual ela ser iniciada. Imagina uma aplicao com centenas de
programas. Quando esta aplicao for executada, comear por onde? No caso da linguagem
C, o programa comea pela funo principal, chamada main.

A forma de escrev-la a seguinte:

Formato simplificado de um programa em C

1 #include <stdio.h>
2
3 main ( ) {
4 . . .
5 . . .
6 . . .
7 }
8
Linha Comentrio
1 Indica a biblioteca necessria para a criao do executvel. Provavelmente neste
programa h uma chamada de uma funo implementada na biblioteca stdio.h
3 Nome da funo principal de um programa em C. A chave { indica incio da funo.
4 a 6 Corpo da funo.
7 A chave } indica fim da funo.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 14 de 62
Bibliotecas e funes
O nosso objetivo agora compreendermos melhor o papel das bibliotecas no
desenvolvimento de programas e como uma funo chamada (invocada). Analise o cdigo
abaixo.

Programa raiz.c ** Biblioteca math **


Aqui est a
1 #include <stdio.h> Implementao da
2 #include <math.h>
funo sqrt
3
4 main(){
5 float x = 9;
6 printf(Raiz Quadrada de %f: %f, x, sqrt(x));
7 }

Linha Comentrio
1 A biblioteca stdio.h foi declarada devido a presena da funo printf. A biblioteca
stdio.h (standard input output) rene funes padres para entrada e sada de
dados , incluindo a funo printf.
2 A biblioteca math.h rene diversas funes matemticas, incluindo a sqrt.
6 H uma referncia a funo (sqrt) que calcula a raiz quadrada de um nmero.
Invocamos a funo sqrt, que responsvel pelo clculo, passando a varivel x, cujo
valor 9. Neste momento o fluxo de execuo desviado para funo sqrt
localizada na biblioteca math.h. O clculo feito e o resultado (3) devolvido e o
fluxo de execuo retorna para o nosso programa. Finalmente o resultado devolvido
impresso na tela pela funo printf. Reparem que as implementaes das funes
printf e sqrt no constam no nosso cdigo fonte. As implementaes esto nas
respectivas bibliotecas. Lembre-se de que quando solicitar a criao do executvel,
tudo ser ligado em um nico programa executvel.

Execute o programa e verifique se est tudo funcionando corretamente.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 15 de 62
5. Sada de Dados
Vamos nos dedicar agora a uma instruo muito simples, mas de grande importncia em um
programa. Trata-se da visualizao dos resultados do processamento realizado. Este
procedimento conhecido como sada de dados.

Os dados de sada podem ser apresentados em qualquer dispositivo de sada ligado ao


computador (vdeo, impressora, discos, dentre outros). Em nosso curso utilizaremos o vdeo
como dispositivo padro para sada de dados.

Na linguagem C a funo responsvel por esta tarefa a printf. Segue abaixo sua sintaxe.

printf(string de controle, lista de variveis)

Exemplos com a funo printf

1 int idade = 15;


2 char nome[40] = Jose da Silva;
3 char turma = 'A';
4 float media = 8.5;
5
6 printf(\nA idade %d, idade);
7 printf(\nA idade do %s %d, nome, idade);
8 printf(\nA mdia da Turma %c foi de %f, turma, media);

O primeiro argumento da funo printf chamado de string de controle. Contm caracteres a


serem impressos e cdigos de formatao (%). O cdigo de formatao seguido de uma letra
conforme abaixo.

Caractere Comentrio
de
Formatao
%c Caractere simples
%d Decimal
%f Ponto flutuante
%s Cadeia de caracteres (string)
%u Decimal sem sinal
%e Notao cientfica

Apresentamos no exemplo acima dois cdigos de formatao.

Cdigo de Comentrio
Formatao
\n Fora a mudana de linha do cursor.
\t Fora o avano de tabulao do cursor.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 16 de 62
O segundo argumento apresenta o valor a ser exibido. Deve haver tantos argumentos aps a
string de controle quantos forem os cdigos de formatao. Vejamos o efeito das instrues
do exemplo acima.

Instruo Efeito na Tela


da Linha
6 A idade 15
7 A idade do Jose da Silva 15
8 A mdia da Turma A foi de 8.5

Exerccios.
1. Qual ser a sada produzida pelo programa abaixo?

main(){
printf("%s\n%s\n%s","um","dois","tres");
}

2. Quais as sadas produzidas pelo programa abaixo?

main(){
int v1, v2, resultado;
v1 = 15;
v2 = 2;
resultado = v1/v2;
printf("%d / %d = %d", v1, v2, resultado);
}

E agora?

main(){
float v1, v2, resultado;
v1 = 15;
v2 = 2;
resultado = v1/v2;
printf("%f / %f = %f", v1, v2, resultado);
}

E agora?

main(){
float v1, v2, resultado;
v1 = 15;
v2 = 2;
resultado = v1 % v2;
printf("%f %% %f = %f", v1, v2, resultado);
}

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 17 de 62
6. Entrada de Dados
To importante quanto proceder sada de dados obter informaes necessrias ao
processamento. Este procedimento conhecido como Entrada de Dados. Os dados de
entrada podem ser enviados de qualquer dispositivo de entrada ligado ao computador
(teclado, discos, mouse, dentre outros). Em nosso curso utilizaremos o teclado como
dispositivo padro de entrada.

Na linguagem C a funo responsvel por esta tarefa a scanf. Ela permite operaes de
entrada de dados, ou seja, a leitura de dados formatados do teclado, aps pressionar a tecla
enter. Segue abaixo sua sintaxe.

scanf (string de controle, lista-argumentos)

Exemplo de entrada de dados atravs do uso da funo scanf

1 printf("Digite a distancia:");
2 scanf("%d",&centimetro);

Linha Comentrio
1 Uma ao muito comum em programas a de orientar o usurio a tomar alguma
atitude. Nesse caso a funo printf est sendo usada apenas para mostrar uma
mensagem ao usurio de como proceder.
2 A funo scanf causa uma pausa no programa, ficando em estado de espera. O
Usurio digita a informao desejada e tecla enter para que a informao digitada
seja atribuda varivel utilizada na operao de entrada, que no nosso exemplo
centimetro. Em seguida o fluxo de execuo continua e a prxima instruo ser
executada.

Observaes:

O comando scanf exige que seja informado o endereo da varivel. Utilizamos o


& para referenciar o endereo de uma varivel. Lembre-se: quando uma
varivel declarada, alocado um espao na memria correspondente ao seu
tipo. Este espao, que a varivel ocupa, possui um endereo que pode ser
acessado usando o operador &.
A string de controle presente na funo scanf tem o mesmo comportamento
que j conhecemos da funo printf.

Existem outras funes, na linguagem C, que permitem a entrada de dados. A funo getche,
l e retorna um caractere do teclado sem esperar enter e permite que o mesmo seja impresso
na tela. A outra funo, getch, tem o mesmo comportamento, entretanto no permite que o
caractere lido seja impresso na tela. Essas funes somente podero ser usadas para a leitura
de caractere.

Exemplo de entrada de dados atravs do uso das funes getche e getch

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 18 de 62
1 printf(Digite a turma:);
2 char turma = getche();
3 printf(Tecle algo para continuar ...);
4 getch();

Linha Comentrio
2 A funo getche causa uma parada no programa, o usurio digita um caractere que
atribudo varivel turma e em seguida o programa continua.
4 A funo getch causa uma parada no programa, o usurio digita um caractere que
no ser mostrada na tela e nada feito. Em seguida o programa continua.

Prtica: Lendo valores do teclado


Voc se lembra do programa raiz.c ? Ele era muito limitado. S conseguamos calcular a raiz
quadrada de 9. Se o usurio quisesse calcular a raiz quadrada de outro nmero no
conseguiria. Agora j sabemos como eliminar essa limitao. Basta solicitarmos que o usurio
informe o nmero que deseja calcular a raiz quadrada. Abra o programa raiz.c e faa as
alteraes necessrias.

Programa raiz.c

#include <stdio.h>
#include <math.h>

main(){
float numero;

printf(\n************************);
printf(\nCalculo da Raiz Quadrada));
printf(\n************************);

printf(\nInforme um numero:));
scanf(%f, &numero);

printf(\nRaiz Quadrada de %f: %f, numero, sqrt(numero));


}

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 19 de 62
7. Identificando as partes de um programa
Antes de prosseguirmos, chamamos a ateno dos iniciantes em programao, para uma fase
do desenvolvimento de programas, muitas vezes negligenciada, que encontrar a soluo do
problema. Lembre-se de que o nosso objetivo, como programadores, criarmos uma soluo
para um problema atravs do computador. Se no conhecemos a soluo de um problema no
conseguiremos instruir o computador a resolv-lo.

Vejamos um exemplo. Suponha que voc deseja criar um programa para calcular a situao
dos alunos de uma escola ao final do perodo letivo. Voc sabe se as notas so agrupadas por
bimestres ou trimestres? Voc sabe se a recuperao bimestral, trimestral ou semestral?
Voc sabe a mdia para ser aprovado? Quais as condies para aprovao? Qual a quantidade
mxima de faltas possveis? Se voc desconhece alguma das questes anteriores no ser
possvel criar um programa para resolver o problema. Aqui vai uma dica muito importante:
elabore uma soluo para o problema antes de comear a codificar um programa para resolv-
lo.

O nosso objetivo criar programas para que o computador possa execut-los. Todo programa
constitudo de instrues que orientaro o computador a resolver um determinado
problema. Se voc no conhece a soluo do problema no conseguir orientar o computador
a resolv-lo. Ento fica a dica: s comece a implementao de um programa depois de
planejar a soluo do problema. Isso uma tarefa anterior codificao. Essa a maior
dificuldade em programao: elaborar uma soluo para um problema que no dominamos ou
que no lidamos em nosso dia a dia.

Prtica: Identificando as partes de um programa


Vamos codificar um programa para calcular ndice de massa corprea de um indivduo. Voc
sabe o que IMC? Voc sabe como calcular o IMC? Em caso negativo no comece a codificar o
programa. Pesquise, converse com o seu cliente ou chefe at que voc seja capaz de
identificar as trs partes de um programa:

1. Dados de sada
Levantar e analisar todas as sadas exigidas na especificao do problema.

2. Dados de entrada
Levantar e analisar todas as entradas citadas na especificao do problema.

3. Processamento
Levantar todas as transformaes necessrias para, dadas as entradas e valores
gerados internamente, produzir as sadas especificadas. Quais clculos sero
realizados? Quais condies devem ser obedecidas?

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 20 de 62
Agora vamos identificar as trs partes citadas, relacionadas ao nosso problema. Ao
pesquisarmos sobre o assunto descobrimos que o ndice de massa corprea (IMC) de um
indivduo obtido dividindo-se o seu peso (em Kg) por sua altura (em metros) ao quadrado.

Assim, por exemplo, uma pessoa de 1,67m e pesando 55kg tem IMC igual a 19.72.

55
= = 19.72
1.67

Dados de Sada:
imc

Dados de Entrada:
peso
altura

Processamento:
Imc = peso / altura * altura

Agora que j encontramos uma soluo para o problema, vamos criao do programa. Salve
o programa com o nome de imc.c.

Programa imc.c

1 /*
2 Programa que calcula o IMC de um indivduo.
3 Autor: Hilton Cardoso Marins Junior.
4 */
5
6 main(){
7 float peso, altura, imc;
8
9 printf("Peso: ");
10 scanf("%f", &peso); //entrada do peso
11
12 printf("Altura: ");
13 scanf("%f", &altura); //entrada da altura
14
15 imc = peso / (altura * altura); //calculo do imc
16
17 printf("\nIMC = %f", imc); // exibio do resultado
18 }

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 21 de 62
Linha Comentrio
1a4 O /* utilizado para delimitar comentrios de vrias linhas. O // utilizado para
indicar incio de comentrio de linha.
7 Declarao das variveis utilizadas no programa.
9 a 13 Entrada dos dados.
15 Clculo do IMC.
17 Exibio dos resultados (sada de dados).

Exerccios
Para cada exerccio abaixo, analise o problema e identifique as 3 partes do programa:

a. Dados de sada
b. Dados de entrada
c. Processamento

1. Faa um programa que receba trs notas, seus respectivos pesos, e calcule a mdia
ponderada dessas notas.

2. Faa um programa que receba o salrio de um funcionrio e o percentual de aumento,


calcule e mostre o valor do aumento e o novo salrio.

3. Faa um programa para determinar o consumo mdio de combustvel de um automvel,


sendo fornecida a distncia total percorrida pelo automvel e o total de combustvel
gasto.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 22 de 62
8. Controle do Fluxo de Execuo
Veremos agora uma das partes mais importantes do nosso curso, que controlar o fluxo de
execuo de um programa. Voc j percebeu que todos os programas desenvolvidos at agora
apresentam uma sequncia de instrues, ou seja, todas as instrues so executadas uma
aps a outra em uma sequncia da primeira at a ltima.

Haver situaes em que determinadas instrues s podero ser executadas se uma


condio for obedecida. Para exemplificar vamos voltar ao clculo do IMC e imaginar uma
funcionalidade capaz de indicar ao usurio a necessidade de se realizar um procedimento de
perda de peso. bvio que essa indicao de perda de peso s deve ser realizada se IMC for
superior a um determinado valor. Perceberam a vinculao de uma ao (indicao de perda
de peso) a uma condio (IMC maior que um determinado valor)?

Agora imagine outra situao em que o clculo do IMC dever ser realizado diversas vezes
para vrias pessoas. Neste caso devemos indicar que algumas instrues devero ser
executadas repetidas vezes.

J ficou claro que haver situaes em que no conseguiremos implementar um programa


usando somente a estrutura sequencial de instrues. Ser muito comum necessitarmos de
estruturas de controle que implementam a alternativa e a repetio.

8.1 Sequncia
{
Comando-1;
Comando-2;
.
.
.
}

Os comandos sero executados um aps o outro. As chaves indicam incio e fim de um bloco
de comandos.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 23 de 62
8.2 Alternativa Simples

V V
Condio

C1
F

C2

Cn

Representao em fluxograma

if (condio){
c1;
c2;
.
.
.
cn;
}

Implementao em C

Os comandos c1, c2, , cn sero executados somente se a condio for verdadeira.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 24 de 62
Prtica: Estabelecendo uma alternativa simples
Veremos uma situao que utilizaremos alternativa simples. Codificar um programa para
verificar se um nmero inteiro informado pelo usurio par. Lembre-se de identificar as
seguintes partes do programa:

Dados de Sada:
Uma mensagem: O numero PAR !!!

Dados de Entrada:
Um nmero inteiro

Processamento:

Sabemos que para todo nmero par o resto da diviso por 2 igual a
0. Basta verificarmos se o resto da diviso de um numero por 2
igual a 0. Est claro que teremos que estabelecer uma alternativa no
caso do nmero ser par.
16 2
-
16 8
0
A alternativa seria assim:

SE (RESTO DE NUMERO POR 2 = 0) ENTO


MOSTRE( NUMERO PAR !!!)
FIM-SE

Agora que j temos a soluo do problema, podemos implement-la na linguagem C.

Programa par.c

1 main(){
2 int numero;
3
4 printf("Informe um numero: ");
5 scanf("%d",&numero);
6
7 if (numero % 2 == 0){
8 printf("\nNumero PAR !!!");
9 }
10 }

Linha Comentrio
7 O operador aritmtico que calcula o resto da diviso o %.
8 Esta linha s ser executada se o resto da diviso de nmero por 2 for igual a 0.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 25 de 62
8.3 Alternativa Composta

F V
Condio

C1 C1

C2 C2

Cn Cn

Representao em fluxograma

if (condio){
c1;
c2;
.
.
.
cn;
}else{
c1;
c2;
.
.
.
cn;
}

Implementao em C

Se a condio for verdadeira os comandos c1, c2, , cn sero executados, caso contrrio os
comandos c1, c2, ..., cn que sero executados.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 26 de 62
Prtica: Estabelecendo uma alternativa composta
Vamos voltar ao programa par.c para incorporar mais uma funcionalidade. Queremos que o
programa imprima tambm uma mensagem no caso do nmero ser impar. Est claro que
teremos que elaborar uma alternativa composta. Veja a nova verso do programa que passei a
chamar de parimpar.c.

Programa parimpar.c

1 main(){
2 int numero;
3
4 printf("Informe um numero: ");
5 scanf("%d",&numero);
6
7 if (numero % 2 == 0){
8 printf("\Numero PAR !!!");
9 }else{
10 printf("\Numero IMPAR !!!");
11 }
12 }

Linha Comentrio
9 a 11 A palavra else faz parte o comando if e opcional. S usada em alternativa
composta.
10 Esta linha s ser executada se o resto da diviso de nmero por 2 NO for igual
a 0.

Observao
Na linguagem C no existe o tipo de dados boolean (verdadeiro e falso) como em outras
linguagens. Em C um valor diferente de zero considerado verdadeiro e igual a zero falso.

Uma instruo if no fica restrita expresses envolvendo os operadores lgicos e relacionais. O


programa simplesmente precisa chegar a um valor zero (falso) e no zero (verdadeiro).

Observe os dois trechos de programa abaixo e responda: quais instrues sero executadas, c1
ou c2?

... ...
int x = 10; int x = 10;
if (x){ if (x-10){
c1; c1;
}else{ }else{
c2; c2;
} }
... ...

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 27 de 62
8.4 Alternativa Mltipla

Expresso
Ordinal

Caso 1 Caso 2 Caso n

comandos_1 comandos_2 ... comandos_n

Representao em fluxograma

switch (expresso ordinal){


case constante1: instrucoes;
break;

case constante2: instrucoes;


break;
.
.
.

default: instrucoes;
}

Implementao em C

O resultado da expresso ordinal (cujo resultado deve ser do tipo char ou int) ser comparado
com cada constante informada aps a palavra case. Sendo igual, todos os comandos
relacionados ao case, sero executados at que um comando break seja encontrado. O
comando break causa o desvio do fluxo de execuo para a primeira instruo aps o switch.
Se no existir um comando break seguindo as instrues de um case, o programa segue
executando as instrues dos cases seguintes. Se nenhum case for satisfeito a execuo
comea no default, que por sua vez opcional. Cada case pode ter vrias instrues e no
devem estar entre chaves.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 28 de 62
Prtica: Estabelecendo uma alternativa mltipla
Veremos um exemplo do uso do comando switch. Este programa solicita a digitao de um
nmero correspondente a um ms do ano e imprime o ms por extenso.

Programa mes.c

1 main(){
2 int mes;
3
4 printf("\n Digite o numero do mes: ");
5 scanf("%d", &mes);
6
7 switch (mes){
8 case 1: printf(\nJaneiro.);
9 break;
10
11 case 2: printf(\nFevereiro.);
12 break;
13
14 ...
15
16 case 12: printf(\nDezembro.);
17 break;
18
19 default: printf("Mes invlido !!!");
20 }
21 }

Linha Comentrio
7 O resultado da expresso ordinal, que no caso o contedo da varivel mes, ser
comparado com cada constante aps os cases.
8e9 O contedo da varivel ms ser comparado ao valor 1. Se for igual imprimir na
tela a palavra Janeiro e em seguida o comando break causar a sada do fluxo de
execuo para a prxima instruo aps o switch.
11 a 17 O contedo da varivel ms ser comparado aos demais valores.
19 Caso o contedo da varivel ms no seja igual a nenhum dos valores localizados
aps os cases, os comandos vinculados ao default sero executados.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 29 de 62
Exerccios
1) Leia o algoritmo abaixo e responda:

a. Se B1 = verdadeiro, B2 = verdadeiro, B3 = falso, quais os comandos que sero


executados?
b. Se B1 = falso, B2 = verdadeiro, B3 = falso, quais os comandos que sero executados?
c. Quais os valores de B1, B2, B3 para que somente o comando C5 seja executado?
d. Se B1 = falso, B2 = verdadeiro, B3 = verdadeiro, quais os comandos que sero
executados?

......
if (B1) {
C1;
}else{
if (B2) {
if (B3) {
C2;
}else{
C3;
C4;
}
}
}
C5;

2) Para os valores (a=5) (b=7) e (c=9), assinale com X a sequncia de execuo dos trechos de
programas abaixo e informe qual o valor da varivel c ao final da execuo:

if (a==5) && (b==7) {


c = c+1; ( )
}else{
c = c-1; ( )
}

if (a==5) && (b<6) {


c = 1; ( )
}else{
if (c==8) {
c = 2; ( )
}else{
c = 3; ( )
}
}

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 30 de 62
3) Indique a sada produzida pelos trechos de programa listados abaixo. Considere os
seguintes valores: A=2, B=3, C=5, D=9 e E=6.

if !(D > 5) {
X = (A + B) * D;
}else{
X = (A - B) / C;
}
printf(%d,X);

if (A > 2 && B < 7) {


X = (A + 2) * (B - 2);
}else{
X = (A + B) / D * (C + D);
}
printf(%d,X);

if (A == 2 || B < 7) {
X = (A + 2) * (B 2);
}else{
X = (A + B) / D * (C + D);
}
printf(%d,X);

4) Faa um programa que gere um nmero aleatrio entre 0 e 9, receba um palpite via
teclado e informe se o palpite certo ou errado.

Dicas:

a) A instruo srand (time(NULL) ); faz com que o nmero gerado varie a cada execuo
do programa. Portanto s deve ser executada uma vez a cada execuo do programa.
b) A instruo numeroGerado = rand(); gera um nmero aleatrio e atribui este valor
varivel numeroGerado.
c) As funes srand(), rand e time exigem a declarao da biblioteca time.h

d) O operador % chamado operador mdulo ou resto da diviso. Assim, x = y % 10;


atribui varivel x o resto da diviso de y por 10. Ou seja, se y = 23, x receber o valor
3.

e) O nmero gerado com a funo rand() grande. Se aplicarmos o operador mdulo


deste nmero grande por 10, por exemplo, teremos sempre o resto da diviso por 10,
o que ser um nmero de zero a 9.

f) Teste de igualdade em C feito com == e no apenas com um =.

5) Codificar um programa para verificar se 3 nmeros inteiros podem ser lados de um


triangulo. Informar tambm o tipo do triangulo (equiltero, issceles ou escaleno). Dica:
cada lado do tringulo menor que a soma dos outros dois lados.

6) Uma livraria est fazendo uma promoo para pagamento vista em que o comprador
pode escolher entre dois critrios de pagamento:

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 31 de 62
Critrio A: R$ 0,25 por livro + RS$ 7,50 fixo.
Critrio B: R$ 0,50 por livro + RS$ 2,50 fixo.

Faa um programa em que o usurio digita a quantidade de livros que deseja comprar e o
programa informa qual a melhor opo de desconto.

7) Faa um programa para calcular a(s) razes reais de uma equao do segundo grau. O
programa dever receber os 3 coeficientes e no dever aceitar o coeficiente de x2 igual a
zero.

8) Fazer um programa que mostre uma questo de mltipla escolha com 5 opes (letras a,
b, c, d, e). Sabendo a resposta certa, receber a opo do usurio e informar se a resposta
est certa ou errada. Usar o tipo char para armazenar a varivel de teste do switch. Ela
pode ser lida do teclado com scanf e a mscara %c ou com a funo getchar() (opcao =
getchar()). Na comparao do case, deve-se colocar o valor a ser comparado entre aspas
simples: case 'a'...

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 32 de 62
8.5 Repetio com Teste no Incio

F Condio V

C1

C2

Cn

Representao em fluxograma

while (condio) {
C1;
C2;
.
.
.
Cn;
}

Implementao em C

Os comandos internos ao while (C1, C2, ..., Cn) sero executados repetidas vezes enquanto a
condio for verdadeira. Quando a condio se tornar falsa o fluxo de execuo ser desviado
para a primeira instruo aps o comando while. Se a condio, inicialmente for falsa,
nenhuma repetio ocorrer.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 33 de 62
Prtica: Estabelecendo uma repetio com while
Vamos a uma situao real para melhor compreenso da estrutura de repetio. Imagine uma
turma com 3 alunos onde cada aluno realiza uma prova no valor de 100 pontos. Vamos
codificar um programa para calcular a mdia das notas da turma.

Dados de Sada:
media
Dados de Entrada:
3 notas
Processamento:
Somar todas as notas e dividir por 3.

Ao codificar um programa, voc pode comear pela parte que quiser. Eu vou comear
codificando as instrues responsveis pela sada dos dados, pois acho mais simples. Darei o
nome ao programa de media.c.

Programa media.c

1 main(){
2 printf(\nA media das notas da turma: %f, media);
3 }

Esta instruo me obriga a declarar a varivel media. Toda varivel deve ser declarada em
qualquer ponto do programa desde que em uma linha anterior sua primeira referncia no
programa. No nosso caso deve ser antes da linha 2. O tipo adequado para esta varivel float
j que se trata de notas. O programa ficaria assim:

Programa media.c

1 main(){
2 float media;
3 printf(\nA media das notas da turma: %f, media);
4 }

Nossas instrues relativas sada de dados j esto prontas. Agora vamos nos preocupar com
a entrada de dados. Sabemos que so 3 notas, ento temos que ler do teclado 3 notas. Veja as
linhas destacadas abaixo.

Programa media.c

1 main(){
2 float media = 0;
3 float nota;
4
5 printf(\nInforme a Nota: );
6 scanf(%f, &nota);
7 media = media + nota;
8

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 34 de 62
9 printf(\nInforme a Nota: );
10 scanf(%f, &nota);
11 media = media + nota;
12
13 printf(\nInforme a Nota: );
14 scanf(%f, &nota);
15 media = media + nota;
16
17 media = media / 3;
18 printf(\nA media das notas da turma: %f, media);
19 }

Repare que usamos uma mesma varivel para armazenar todas as 3 notas. Isto no
problema porque antes de armazenar um valor, o anterior acumulado na varivel media.
Vamos aos comentrios.

Linha Comentrio
4 Declarao de uma nova varivel de nome nota para armazenar as notas.
7, 11 e 15 Estas linhas realizam a leitura de todas as notas, uma de cada vez.
8, 12 e 16 Para cada nota lida devemos acumular seu valor na varivel mdia para que
no final do programa seja possvel dividir seu contedo acumulado pela
quantidade de notas, calculando desta forma a mdia. Ns usamos a mesma
varivel para guardar todas as notas e para cada nota lida perdemos a nota
anterior, mas isso no problema j que antes de perder seu valor ele
acumulado na varivel media.
18 Calcula a mdia das notas

O que voc acha da soluo acima? Imagine se precisssemos calcular a mdia de 50 notas de
uma turma? E se considerarmos uma instituio com 2.000 alunos? Esta soluo apresentada
muito limitada, concorda? Vamos usar a repetio com teste no incio como uma estrutura
de controle de fluxo capaz de deixar o nosso cdigo mais flexvel.

Programa media.c

1 main(){
2 float media = 0, nota;
3
4 while (????){
5 printf(\nInforme a Nota: );
6 scanf(%f, &nota);
7 media = media + nota;
8 }
9 media = media / 3;
10 printf(\nA media das notas da turma: %f, media);
11 }

Voc percebeu que eliminamos as ocorrncias de comandos repetitivos. Agora o programa


est preparado para processar a quantidade de notas que desejarmos, sem que isso aumente
a quantidade de instrues. S est faltando estabelecermos a condio do comando while,
que veremos mais adiante. Agora vamos aos comentrios do cdigo acima.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 35 de 62
Linha Comentrio
4 Marca o incio de um bloco de comandos delimitados por chaves que sero
executados repetidas vezes enquanto a condio estipulada for verdadeira.
5a7 Para cada repetio ser realizado a entrada de uma nota e seu acmulo na
varivel media.
9 Aps o trmino da repetio podemos calcular a media j que todas as notas
j foram lidas e acumuladas.

Vamos agora definir a condio para que as repeties ocorram. Esse programa calcula a
mdia das notas de uma turma de 3 alunos. Se em cada repetio tratamos uma nota, ento
teremos que realizar 3 repeties. Para que ocorra, exatamente 3 repeties, teremos que
usar uma varivel para controlar o nmero de repeties. Veja a soluo sugerida abaixo.

Programa media.c

1 main(){
2 float media = 0, nota;
3 int cont = 0;
4 while (cont < 3){
5 printf(\nInforme a Nota: );
6 scanf(%f, &nota);
7 media = media + nota;
8 cont = cont + 1;
9 }
10 media = media / 3;
11 printf(\nA media das notas da turma: %f, media);
12 }

Linha Comentrio
3 A varivel que vai controlar o nmero de repeties cont. Ela armazenar a
quantidade de repeties realizadas. Como neste ponto do programa ainda
no realizamos nenhuma repetio, inicializamos ela com o valor 0.
4 Aqui definimos a condio. Os comandos internos ao while sero executados
enquanto cont for menor do que 3. Repare que se utilizssemos o operador
relacional <= teramos 4 repeties. Quando a condio se tornar falsa o fluxo
de execuo ser desviado para a prxima linha aps o comando while.
8 Nesta linha registramos que foi tratada uma nota. Incrementamos o valor de
cont em uma unidade para que no futuro a condio se torne falsa e com isso
finalize as repeties.

Quais alteraes sero necessrias neste programa no caso de uma turma com 50 alunos?
Basta trocarmos em todo o programa a ocorrncia do nmero 3 por 50 e pronto, o nosso
programa j est preparado para tratar 50 notas. Vamos apresentar a nova verso do
programa junto com o conceito de constantes.

Constantes so locais de memria cujos valores no se alteram durante a execuo de um


programa. No nosso caso a informao que candidata a se tornar uma constante a
quantidade de notas. Veja abaixo.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 36 de 62
Programa media.c

1 #define NOTAS 50
2
3 main(){
4 float media = 0, nota;
5 int cont = 0;
6 while (cont < NOTAS){
7 printf(\nInforme a Nota: );
8 scanf(%f, &nota);
9 media = media + nota;
10 cont = cont + 1;
11 }
12 media = media / NOTAS;
13 printf(\nA media das notas da turma: %f, media);
14 }

Linha Comentrio
1 Definimos uma constante de nome NOTAS cujo valor ser 50. Usar maisculas
para nomear uma constante um padro de programao que muitos
programadores seguem.

Apesar de toda evoluo do cdigo do programa media.c, ele ainda apresenta uma grande
limitao. Voc capaz de dizer que limitao essa?

A limitao est na impossibilidade do usurio escolher a quantidade de notas desejadas para


tratamento. A soluo solicitar ao usurio que informe a quantidade de notas. Para isso
basta usar uma varivel para guardar este valor. Observe as instrues em destaque na nova
verso do programa.

Programa media.c

1 main(){
2 float media = 0, nota;
3 int cont = 0, qtnotas;
4
5 printf(Informe a quantidade de notas: );
6 scanf(%d, &qtnotas);
7
8 while (cont < qtnotas){
9 printf(\nInforme a Nota: );
10 scanf(%f, &nota);
11 media = media + nota;
12 cont = cont + 1;
13 }
14 media = media / qtnotas;
15 printf(\nA media das notas da turma: %f, media);
16 }

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 37 de 62
Eu ainda acho essa ltima verso muito limitada. E se o usurio no souber a quantidade de
notas a serem digitadas? Um programa bem feito seria aquele que permitisse o clculo da
mdia independente da quantidade de notas informadas. Observe as instrues em destaque
na nova verso do programa.

Programa media.c

main(){
float media = 0, nota;
int cont = 0;

char continua = 1; //verdadeiro


while (continua){
printf(\nInforme a Nota: );
scanf(%f, &nota);
media = media + nota;
cont = cont + 1;

printf(\nDeseja Continuar? S[Sim] ou N[No]: );


continua = getche();

}
media = media / cont;
printf(\nA media das notas da turma: %f, media);
}

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 38 de 62
8.6 Repetio com Teste no Final

C1

C2

Cn

F
V Condio

Representao em fluxograma

do{
C1;
C2;
.
.
.
Cn;
}while (condio);

Implementao em C

Os comandos internos ao do ... while (C1, C2, ..., Cn) sero executados repetidas vezes
enquanto a condio for verdadeira. Quando a condio se tornar falsa o fluxo de execuo
ser desviado para a primeira instruo aps o comando while. Se a condio, inicialmente for
falsa, ocorrer uma repetio e essa nica diferena para a estrutura que implementa a

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 39 de 62
repetio com teste no incio. Aqui, como a condio verificada no final da repetio,
podemos garantir que pelo menos uma repetio sempre ocorrer.

8.7 Repetio com Varivel de Controle

variavel = valor inicial

Condio F
envolvendo
a varivel

C1

C2

Cn

Altera o valor da varivel

Representao em fluxograma

for(ao-1; condio; ao-2){


C1;
C2;
.
.
.
Cn;
}
Implementao em C

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 40 de 62
O comando for usa uma varivel para controlar o nmero de repeties. Normalmente em
ao-1 inicializamos a varivel de controle, em ao-2 alteramos a varivel de controle,
incrementando ou decrementando seu valor e em condio definimos uma forma de
finalizar a repetio, verificando se a varivel se controle j alcanou um determinado limite.

A ao-1 executada somente uma vez e antes da primeira repetio. Normalmente usada
para inicializarmos a varivel de controle.

A ao-2 executada ao final de cada repetio. Define a maneira como a varivel de


controle ser alterada a cada repetio. Permite que a varivel de controle chegue a um valor
que torne a condio falsa, ou seja, que a repetio chegue ao fim. Geralmente usada para
incrementar ou decrementar a varivel de controle.

A condio testada antes de cada repetio, se for verdadeira haver mais uma repetio
e caso contrrio o fluxo de execuo desviado para a prxima instruo aps o for. Haver
repetio enquanto a condio for verdadeira.

Prtica: Estabelecendo uma repetio com for


Para exemplificar e compreender melhor o comando for vamos codificar um programa que
seja capaz de realizar o clculo da potncia de um nmero.

Dados de Sada:
potencia

Dados de Entrada:
base
expoente

Processamento:
Exemplo: 2 = 2 x 2 x 2 x 2 = 16

Em C:
potencia = 2
potencia = potencia * 2 = 4
potencia = potencia * 2 = 8
potencia = potencia * 2 = 16

podemos substituir todas as ocorrncias acima por uma nica


instruo vinculada a um comando de repetio, que no caso ser o
for.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 41 de 62
Programa potencia.c

1 main(){
2 int i, b, e, potencia;
3 printf("\nInforme o valor da base:");
4 scanf("%d",&b);
5 printf("\nInforme o valor do expoente:");
6 scanf("%d",&e);
7
8 potencia = 1;
9 for (i=1; i<=e; i++){
10 potencia = potencia * b;
11 }
12
13 printf("\nPotencia: %d", potencia);
14 }

Linha Comentrio
8 Repare que na linha 10 estamos acumulando na varivel potencia o seu
prprio valor multiplicado por b. Portanto a varivel potencia tem que
possuir um valor j para a primeira repetio e isso que esta linha faz: ela
inicializa a varivel potencia para que na primeira repetio ela j tenha um
valor. E porque este valor inicial 1? Simples, porque 1 um valor nulo para
a multiplicao, no interferindo desta forma no resultado final. Voc lembra
do clculo da mdia no programa media.c? Usamos o mesmo raciocnio aqui,
o valor inicial da varivel media foi 0 porque um valor nulo para a operao
de soma.
9 Aqui controlamos a repetio. Queremos que ocorra e repeties, ento a
varivel de controle (i) comea em 1 e vai at e (inclusive) causando desta
forma o nmero de repeties que desejamos.
10 Para cada repetio acumulamos o valor da base (b) na varivel potencia.

Exerccios
1) Considere a progresso geomtrica (PG) 1, 2, 4, 8, 16, 32, .... e um inteiro positivo n.
Deseja-se que um programa faa:

Imprimir os n primeiros termos.


Calcular e imprimir a soma dos n primeiros termos da PG sem utilizar a frmula da
soma.

2) Faa um programa que receba um nmero n e gere os n primeiros nmeros da sequncia


de Fibonacci, Definida na frmula:

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 42 de 62
3) Fazer um programa que leia as notas dos alunos de uma turma e produza um relatrio
com as seguintes informaes:
a. A maior nota
b. A menor nota
c. A mdia da turma
d. Quantidade de alunos que obtiveram a maior nota
e. Quantidade de alunos que obtiveram a menor nota

4) Existem trs candidatos a uma vaga no Senado. Feita a eleio, os votos so registrados
da seguinte forma:
Voto Significado
1 candidato 1
2 candidato 2
3 candidato 3
4 voto branco
5 voto nulo

Codificar um programa capaz de informar: o candidato vencedor, a quantidade de votos


em branco, nulos e o nmero de eleitores que compareceram s urnas.

5) Considere o programa abaixo.

main(){
int linha,coluna;
for (linha=1;linha<=5;linha++){
for (coluna=1;coluna<=5;coluna++){
printf("\t[%d,%d]",linha, coluna);
}
printf("\n");
}
}
}
A sada ser a seguinte:

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

Considerando a sada como uma matriz, modique o programa acima para que apenas a
diagonal principal e os dados acima dela sejam impressos. Com as modificaes propostas
a sada dever ser assim:

[1,1] [1,2] [1,3] [1,4] [1,5]


[2,2] [2,3] [2,4] [2,5]
[3,3] [3,4] [3,5]
[4,4] [4,5]
[5,5]

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 43 de 62
6) Codificar um programa que seja capaz de imprimir um tringulo retngulo com altura
definida pelo usurio.

* *
** **
*** ***
**** ****
*****
Tringulo com altura 4 ******

Tringulo com altura 6

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 44 de 62
9. Estruturas de Dados Homognea - Vetor
O nosso conhecimento bsico de programao, adquirido at momento razovel, entretanto
no suficiente para resolvermos o problema que analisaremos agora. O objetivo motiv-lo
a conhecer uma nova tcnica para armazenamento de dados.

Vamos voltar ao programa media.c e alter-lo de forma a calcular a quantidade de alunos que
obtiveram nota acima da mdia da turma. Para verificar quem obteve nota acima da mdia,
basta comparar cada nota com a mdia da turma, certo? Observe as instrues destacadas na
nova verso do programa media.c.

Programa media.c

1 main(){
2 float media=0, nota;
3 int cont = 0, qtnotas;
4
5 printf(Informe a quantidade de notas: );
6 scanf(%d, &qtnotas);
7
8 int acima = 0;
9 while (cont < qtnotas){
10 printf(\nInforme a Nota: );
11 scanf(%f, &nota);
12 media = media + nota;
13 cont = cont + 1;
14
15 if (nota > media){
16 acima = acima + 1;
17 }
18 }
19 media = media / qtnotas;
20 printf(\nA media das notas da turma: %f, media);
21 printf(\nNotas acima da media......: &d, acima);
22 }

Linha Comentrio
8 A varivel acima contabiliza a quantidade de notas acima da mdia. Antes de
comear a ler as notas o nmero de notas acima da mdia zero, por isso a
inicializamos com 0.
15 a 17 Cada nota lida ser comparada com a mdia. No caso de ser maior do que a
mdia, incrementamos a varivel acima em uma unidade.
21 Ao final da repetio a varivel acima conter a quantidade de notas acima
da mdia.

Todo nosso raciocnio para a soluo desse novo problema est certo, porm estamos
esquecendo algo, voc j percebeu?

Voltemos nossa ateno para a linha 15. No est achando esta condio estranha? Neste
ponto do programa j temos disponvel o clculo da mdia? No, isso s ocorrer na linha 19,

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 45 de 62
aps o fim da repetio. Ento conclumos que as instrues localizadas nas linhas 15, 16 e 17
devem ser retiradas do interior do comando de repetio e ser colocadas aps o clculo da
mdia, ou seja, aps a linha 19. Ento vejamos como ficaria o nosso programa.

Programa media.c

1 main(){
2 float media, nota;
3 int cont = 0, qtnotas;
4
5 printf(Informe a quantidade de notas: );
6 scanf(%d, &qtnotas);
7
8 int acima = 0;
9 while (cont < qtnotas){
10 printf(\nInforme a Nota: );
11 scanf(%f, &nota);
12 media = media + nota;
13 cont = cont + 1;
14 }
15 media = media / qtnotas;
16
17 if (nota > media){
18 acima = acima + 1;
19 }
20
21 printf(\nA media das notas da turma: %f, media);
22 printf(\nNotas acima da media......: &d, acima);
23 }

Linha Comentrio
17 a 19 Neste ponto do programam a mdia j foi calculada e podemos comparar com
as notas. Agora apareceu outro problema: a varivel nota armazena somente
a ltima nota digitada. Como ter acesso s notas digitadas anteriormente?

Nesta ltima verso do programa media.c resolvemos um problema mas apareceu outro.
Como ter acesso a todas as notas digitadas? Sabemos que para cada nota lida o seu valor
armazenado na varivel nota e o seu valor anterior perdido, entretanto precisamos ter
todas as notas disponveis na memria para poder compar-las com a mdia (linhas 17 a 19).
Com o conhecimento que temos, a nica soluo criarmos tantas variveis quanto a
quantidade de notas. J vimos anteriormente que esta soluo no a ideal.

Vamos apresentar uma estrutura de dados capaz de armazenar vrios valores e resolver este
nosso problema. Trata-se da estrutura de dados homognea. uma coleo de dados do
mesmo tipo (da a palavra homognea) que referenciada por um nico nome.

Esta estrutura apresenta outras 2 caractersticas importantes:

1. Seus elementos ocupam posies contguas da memria. O endereo mais baixo


corresponde ao primeiro elemento e mais alto ao ltimo.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 46 de 62
2. Possui nmero de elementos fixo, ou seja, a varivel desse tipo declarada com uma
quantidade de elementos que no pode ser alterada durante a execuo do programa.

Uma estrutura de dados homognea tambm conhecida como vetor, matriz, varivel
indexada ou array. Um elemento especfico do vetor acessado por meio de um ndice. O
ndice um nmero inteiro que corresponde posio de um elemento dentro do vetor. A
seguir veremos um exemplo de vetor que armazena 10 notas.

Posio 1 2 3 4 5 6 7 8 9 10
ndice 0 1 2 3 4 5 6 7 8 9
Valor 7.5 8.0 3.5 10.0 6.0 8.0 9.0 6.5 7.5 4.5
Representao de um vetor com 10 elementos

Observe que, como o primeiro ndice do vetor 0, a quantidade de elementos armazenada


em um vetor dada pelo maior ndice mais 1, ou se preferir, podemos dizer que o ltimo
ndice igual ao numero de elementos do vetor menos 1.

Geralmente associamos as posies do vetor a alguma entidade do mundo real. No caso acima
associamos cada posio a uma nota de um aluno: posio 0 armazena a nota do 1 aluno,
posio 1 armazena nota do aluno 2 aluno e assim sucessivamente.

Vejamos agora a sintaxe correta para declarar um vetor.

tipo nome-varivel[tamanho]

No exemplo abaixo alocado espao na memria suficiente para armazenar 10 notas. Esse
local foi rotulado com o nome de notas.

double notas[10]

E para fazer referncia a este local da memria usaremos o nome da varivel que notas e o
ndice indicando qual posio do vetor desejamos nos referir.

Posio 1 2 3 ... 8 9 10
ndice 0 1 2 ... 7 8 9
Valor 7.5 8.0 3.5 ... 6.5 7.5 4.5
Como notas[0] notas[1] notas[2] ... notas[7] notas[8] notas[9]
referenciar
Supostos 2293496 2293504 2293512 ... 2293552 2293560 2293568
Endereos

Se os elementos do vetor ocupam posies contiguas da memria, porque os endereos no


so consecutivos? A nota 8.0 do ndice 1, por exemplo, no deveria estar no endereo
2293497, porque ela est no endereo 2293504? A explicao simples, cada elemento
armazenado em posies contguas, porm cada valor do tipo double ocupa 8 bytes na
memria. Em um vetor de char teramos a situao abaixo. Lembre-se de que cada valor do
tipo char ocupa 1 byte na memria:

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 47 de 62
char nome[5]

Posio 1 2 3 4
ndice 0 1 2 3
Valor I F E T
Como nome[0] nome[1] mome[2] nome[3]
referenciar
Supostos 2293496 2293497 2293498 2293499
Endereos

Prtica: Vetor unidimensional


Agora que conhecemos esta nova tcnica de armazenamento, vamos voltar ao problema de
calcular a quantidade de notas acima da mdia. Deixaremos de usar uma varivel tradicional e
a substituiremos por um vetor de notas com capacidade de armazenar quantas notas
desejarmos. Vamos ao cdigo.

Programa media.c

1 main(){
2 float media;
3 int qtnotas;
4
5 printf(Informe a quantidade de notas: );
6 scanf(%d, &qtnotas);
7
8 float notas[qtnotas];
9
10 int acima = 0;
11 int i;
12 for (i=0; i < qtnotas; i++){
13 printf(\nInforme a %da. Nota: , i);
14 scanf(%f, &notas[i]);
15 media = media + nota[i];
16 }
17 media = media / qtnotas;
18
19 for (i=0; i < qtnotas; i++){
20 if (nota[i] > media){
21 acima = acima + 1;
22 }
23 }
24
25 printf(\nA media das notas da turma: %f, media);
26 printf(\nNotas acima da media......: &d, acima);
27 }

Linha Comentrio

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 48 de 62
8 Foi declarado um vetor de nome notas com quantidade de elementos igual ao
contedo da varivel qtnotas. Neste exemplo a quantidade de elementos do
vetor foi determinada pelo usurio. Quando isso no for possvel ou
desnecessrio podemos usar uma constante na declarao do vetor.
11 Declaramos a varivel de controle da repetio. Normalmente quando se
manipula vetor fica mais fcil usar o comando for, pois ele usa uma varivel de
controle que servir de ndice para referenciar os elementos do vetor.
12 Queremos ler as notas do teclado e armazen-las no vetor, cada nota em uma
posio diferente. Para cada repetio leremos uma nica nota e a
armazenaremos em uma posio do vetor indicada pela varivel i. Quando a
varivel i estiver com o valor 0 fazemos referencia ao ndice 0, quando i estiver
com o valor 1 fazemos referencia ao ndice 1, e assim sucessivamente. Teremos
tantas repeties quanto a quantidade de notas a serem lidas. Se a varivel de
controle (i) comea com o valor 0, e se a cada repetio for incrementada de
uma unidade enquanto for menor do que a varivel qtnotas, ento teremos
qtnotas repeties.

Observao: em C, i++ uma forma abreviada de i = i + 1.


14 Leitura da nota pelo teclado.
15 Acumula a nota lida.
19 a 23 Percorreremos o vetor novamente e contabilizamos as notas maiores do que a
mdia.

O vetor que manipulamos at agora so considerados unidimensionais, pois cada informao


est vinculada a apenas uma entidade (notas de alunos, nomes de pessoas, salrios de
funcionrios). Para vetores unidimensionais necessitaremos de apenas um ndice.

Agora imagine que cada nota esteja vinculada a duas entidades, alunos e bimestres por
exemplo. Neste caso precisaremos de um vetor bidimensional. Vetores bidimensionais
necessitam de dois ndices. Veremos abaixo como declarar e manipular um vetor
bidimensional, ou mais comumente chamado de matriz.

tipo nome-varivel[linhas][colunas]

No exemplo abaixo alocado espao na memria suficiente para armazenar 200 notas, 4 para
cada um dos 50 alunos.

double notas[50][4]

Ao declararmos um vetor bidimensional, sempre informamos primeiro o nmero de linhas e


em seguida o nmero de colunas. No exemplo acima, associamos os alunos s linhas e os
bimestres s colunas. Podemos representar nosso vetor conforme a figura abaixo.

Bimestres

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 49 de 62
0 1 2 3
0 10,0 9,5 8,5 9,5
1 7,0 8,5 9,5 10,0
2 9,0 6,5 7,5 9,5
Alunos .
.
.
49 8,5 5,0 10,0 9,0

Para imprimir a nota do ltimo aluno no 3o. bimestre:

printf(%f, notas[49][2])

Para ler do teclado:

scanf(%f, &notas[49][2])

Para imprimir a mdia das notas do ltimo aluno:

printf(%f,(notas[49][0]+notas[49][1]+notas[49][2])+notas[49][3])/4)

Prtica: Vetor bidimensional


Vamos voltar ao programa media e adapt-lo para calcular a mdia de cada aluno e a mdia da
turma, considerando agora um vetor bidimensional conforme representao acima. Lembre-se
que este vetor possui 50 linhas (alunos) e 4 colunas (bimestres).

Programa media.c

1 #define L 50
2 #define C 4
3
4 main(){
5 float mediaaluno, mediaturma;
6 float notas[L][C];
7
8 int i, j;
9
10 mediaturma = 0;
11 for (i=0; i < L; i++){
12 mediaaluno = 0;
13 for (j=0; j < C; j++){
14 printf("\nNota do Aluno %d - %d Bimestre: ",i+1, j+1);
15 scanf("%f", &notas[i][j]);
16 mediaaluno = mediaaluno + notas[i][j];
17 }
18 mediaaluno = mediaaluno / C;
19 printf("\nMedia do Aluno %d: %f", i+1, mediaaluno);
20 mediaturma = mediaturma + mediaaluno;
21 }
22 mediaturma = mediaturma / L;

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 50 de 62
23 printf("\nMedia da Turma: %f", mediaturma);
24 }

Linha Comentrio
1 A constante L representa o nmero de linhas do vetor.
2 A constante C representa o nmero de colunas do vetor.
10 O comando for mais externo responsvel pela variao das linhas (alunos) e
para cada repetio ser acumulado em mediaturma a mediaaluno, por isso
necessrio inicializarmos mediaturma com 0.
12 O comando for mais interno responsvel pela variao das colunas (bimestres)
e para cada repetio ser acumulado em mediaaluno a nota de um aluno em
cada bimestre, por isso necessrio inicializarmos mediaaluno com 0.
16 Acumula em mediaaluno todas as notas de um aluno.
20 Acumula em mediaturma a media de um aluno.

O vetor, seja unidimensional ou bidimensional, pode ser inicializado como qualquer varivel e
isso que veremos agora. No exemplo abaixo declaramos um vetor de inteiros com 10
elementos e ao mesmo tempo inicializamos com os valores informados.

int i[10]={1,2,3,4,5,6,7,8,9,10}

O vetor i ser preenchido de forma que i[0] ter o valor 1, i[1] o valor 2 e assim
sucessivamente. Veja abaixo um exemplo de inicializao de um vetor bidimensional.

int quadrados[10][2] = {1,1,2,4,3,9,4,16,5,25,


6,36, 7,49,8,64,9,81,10,100}

0 1
0 1 1
1 2 4
2 3 9
3 4 16
4 5 25
5 6 36
6 7 49
7 8 64
8 9 81
9 10 100
J vetores de caracteres, mais conhecidos como strings, devem ser inicializados assim:

char str[18] = Ifet Juiz de Fora

Toda string possui no seu final um caractere nulo que sinaliza o seu fim (/0). Por isso que
dimensionamos o vetor str com tamanho 18, apesar de Ifet Juiz de Fora s possuir 17
caracteres. Voc no precisa adicionar o caractere nulo ao final das constantes string,
manualmente. O compilador C faz isso por voc automaticamente.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 51 de 62
Muitas linguagens de programao fornecem o tipo string para que possamos armazenar uma
cadeia de caracteres. No o caso da Linguagem C. Em C uma String definida como um vetor
de caracteres.

Para solicitar a entrada de uma string, utilize a funo gets(). Veja um exemplo abaixo.

Exemplo da funo gets

1 char frase[80];
2 printf("\nDigite uma frase: ");
3 gets(frase);
4
Procure saber sobre algumas funes pr-definidas em C para a manipulao de string.

No exemplo acima, o vetor frase armazena somente uma string. Como proceder para
armazenar vrias strings ? simples, basta declararmos um vetor bidimensional de caracteres.
O tamanho do ndice esquerdo indica o nmero de strings que desejamos armazenar e o
tamanho do ndice direito especifica o comprimento mximo de cada string.

A declarao de um vetor de 30 strings, cada qual com um comprimento mximo de 79


caracteres seria assim:

char str[30][80]

Para acessar uma string individualmente, especificamos apenas o ndice esquerdo. A instruo
gets(str[2]) l do teclado uma string e armazena 3 linha do vetor bidimensional.

Para acessar um caractere individualmente, de uma string, especificamos os dois ndices. A


instruo printf(%c,str[2][5]) mostra o 6 caractere da 2 string.

Vamos mostrar um programa que manipula strings. Trata-se de um editor de texto bem
simples.

Programa editor.c

1 main(){
2 int i;
3 char texto [100][80] ;
4
5 printf("\nDigite o texto...\n" );
6 for (i=0; i<100; i++){
7 gets(texto[i]);
8 }
9
10 //mostra o texto na tela
11 for (i=0; i<100; i++){
12 if (texto[i][0] == '\0'){
13 break ;
14 }
15 printf("%s\n", texto[i]);
16 }
17 }

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 52 de 62
Linha Comentrio
3 O vetor bidimensional de nome texto ter a capacidade de armazenar 100 linhas
com 79 caracteres cada.
12 Se o primeiro caractere de uma linha for o \0significa que no tem mais linhas
com texto.

Exerccios
1) Qual ser a configurao do vetor num depois de executado o trecho de programa abaixo?

int num[5][5], i , j;
0 1 2 3 4
for (i=0; i<5; i++){
for (j=0; j<5; j++){ 0
if (i>j){
num[i][j]=1; 1
}
if (i==j){ 2
num[i][j]=0;
}
if (i<j){ 3
num[i][j]=-1;
} 4
}
}

1) Codificar um programa que permita o registro das informaes sobre as vendas realizadas
por uma determinada empresa. Considere que as informaes sobre cada venda so a
quantidade de itens vendidos e o preo de venda. O programa dever emitir um relatrio
que informe o faturamento total obtido com a venda de todos os itens cadastrados.

2) Fazer um programa que leia uma string e a imprima de trs pra frente.

Exemplo:
Entrada: ifsudestemg
Sada: gmetsedus

3) Fazer um programa que leia a senha do usurio e informe se a senha est correta ou
incorreta. Considere que a senha correta esteja gravada no cdigo fonte do programa.

4) Codificar um programa para simular a verificao se o dado usado em um determinado


jogo viciado ou no. Considere que dado no viciado aquele em que no h
grande variao na quantidade de vezes que cada face sorteada ao final de vrios
lanamentos. O programa deve permitir ao usurio escolher o nmero de faces do dado
(mnimo 2) e a quantidade de lanamentos a serem simulados. Aps fazer a simulao, o
programa dever emitir um relatrio apresentando a quantidade de vezes que cada face
fora sorteada.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 53 de 62
10. Modularizao
A modularizao consiste em um mtodo para facilitar a construo de grandes programas,
atravs de sua diviso em pequenos programas conhecidos como mdulos, rotinas, sub-
rotinas ou sub-programas.

Um dos objetivos do programador dividir o programa em mdulos de menor complexidade,


eliminando o inconveniente dos programas se tornarem extremamente grandes e complexos,
em aplicaes de maior porte.

O programador ao projetar um programa dever levar em conta que os mdulos so criados


de acordo com a sua funo. Os mdulos devero ter funes especficas e independentes (em
termos funcionais). Esta caracterstica de independncia funcional dos mdulos facilita a
manuteno do cdigo e o trabalho em equipe. O programador ao projetar um programa deve
procurar separar blocos de comandos de acordo com sua funo. Chamamos estes blocos de
funes.

Na linguagem C, implementamos os mdulos de programa atravs das funes. No incio do


nosso curso falamos sobre funo, mas agora o enfoque ser diferente. Estamos interessados
na implementao de nossas prprias funes.

Uma funo um trecho de programa que possui cabealho, variveis e comandos prprios e
que pode ser chamado (invocado) por um programa ou outra funo. Quando uma funo
referenciada, o controle do fluxo de execuo automaticamente transferido para o princpio
dela. As instrues so ento executadas e ao final, o controle automaticamente devolvido
instruo imediatamente a seguir chamada da funo.

Para executar uma funo, ela deve ser invocada no corpo de outra funo, exceto a funo
main(), que executada ao iniciar o programa. O esquema abaixo mostra como fluxo de
execuo ao invocarmos uma funo.

funcao1(){ funcao2(){
. .
. .
. .
funcao2(); }
.
.
.
}

Veja abaixo um exemplo de programa, que diferentemente de todos que criamos at o


momento, separa cada funcionalidade em mdulos especficos.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 54 de 62
Programa funcao.c

18 void apresentacao(void);
19 int edivisivel( int a, int b);
20
21 main(){
22 int n1,n2;
23 apresentacao();
24 printf("\nInforme um numero: ");
25 scanf("%d", &n1);
26 printf("\nInforme um numero: ");
27 scanf("%d", &n2);
28
29 if ( edivisivel(n1,n2)){
30 printf("%d e divisivel por %d", n1, n2);
31 }else{
32 printf("%d NAO e divisivel por %d", n1, n2);
33 }
34 }
35
36 void apresentacao(void){
37 system("cls");
38 printf("\n*************************************");
39 printf("\nPROGRAMA QUE EXPLICA O USO DE FUNCOES");
40 printf("\n\nIF SUDESTE MINAS GERAIS");
41 printf("\nProf. Hilton Cardoso Marins Junior");
42 printf("\n*************************************");
43 }
44
45 int edivisivel( int a, int b){
46 if ((a%b) == 0 ){
47 return 1;
48 }else{
49 return 0;
50 }
51 }

Linha Comentrio
1e2 Escrevemos os prottipos de todas as funes que fazem parte do programa
funcao.c. No nosso caso so duas: apresentacao() e edivisivel(). Um prottipo de
funo composto apenas do cabealho da funo, sem implementao. Mais
adiante detalharemos melhor sobre o cabealho de uma funo.
6 Chamada da funo apresentao(). Neste ponto o fluxo de execuo desviado
para a primeira instruo localizada dentro da funo apresentacao(). Ao
executar todas as instrues da funo apresentao(), o fluxo de execuo
continua na prxima linha (7).
12 Verifica-se aqui uma chamada funo edivisivel() e o envio de duas varivel (n1
e n2)e tambm o retorno de informao. Neste caso a informao retornada far
parte da expresso condicional.
13 e 14 O retorno da funo pode ser um nmero diferente de 0 (verdadeiro) ou igual 0
(falso).
19 Cabealho da funo apresentacao(). O cabealho de uma funo possui 3 partes:
O tipo de retorno, o nome da funo e os dados necessrios para que a funo
cumpra o seu papel. A funo apresentacao() no precisa de nenhum dado e to

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 55 de 62
pouco retorna um dado, por isso usamos a palavra void.
28 J a funo edivisivel(), tem como objetivo verificar se um nmero divisvel por
outro. Portanto ela precisa de dois dados e retorna uma indicao se o primeiro
ou no divisvel pelo segundo. Quando a funo edivisivel() chamada os valores
de n1 e n2 sero atribudos s variveis a e b, realiza-se a verificao e a palavra
return sinaliza que a funo ser finalizada e o dado que aparece ao seu lado
ser devolvido chamada da funo.

Vimos no exemplo acima que podemos passar dados para funes, assim como receber dados
das funes. Vamos aprofundar um pouco neste assunto.

Argumentos de uma funo so utilizados para transmitir informaes para a funo. Se uma
funo usa argumentos, ela deve declarar variveis que aceitem os valores dos argumentos.
Estas variveis so chamadas de parmetros formais. Os parmetros formais se comportam
como quaisquer outras variveis dentro da funo.

Uma funo pode receber qualquer nmero de argumentos, inclusive nenhum. No caso de
uma funo sem argumentos pode-se escrev-la de duas formas: deixando a lista de
argumentos vazia (mantendo-se os parnteses) ou colocando o tipo void entre parnteses.

Exemplo de funo que recebe um int e retorna outro int

1 int triplo(int r){


2 return 3*r;
3 }

Exemplo de funo sem parmetros e sem retorno

1 void mostra(){ //ou void mostra(void)


2 printf(Ola!);
3 }

O retorno de uma funo um valor que ser retornado para quem a chamou. O tipo de
retorno fornecido no cabealho da funo antes de seu nome. No caso da funo triplo()
acima, o retorno ser um nmero do tipo int. O comando return faz com que seja
retornado o valor especificado e faz com que a funo termine. O comando return pode ser
utilizado tambm para indicar a sada imediata da funo. Se uma funo no retorna nada,
seu tipo de retorno deve ser definido como void. Se o tipo de retorno da funo no
explicitamente declarado, o compilador C atribui automaticamente o tipo padro, que int.

Vejamos mais um exemplo de programa que usa funes.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 56 de 62
Programa calculamedia.c

1 float calculaMedia (float argA ,float argB );


2
3 main() {
4 float a , b , m;
5
6 printf ("\nDigite o primeiro numero: " ) ;
7 scanf ("%f", &a ) ;
8
9 printf ("\nDigite o segundo numero: " ) ;
10 scanf ("%f", &b ) ;
11 m = calculaMedia (a, b) ;
12
13 printf("\nMedia entre %.2f e %.2f %.2f\n",a,b,m);
14 }
15
16 float calculaMedia (float argA , float argB) {
17 float mediaCalculada ;
18
19 mediaCalculada = ( argA + argB ) / 2 ;
20 return mediaCalculada ;
21 }

Linha Comentrio
11 H uma chamada funo calculaMedia() e o valor de retorno atribudo
variavel m.
20 Sinaliza que o valor que ser retornado.

Podemos passar um vetor como parmetro para uma funo. Veja o exemplo abaixo.

Programa imprimevetor.c

1 void imprimeMatriz (float arg[4][4]);


2
3 int main(){
4 float matriz [4][4] ;
5 int i , j ;
6
7 printf("\nDigite os elementos da matriz\n" ) ;
8 for (i = 0 ; i < 4 ; i++ ){
9 for (j = 0 ; j < 4 ; j++ ){
10 scanf ( "%f" ,&matriz [i][j]) ;
11 }
12 }
13 imprimeMatriz (matriz) ;
14 }
15
16 void imprimeMatriz (float arg[4][4]){
17 int i , j ;
18
19 printf("\nImpressao da matriz\n" ) ;
20 for (i = 0 ; i < 4 ; i++ ){
21 for (j = 0 ; j < 4 ; j++ ){

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 57 de 62
22 printf("%.1f\t" ,arg[i][j]);
23 }
24 printf("\n");
25 }
26 }

Para finalizar o assunto sobre funes vamos discutir sobre os cuidados a serem tomados com
os locais de declarao de variveis. O escopo de uma varivel a regio do programa que ela
pode ser referenciada. Essa regio tem incio na linha onde a varivel declarada e termina
com o fim das chaves que finalizam o bloco. Existem 3 lugares em um programa em C onde as
variveis podem ser declaradas e desta forma so classificadas:

1. Fora de todas as funes, inclusive da funo main(). A varivel assim declarada


chamada de varivel global e pode ser usada em qualquer parte do programa. Uma
varivel global criada (alocada na memria) quando o programa inicia e destruda
(liberada da memria) quando o programa finalizado.

2. Dentro de uma funo. A varivel assim declarada chamada de varivel local e s


pode ser usada dentro desta funo. Uma varivel local criada quando a funo
invocada e destruda quando a funo finalizada.

3. Na lista de parmetros formais de uma funo, para receber os argumentos que so


passados para a funo. Uma varivel declarada como parmetro formal de uma
funo criada quando a funo invocada e destruda quando a funo finalizada.
Comporta-se como uma varivel local.

Agora podemos apresentar a forma geral de um programa em C.

declaraes das variveis globais


declaraes dos prottipos das funes

tipo-devolvido main (lista-de-parmetros){


sequncia-de-comandos;
}

tipo-devolvido f1 (lista-de-parmetros){
sequncia-de-comandos;
}

tipo-devolvido f2 (lista-de-parmetros){
sequncia-de-comandos;
}
...
tipo-devolvido fn (lista-de-parmetros){
sequncia-de-comandos;
}

Observao: f1() at fn() representam as funes definidas pelo usurio.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 58 de 62
Exerccios
1) Considerando a funo abaixo.

int M(int K, int L){


if (K > L){
return 1;
}

if (K == L){
return 0;
}

if (K < L){
return -1;
}
}

Calcule:

a) M(3,2)
b) M(3,2) + M(2,3) + M(2,2)
c) M(2 * M(3,2), M(2,3 + 2))

2) Fazer um programa que gere e imprima um vetor com 20 nmeros inteiros. Estes nmeros
devem ser aleatrios e gerados pela funo int geraInt(int limite). Esta funo gera
aleatoriamente um nmero inteiro entre 1 e limite.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 59 de 62
11. Estruturas de Dados Heterogneas - struct
Em situaes onde necessrio o armazenamento de dados de tipos diferentes, o vetor no
nos atender. Necessitaremos de estruturas que armazenam dados de tipos diferentes. Uma
estrutura de dados heterognea uma coleo de variveis de tipos diferentes referenciadas
por um nico nome, permitindo agrupar informaes que possuem algum tipo de relao.

Primeiro devemos definir a estrutura. Esta ao equivale a definir um modelo a ser usado para
criar diversas variveis (exemplares). A palavra-chave struct indica a definio de uma
estrutura.

Exemplo de definio de uma estrutura de dados heterognea de nome dados

1 struct dados{
2 char nome[30];
3 char curso[20];
4 char turma;
5 double nota;
6 };

O trecho de cdigo acima, no declarou nenhuma varivel, apenas definiu a forma dos dados.
Definimos que nossa estrutura possui o nome dados e que composta de alguns membros
(elementos ou campos).

Aps a definio da estrutura dados declaramos variveis desse tipo. Veja o exemplo abaixo.

Exemplo de declarao de variveis

1 struct dados aluno;


2 struct dados professor
3 struct dados funcionario

Declaramos 3 variveis do tipo dados. Para manipular os campos de uma estrutura


escrevemos assim:

nome_da_varivel.nome_do_campo

Prtica: Structs
Para exemplificarmos, veremos um programa que calcula a distncia entre dois pontos no
plano cartesiano.

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 60 de 62
Programa ponto.c

1 main (){
2 struct ponto{
3 int x,y;
4 };
5 struct ponto pontoA, pontoB;
6
7 printf("\nValor da coordenada X do Ponto A: ");
8 scanf("%d",&pontoA.x);
9
10 printf("\nValor da coordenada Y do Ponto A: ");
11 scanf("%d",&pontoA.y);
12
13 printf("\nValor da coordenada X do Ponto B: ");
14 scanf("%d",&pontoB.x);
15
16 printf("\nValor da coordenada Y do Ponto B: ");
17 scanf("%d",&pontoB.y);
18
19 float aux = ((pontoB.y - pontoA.y)*(pontoB.y - pontoA.y))+
20 ((pontoB.x - pontoA.x)*(pontoB.x - pontoA.x));
21
22 float distancia = sqrt(aux);
23
24 printf("\nA distncia entre os dois pontos: %f",distancia);
25 }

Linha Comentrio
2a4 Definio de uma estrutura de dados heterognea chamada ponto que contm
dois campos inteiros (x e y).
7 a 17 Leitura das coordenadas de cada ponto.
19 a 22 Clculo da distncia entre dois pontos atravs do teorema de Pitgoras.

Podemos combinar as estruturas estudadas at o momento, ou seja, podemos ter um vetor


onde cada elemento uma struct ou uma struct onde seus campos so vetores. Veja o
exemplo abaixo.

Exemplo de um vetor de struct

1 struct info{
2 char nome[30];
3 float nota;
4 };
5
6 struct info alunos[100];
7 .
8 .
9 .
10 printf(Nome: %s, alunos[5].nome);
11 printf(Nota..: %f, alunos[5].nota);

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 61 de 62
Linha Comentrio
1a4 Definio de uma estrutura chamada info que contm um campo chamado
nome (vetor de char) e outro campo chamado nota.
6 Declarao de um vetor de nome alunos com 100 elementos do tipo info.
10 Faz referencia ao elemento de ndice 5 do vetor alunos. Como os elementos do
vetor so uma struct, complementamos com .nome.
11 Faz referencia ao elemento de ndice 5 do vetor alunos. Como os elementos do
vetor so uma struct, complementamos com .nota.

Typedef
A linguagem C permite a definio de novos nomes aos tipos de dados, utilizando a palavra-
chave typedef.

A forma geral de um comando typedef

typedef tipo novonome;

Onde tipo qualquer tipo de dados definido na linguagem C.

Por exemplo, poderamos criar um novo nome para float usando

typedef float real;

A partir da definio acima poderamos declarar uma varivel usando esse novo nome

real salario;

Veja um exemplo com struct:

1 main (){
2 typedef struct ponto{
3 int x,y;
4 }ponto;
5
6 ponto pontoA, pontoB;

Algoritmos
Prof. Hilton Cardoso Marins Junior Pgina 62 de 62

Anda mungkin juga menyukai