Buscar

Algoritmos I - Parte 3

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 7 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

UNIVERSIDADE COMUNITÁRIA DA REGIÃO DE CHAPECÓ 
ACEA 
CURSO DE CIÊNCIA DA COMPUTAÇÃO 
 
 
 
 
 
 
 
Algoritmos e Estrutura de Dados I 
 
 
 
Apostila da Disciplina – Parte 3 
Estruturas de Repetição 
 
 
 
 
 
 
 
 
Prof. José Carlos Toniazzo 
 
 
 
 
 
 
 
 
 
Chapecó, 2011 
Estruturas de Repetição 
 
Uma repetição, também chamada de laço ou loop, é uma estrutura que permite executar um 
trecho de um algoritmo várias vezes seguidas. Veremos dois tipos de estruturas básicas, a 
repetição com teste no início e a repetição com teste no final, e fecharemos o estudo de 
repetições com o caso complementar da repetição com variável de controle. 
 
1 – Comandos repita e enquanto (para repetir um número indefinido de vezes) 
 
Tanto o comando repita quanto o comando enquanto permitem repetir um ou mais comandos 
no corpo de um algoritmo. A sintaxe dos comandos é: 
 
repita 
<comando1>; 
<comando2>; 
. 
. 
. 
<comandoN>; 
até <expressão>; 
 
 
 
enquanto <expressão> faça 
<comando>; 
 
 
2 – Comando para...faça (para repetir um número definido de vezes) 
 
 
Além destes temos o para...faça, que é uma estrutura de repetição utilizada quando sabemos 
quantas vezes queremos repetir um laço. 
 
 
Para... Faça 
<comando>; 
. 
. 
. 
 
 
 
 
Para todas as condições há um teste feito através de uma expressão lógica, que indica se o 
laço deve continuar ou parar. 
 
Para o primeiro caso, quando o computador encontra a palavra repita, ele saberá que todos 
os comandos seguintes, até encontrar a palavra até, estarão dentro de um laço e serão 
executados. Após a palavra até deve existir uma expressão lógica; sendo falsa, o computador 
voltará para o primeiro comando após a palavra repita, e todo o trecho será novamente 
executado. A repetição continua até que o resultado da expressão lógica seja verdadeiro, 
indicando que o laço acabou e que o computador deve seguir a seqüência do algoritmo. 
 
Chamamos esta estrutura de repetição com teste no final, pois a decisão entre repetir ou 
parar o laço é feita ao final do comando; conclui-se, portanto, que sempre haverá pelo menos 
uma execução do trecho delimitado. O teste é executado após os comandos serem 
executados pelo menos uma vez. Isso garante que aquele trecho de código será executado 
PELO MENOS em uma iteração. 
 
Para o segundo caso, a palavra enquanto indica que o comando seguinte será executado, 
desde que o resultado da expressão lógica seja verdadeiro. Em nosso português estruturado, 
nada impede que também possamos pedir para executar um comando composto (um bloco, 
delimitado por chaves {}). 
 
Ao encontrar o final do comando (ou do bloco), o computador volta para a 1ª linha do laço e 
verifica se a expressão lógica ainda é verdadeira; se sim, fará uma nova execução do trecho, 
se não, pára a execução do laço e continua no próximo comando após o trecho repetido. 
 
Chamados esta estrutura de repetição com teste no início, pois a decisão entre repetir ou 
parar o laço é feita no começo do comando; se o teste for falso logo na 1ª vez, o trecho 
delimitado não será executado. 
 
O terceiro quadro apresenta o Para... faça, que foi estudado e deve ser utilizado em situações 
onde sabemos quantas vezes vamos executar um laço. 
 
 
Comparando: 
 
- o para...faça é uma estrutura de repetição que normalmente está associada a um índice, e 
através dele executados um número DETERMINADO de vezes, ou seja, sabemos quantas 
vezes queremos repetir o laço; 
Ex; Ler e mostrar na tela 10 números. 
 
- enquanto... faça, ao contrário do para... faça, é utilizado quando NÃO SABEMOS QUANTAS 
VEZES O LAÇO IRÁ EXECUTAR. Nas situações onde o laço pode executar de 0 até N vezes, 
ou seja, um número determinado de vezes, devemos fazer o laço utilizando o enquanto...faça. 
Ex: Ler números até que um valor negativo seja informado 
 
