Você está na página 1de 4

Algoritmo com Repetio

Vamos pensar no algoritmo para o clculo da mdia de um aluno. Teramos que execut-lo quantas vezes seja o nmero
de alunos da turma. Mais ainda, se quisermos saber a mdia geral da turma, teramos que faz-la manualmente, j que o
algoritmo da mdia calcula a mdia de apenas um aluno, e ao trmino da execuo, ela descartada.

Outra forma de resolver o problema de calcular a mdia de todos os alunos da turma utilizar a mesma sequncia de
comandos novamente, de forma automtica. Para isso, teramos que realizar um retrocesso ao incio dos comandos para
coletar os dados de cada aluno e calcular a mdia. Dessa forma, o fluxo lgico caracterizado pela repetio desse trecho
de algoritmo: a coleta dos dados e o clculo da mdia.

A esses trechos de algoritmos que so repetidos d-se o nome de laos de repetio ou loops. O nmero de repeties
pode ser indeterminado (quando no se sabe o nmero de alunos na turma, por exemplo), mas deve ser sempre finito.

Existem pelo menos trs tipos de comandos de repetio que podem ser utilizados nesse tipo de algoritmo:

O comando de repetio condicional com teste no incio (enquanto-faa)


O comando de repetio condicional com teste no final (repita-at)
O comando de repetio contada (para-faa)

A escolha do comando de repetio a ser utilizado depende da natureza do algoritmo. Por exemplo, o comando de
repetio contada muito til quando sabemos de antemo (seja na construo do algoritmo ou em tempo de execuo)
a quantidade de vezes que o trecho de algoritmo ser repetido. Por isso ele no precisa de condicional, pois ser executado
sempre o nmero de vezes para o qual foi construdo.

Quando no sabemos quantas vezes o trecho de algoritmo ser repetido, ento usamos algum comando de repetio
condicional, que depende do valor de uma varivel para parar a repetio do trecho. O comando enquanto-faa, um dos
mais utilizados, principalmente porque pode ser usado para resolver qualquer tipo de algoritmo. Por isso, vamos comear
a utilizar esse comando de repetio.

Repetio condicional com teste no incio (enquanto-faa)

Essa estrutura de repetio permite executar diversas vezes um trecho de algoritmo, sempre verificando antes de cada
execuo se o valor da condio permite repetir o trecho.
enquanto condio faa
incio F
cond
comando1;
comando2; V
...
comandos
comando_n;
fim;

Quando o resultado da condio for falsa, os comandos so abandonados e o prximo comando aps o fim do enquanto
executado. Se j na primeira vez o resultado for falso, os comandos no so executados nenhuma vez.

A condio pode controlar a quantidade de vezes que o lao repetido com base em um contador ou no valor de uma
varivel lido externamente. No ltimo caso, deve existir uma negociao do valor da varivel que ser utilizado como
critrio de parada o momento em que a condio se torna falsa e o lao de repetio interrompido.

Para inserir o clculo da mdia dos alunos em um lao de repetio utilizando o enquanto, a condio seria que a
quantidade de mdias calculadas fosse menor ou igual a 50. Porm, o que indica quantidade de vezes que a mdia foi
calculada? Temos que ter um modo de contagem, que pode ser feito por meio de uma varivel de controle chamada de
contador, que inicializada antes do trecho de algoritmo que ser repetido e que atualizada (incrementada ou
decrementada) a cada repetio.
Exemplo 1: Clculo da mdia dos 50 alunos usando a estrutura enquanto.
algoritmo turma;
variveis n1, n2, n3, media_n: real;
nome: cadeia;
i: inteiro; //contador
incio
i 0; // inicializao da varivel de controle
enquanto (i < 50) faa
incio
escrever(Entre com o nome do aluno:);
ler(nome);
escrever(Entre com as trs notas desse aluno:);
ler(n1, n2, n3);
media_n (nota1 + nota2 + nota3)/3;
escrever(O aluno ,nome, obteve mdia ,mdia);
i i + 1; //atualizao da varivel de controle
fim;
fim.

Em todos os algoritmos de repetio frequente o uso de variveis com duas funes especiais: os acumuladores e os
contadores.

Contadores so variveis que acumulam somas constantes. Eles tm seus valores alterados (para mais ou para
menos) em intervalos constantes. As variveis de controle de repetio normalmente so variveis contadoras.
Exemplos: i i + 1; cont cont - 2;

Acumuladores so variveis que acumulam a soma de outras variveis. Eles tm seus valores alterados (para mais
ou para menos) em intervalos variveis. Normalmente os valores acumulados durante a repetio do trecho de
algoritmo sero parte de algum clculo fora do lao de repetio.
Exemplos: soma soma + media; acum acum + x;

Para o clculo da mdia geral da turma por exemplo, precisaremos somar todas as mdias dos alunos em uma varivbel
acumuladora para, ao final do lao de repetio, dividir a soma pelo total de alunos.

Exemplo 2: Clculo da mdia geral da turma, usando um acumulador e a estrutura enquanto.