- repita...até (alguns autores denominam faça..enquanto). É similar ao enquanto...faça, com a 
diferença de que o laço deve executar PELO MENOS UMA VEZ, pois o teste é feito no final. 
Sendo assim, o laço irá repetir de 1 até N vezes. Usado em situações onde pelo menos uma 
vez os comandos devem ser executados. 
Ex: Testar o Login de um Sistema (pelo menos uma vez deve pedir para digitar usuário e 
senha) 
 
 
OBS: É de grande importância que o aluno diferencie cada um dos laços de repetição e 
escolha o laço certo para utilizar no desenvolvimento de um algoritmo correto e 
eficiente 
 
 
 
 
 
 
 
Exemplo 1: 
 
Fazer um algoritmo para ler diversos números informados pelo usuário, e após cada leitura 
exibir se o número é par ou ímpar. Considere que ao fornecer um valor negativo o usuário 
deseja encerrar a entrada de dados. 
 
Solução: 
 
Se não existissem estruturas de repetição, nossa primeira versão do algoritmo poderia ser 
algo do tipo: 
 
// Algoritmo incompleto e errado 
Variáveis 
NUM1, NUM2, NUM3, ... ? : inteiro; 
Início 
ler NUM1; 
se (NUM1 % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
ler NUM2; 
se (NUM2 % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
ler NUM3; 
se (NUM3 % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
??? 
Fim 
 
Para descobrir se um número é par, testamos se o resto da sua divisão por 2 é zero; sendo 
verdadeiro, o número é par e sendo falso o número é ímpar. O grande problema que impede 
terminar o algoritmo é que não sabemos de antemão quantos dados serão fornecidos; 
além de inviabilizar a montagem da listagem dos comandos, também não saberíamos quantas 
variáveis seriam criadas. 
 
Vamos então incluir o trecho que naturalmente está sendo repetido dentro de um comando 
de repetição repita, declarando apenas uma única variável: 
 
//Algoritmo quase correto 
Variáveis 
NUM: inteiro; 
Inicio 
repita 
{ 
ler NUM; 
 
se (NUM % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
 
até NUM < 0; 
} 
Fim. 
 
Nosso laço agora repete dois comandos: uma leitura e um comando de decisão (lembre-se de 
que, apesar de estar escrito em mais de uma linha, o se-então-senão é um comando só). 
Suponha que na 1ª leitura o usuário forneça o valor 7. Seguindo a seqüência, o computador 
terá um teste falso e escreverá a mensagem de que o número é ímpar. Ao encontrar a palavra 
até o teste do laço será falso (pois 7 não é menor que 0), e o computador volta novamente 
para o comando de leitura. 
 
Com este laço, o usuário poderá ficar indefinidamente fornecendo números para a máquina, 
recebendo como resposta a informação de que ele é par ou ímpar. Mas se ele decidir parar a 
repetição e entrar com um número negativo, digamos -1, ainda assim o computador tentará 
exibir uma mensagem para este último valor, pois estará seguindo a sequência do laço. Veja 
um exemplo: 
 
8 -> o número é par 
11 -> o número é ímpar 
21 -> o número é ímpar 
8 -> o número é par 
-1 -> o número é ímpar (PROBLEMA!) 
 
Uma maneira de contornar o problema seria modificar o teste dentro do laço: 
 
// Algoritmo correto mas deselegante 
 
Variáveis 
NUM: inteiro; 
Inicio 
repita 
 ler NUM; 
 se (NUM >= 0) e (NUM % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
até NUM < 0; 
Fim. 
 
O algoritmo agora executa uma solução correta para o problema. Esta solução, contudo, é um 
pouco deselegante, pois sabe-se que o teste NUM>=0 sempre será verdadeiro, exceto no 
último caso. 
 
Vejamos uma tentativa de solução com o comando enquanto. 
 
// Algoritmo incompleto 
Variáveis 
NUM: inteiro; 
Inicio 
enquanto NUM >= 0 faça 
{ 
 ler NUM; 
 se (NUM>= 0) e (NUM % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
} 
 
Fim. 
 
O bloco de comandos foi necessário porque queremos executar mais de um comando dentro 
do enquanto (no repita não há necessidade de bloco, pois sua sintaxe já delimita um início e 
um final para a repetição). 
 
Este algoritmo apresenta um problema, pois como agora o teste é feito no início do laço, já 
deveria haver um valor na variável NUM na 1ª vez (e não há, tornando a execução 
imprevisível). É preferível deslocar a leitura para antes do começo do laço, fazendo a variável 
NUM ter um valor logo no início da repetição: 
 
// Algoritmo incompleto 
Variáveis 
NUM: inteiro; 
Inicio 
ler NUM; 
enquanto NUM >= 0 faça 
{ 
se (NUM >= 0) e (NUM % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
} 
Fim. 
 
Por outro lado, deixando o algoritmo assim podemos cair em um laço infinito. Se na 1ª vez o 
usuário fornecer um valor válido, como 8, o algoritmo entrará no laço e imprimirá a mensagem 
de que o número é par. Como não há outro comando após o comando de decisão, o 
computador volta e testa novamente se NUM>=0. O usuário não teve chance de fornecer 
outro número; logo, o valor continuará sendo 8 e o algoritmo ficará indefinidamente 
imprimindo: 
 
O número é par 
O número é par 
O número é par 
O número é par 
O número é par 
... 
Finalmente, vamos então incluir outro comando de leitura dentro do laço, e complementar 
mensagens de auxílio ao usuário: 
 
// Algoritmo completo 
Variáveis 
NUM: inteiro; 
Inicio 
escrever ‘Entre com um número: ’; 
ler NUM; 
enquanto NUM >= 0 faça 
{ 
se (NUM % 2) = 0 então 
escrever ‘ O número é par’; 
senão 
escrever ‘O número é impar’; 
 
escrever ‘Entre com um número: ‘; 
ler NUM; 
 } 
escrever ‘Fim do algoritmo’; 
Fim. 
 
Independente de qual estrutura de repetição utilzar, sempre devemos lembrar das 
características de cada uma e fazer a escolha que torne viável e correta a resolução dos 
problemas utilizando o conceito de algoritmos. 
 
Algumas dicas: 
 
- Escolher sempre a estrutura de repetição mais adequada; 
 
- Verificar a possibilidade de trabalhar com mais de uma estrutura no mesmo 
algoritmo, dependendo do problema a ser resolvido; 
 
- Entender que toda a estrutura de repetição está vinculada a um teste condicional, o 
que a repetição termina quando o teste condicional determinar; 
 
- Em hipótese alguma fazer um algoritmo com laço de repetição infinito, pois isto torna 
o algoritmo incorreto. 
 
 
Conclusão 
 
No estudo da informática o algoritmo e como o alicerce de uma casa, sem ele não se 
pode construir as paredes e o telhado, ou seja, sem o algoritmo não se pode criar um estudo 
sistematizado em nenhum campo da informática. 
 
No mundo atual praticamente todas as tarefas podem ser automatizadas, e para isso 
fazemos o uso de computadores. E os computadores precisam de receberem ordens para 
funcionarem, daí a necessidade de algoritmos. 
 
Para aprendermos a criar algoritmos não basta estudar ou copiar algoritmos, para se 
aprender como manipular situações e codificá-las em forma de algoritmo precisamos de 
escrever e criar algoritmos, pegar exercícios, e praticar. 
 
Exercícios 
 
1 - Construir um algoritmo que calcule a média aritmética de vários valores inteiros positivos, 
lidos externamente. O final da leitura acontecerá quando for lido um valor negativo. 
 
2. Escreva um algoritmo que leia 50 valores e encontre o maior e o menor deles. Mostre o 
resultado. 
 
3- Faça um algoritmo que leia vários números inteiros e calcule o somatório dos números 
negativos. O fim da leitura será indicado pelo número 0. 
4. Escrever um algoritmo que leia um número não determinado de valores e calcule a média 
aritmética dos valores lidos, a quantidade de valores positivos, a quantidade de valores 
negativos e o percentual de valores negativos e positivos. Mostre os resultados. 
5. Escrever um algoritmo que leia uma quantidade desconhecida de números e conte quantos 
deles estão nos seguintes intervalos: [0.25], [26,50], [51,75] e [76,100]. A entrada de dados 
deve terminar quando for lido um número negativo.

Outros materiais