algoritmo media_geral_turma;
variveis n1, n2, n3, media_n, soma: real;
nome: cadeia;
i: inteiro;
incio
i 0; // inicializao da varivel de controle
soma 0; // inicializao da varivel acumuladora
enquanto (i < 50) faa
incio
escrever(Entre com o nome do aluno:);
ler(nome);
escrever(Entre com as trs notas desse aluno:);
ler(n1, n2, n3);
media_n (nota1 + nota2 + nota3)/3;
soma soma + media_n; //atualizao da varivel acumuladora
escrever(O aluno ,nome, obteve mdia ,mdia);
i i + 1; //atualizao da varivel de controle
fim;
escrever(A mdia geral da turma foi , soma/50);
fim.
Os exemplos 1 e 2 utilizam o pr-conhecimento da quantidade de alunos na turma da qual se desejava calcular a mdia.
Mais ainda, eles s funcionam para turmas de 50 alunos. E se quisssemos tornar o algoritmo mais geral e calcular a mdia
geral de turmas de qualquer tamanho? O que seria feito para controlar o lao de repetio?

Nesse caso tem-se que encontrar um critrio de parada, que pode ser feito utilizando um valor pr-definido como
finalizador de uma sequncia de valores. Por exemplo, vamos definir que a sequncia de comandos deve parar quando o
nome do aluno digitado seja igual a *, que claramente no representa nome de nenhum aluno. O Exemplo 3 mostra um
algoritmo para isso.

importante notar que o valor usado como finalizador deve ser diferente de qualquer valor esperado para a varivel, caso
contrrio, no se poder distinguir o finalizador de um valor esperado.

Outro aspecto importante que deve ser observado que os comandos dentro do lao de repetio podem no ser
executados, se a condio se tornar falsa j na primeira execuo. Nesse caso, tem-se que tomar cuidado com os valores
das variveis que podem estar envolvidas em clculos aps o lao de repetio. O caso clssico de erro em tempo de
execuo a diviso por zero. O Exemplo 3 mostra o clculo da mdia geral da turma aps o trmino do lao de repetio.
Nesse caso, se o primeiro nome de aluno j tornar a condio falsa, ento i continuar com o valor zero, resultando em
uma diviso por zero no clculo da mdia geral. Por isso, um comando de seleo foi colocado aps a repetio, para
tratar esse caso especificamente. O valor da varivel soma tambm ser zero nesse caso, mas isso no ocasionar erro de
execuo.

Exemplo 3: Clculo da mdia geral da turma para turmas de qualquer tamanho, usando a estrutura enquanto com
finalizador igual a * para o nome.
algoritmo media_geral_turma_com_finalizador;
variveis n1, n2, n3, media_n, soma: real;
nome: cadeia;
i: inteiro;
incio
i 0;
soma 0; // inicializao da varivel acumuladora
escrever(Entre com o nome do aluno ou * para parar:);
ler(nome); // inicializao da varivel de controle
enquanto (nome <> *) faa
incio
escrever(Entre com as trs notas desse aluno:);
ler(n1, n2, n3);
media_n (nota1 + nota2 + nota3)/3;
soma soma + media_n; //atualizao da varivel acumuladora
escrever(O aluno ,nome, obteve mdia ,mdia);
i i + 1;
escrever(Entre com o nome do aluno ou * para parar:);
ler(nome); //atualizao da varivel de controle
fim;
se (i > 0)
ento escrever(A mdia geral da turma foi , soma/i)
seno escrever(No existe mdia para ser calculada);
fim.
Exerccios

1) Escreva um algoritmo que leia 50 valores e conte quantos so negativos.


2) Escreva um algoritmo que leia 50 valores e encontre o maior e o menor deles.
3) Escreva um algoritmo que leia um nmero n e calcule o fatorial de n.
4) Escreva um algoritmo que leia vrios valores inteiros e positivos e calcule a mdia aritmtica desses valores. O
final da leitura deve acontecer quando o valor lido for negativo.
5) Escreva um algoritmo que leia vrios valores inteiros e calcule o produtrio desses valores. O final da leitura
deve acontecer quando o valor lido for igual a zero.
6) Escreva um algoritmo que leia vrios valores inteiros e positivos e calcule o produtrio dos nmeros pares. O fim
da leitura ser indicado pelo nmero zero.
7) Chico tem 1,5 metro e cresce 2 centmetros por ano, enquanto Z tem 1,1 metro e cresce 3 centmetros por
ano. Escreva um algoritmo que calcule e mostre quantos anos sero necessrios para que Z seja maior que
Chico.
8) Escreva um algoritmo que leia um nmero n que represente o nmero de termos de uma progresso aritmtica,
um nmero a1 que represente o primeiro termo da PA e um nmero r que represente a razo da PA. Escreva os
n termos dessa PA, assim como a soma dos mesmos.

Referncias:
Fundamentos da Programao de Computadores, das autoras Ana Fernanda G. Ascencio e Edilene Aparecida V. de Campos,
Editora Pearson Prentice Hall, 2002.

Lgica de programao, dos autores Alexandre Cruz Berg e Joice Pavek Figueir, Editora da Ulbra, 2 ed., 2001.

Você também pode gostar