Estruturas de Repetição Comando Enquanto-FimEnquanto Algoritmos e Técnicas de Programação Prof. Kleber Rezende
Considerações Iniciais Quando não temos condições de precisar quantas vezes um determinado conjunto de comandos precisa ser executado, devemos utilizar outras Estruturas de Repetição, como: ENQUANTO...FACA ou REPITA...ATE.
Considerações Iniciais Por exemplo, suponha que estamos oferecendo ao usuário 3 opções de menu sendo que uma dessas 3 opções seria a opção de SAIR do programa. Caso desejemos que o usuário possa executar várias vezes as opções dispostas no menu, não temos como adivinhar quando o usuário irá optar por SAIR do algoritmo Sendo assim, não podemos limitar a repetição a um número de vezes.
Considerações Iniciais Considere um problema mais específico onde necessitamos fazer a leitura de vários nomes de pessoas e a cada nome que é lido devemos escrever na tela a frase "O nome digitado foi NOME". A princípio isso deve ser feito inúmeras vezes e quando o usuário digitar um NOME igual a FIM o algoritmo deve parar.
Considerações Iniciais Da mesma maneira que no exemplo anterior, não podemos definir quando o usuário irá digitar FIM, e não temos como precisar a quantidade de vezes que o algoritmo deverá repetir esse conjunto de ações.
Considerações Iniciais Nessas situações, a repetição de um conjunto de comandos é determinada pela avaliação de uma expressão lógica, ou seja: caso o valor da expressão lógica seja verdadeiro o conjunto de comandos continua a ser executado, caso o valor da expressão lógica seja falso a estrutura de repetição é abortada.
Considerações Iniciais A estrutura de repetição ENQUANTO FACA FIMENQUANTO é utilizada da seguinte maneira: ENQUANTO (<EXPRESSÃO LÓGICA>) comando 1 comando 2... comando n FIMENQUANTO
Considerações Iniciais Antes de entrar na estrutura de repetição, a expressão lógica é avaliada; Caso o resultado da mesma seja VERDADEIRO os comandos que estão dentro da estrutura serão executados e ao final volta-se a avaliar a expressão lógica novamente. Caso o resultado da expressão lógica seja falso, o algoritmo sai da estrutura de repetição.
Exemplos Considere o algoritmo abaixo: Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... algoritmo "exemplo" variavel cadeia nome inicio nome "" enquanto (nome <> "fim") escreva("digite o nome") leia(nome) escreva("o nome digitado foi ", nome) fimenquanto Fimalgoritmo
Exemplos Ao chegar na linha 5, o algoritmo irá inicializar a variável NOME com o valor comeco. Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... algoritmo "exemplo" variavel cadeia nome inicio nome "" enquanto (nome <> "fim") escreva("digite o nome") leia(nome) escreva("o nome digitado foi ", nome) fimenquanto Fimalgoritmo
Exemplos Na linha 6 temos o início da estrutura de repetição sendo que a expressão lógica que está sendo avaliada é NOME <> "fim", ou seja, está sendo avaliado se o conteúdo da variável NOME é diferente da palavra "fim". Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... algoritmo "exemplo" variavel cadeia nome inicio nome "" enquanto (nome <> "fim") escreva("digite o nome") leia(nome) escreva("o nome digitado foi ", nome) fimenquanto Fimalgoritmo
Exemplos No nosso exemplo, o valor da variável NOME é igual a começo, então ao avaliar se NOME <> "fim", teremos que "comeco" <> "fim" é igual a VERDADEIRO, e então os comandos das linhas 7, 8 e 9 serão executados. Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... algoritmo "exemplo" variavel cadeia nome inicio nome "" enquanto (nome <> "fim") escreva("digite o nome") leia(nome) escreva("o nome digitado foi ", nome) fimenquanto Fimalgoritmo
Exemplos Ao chegar no final da estrutura de repetição (linha 10), o algoritmo irá retornar ao início dessa estrutura para avaliar novamente a expressão lógica NOME <> "fim" (linha 6). Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... algoritmo "exemplo" variavel cadeia nome inicio nome "comeco" enquanto (nome <> "fim") escreva("digite o nome") leia(nome) escreva("o nome digitado foi ", nome) fimenquanto Fimalgoritmo
Exemplos Em C, nosso algoritmo seria representado assim: main() { char nome[51]; strcpy (nome, "comeco"); } while (strcmp (nome, "fim")!= 0) { printf("digite o nome: "); scanf("%s", nome); printf("o nome digitado foi %s\n", nome); }
Estrutura de Repetição Fluxograma Início nome "" nome!= "fim"? Verdadeiro Escreva "digite o nome: " Falso Leia nome Escreva " ("o nome digitado foi " + nome " Fim
Transformando comando PARA em comando ENQUANTO A estrutura de repetição ENQUANTO deve ser utilizada, especialmente, quando não podemos determinar o número de vezes que o conjunto de comandos será repetido; Porém, nada impede que utilizemos uma expressão lógica que avalie o valor de um número, simulando dessa forma uma estrutura de repetição PARA.
Transformando comando PARA em comando ENQUANTO Suponha que desejemos realizar um conjunto de operações 10 vezes, como por exemplo, pedir a idade de 10 pessoas e calcular a soma dessas 10 idades.
Transformando comando PARA em comando ENQUANTO Utilizando a estrutura de repetição PARA teríamos o seguinte algoritmo: algoritmo "exemplo" variaveis inteiro cont, idade, soma inicio soma 0 para cont 1 ate 10 faca escreva("digite a idade") leia(idade) soma soma + idade fimpara escreva("soma das idades = ", soma) Fimalgoritmo
Transformando comando PARA em comando ENQUANTO Caso desejássemos escrever esse mesmo algoritmo utilizando a estrutura de repetição ENQUANTO, teríamos que nos preocupar em avaliar uma expressão lógica que garanta que o contador chegue ao número máximo de 10 vezes, ou seja, o contador deve ser sempre menor ou no máximo igual a 10.
Transformando comando PARA em comando ENQUANTO Além disso, é importante ressaltar que diferentemente da estrutura PARA, a estrutura de repetição ENQUANTO deve se preocupar em incrementar o seu contador, ou seja, a cada iteração devemos fazer com que o contador aumente o seu valor em um.
Transformando comando PARA em comando ENQUANTO Veja o algoritmo a seguir: Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... Linha 12... Linha 13... Linha 14... algoritmo "exemplo" variaveis inteiro cont, idade, soma inicio soma 0 cont 1 enquanto (cont <= 10) escreva("digite a idade") leia(idade) soma soma + idade cont cont + 1 fimenquanto escreva("soma das idades = ", soma) Fimalgoritmo
Transformando comando PARA em comando ENQUANTO Note que na linha 6 é necessário que inicializemos o contador cont com o valor 1 Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... Linha 12... Linha 13... Linha 14... algoritmo "exemplo" variaveis inteiro cont, idade, soma inicio soma 0 cont 1 enquanto (cont <= 10) escreval("digite a idade") leia(idade) soma soma + idade cont cont + 1 fimenquanto escreva("soma das idades = ", soma) Fimalgoritmo
Transformando comando PARA em comando ENQUANTO E na linha 11, a variável cont deve ser incrementada, ou seja, aumentada em 1. Linha 1... Linha 2... Linha 3... Linha 4... Linha 5... Linha 6... Linha 7... Linha 8... Linha 9... Linha 10... Linha 11... Linha 12... Linha 13... Linha 14... algoritmo "exemplo" variaveis inteiro cont, idade, soma inicio soma 0 cont 1 enquanto (cont <= 10) escreval("digite a idade") leia(idade) soma soma + idade cont cont + 1 fimenquanto escreva("soma das idades = ", soma) Fimalgoritmo
Transformando comando PARA em comando ENQUANTO Pensando na execução do algoritmo anterior, veremos que a cada iteração, a variável cont é testada na linha 7 e enquanto a mesma tiver um valor menor ou igual a 10 (valores 1, 2,3, 4, 5, 6, 7, 8, 9,10) o algoritmo irá executar as linhas 8, 9, 10 e 11. Assim que o contador (variável cont) atingir o valor 11 a expressão lógica cont <= 10 será considerada falsa e o algoritmo irá pular para a linha 13.
Transformando comando PARA em comando ENQUANTO Mas afinal, qual seria a vantagem de utilizarmos a estrutura ENQUANTO para esse tipo de situação, considerando que já possuímos a estrutura de repetição PARA? A vantagem está no fato da estrutura de repetição ENQUANTO nos permitir utilizar expressões lógicas compostas, ou seja, podemos trabalhar com contadores ao mesmo tempo em que avaliamos outras variáveis do nosso algoritmo.
Exemplo Suponhamos que necessitamos realizar um algoritmo semelhante ao do exemplo anterior; Porém agora além de limitarmos o número máximo de pessoas em 10, queremos também limitar a soma das idades dessas pessoas.
Exemplo Por exemplo, o algoritmo deve solicitar as idades das pessoas, enquanto o número de pessoas não chegar a 10, e também enquanto a soma de idade dessas pessoas não ultrapassar 100 anos. Caso uma dessas condições não seja obedecida a estrutura de repetição deverá ser abortada.
Exemplo Vejamos como ficaria esse algoritmo : algoritmo "exemplo" variaveis inteiro cont, idade, soma inicio soma 0 cont 1 enquanto (cont <= 10) e (soma < 100) faca escreva("digite a idade") leia(idade) soma soma + idade cont cont + 1 fimenquanto escreva("numero de pessoas", cont - 1) escreva("soma das idades = ", soma) Fimalgoritmo
Exercício Comentado Sabemos que um determinado elevador tem espaço para no máximo 7 pessoas e pode suportar transportar até 500 kg. Como você desenvolveria um algoritmo para permitir a entrada de pessoas nos elevadores considerando essas condições e utilizando a estrutura de repetição ENQUANTO?
Solução Possível algoritmo "exemplo" variavel inteiro cont, peso, pesototal inicio pesototal 0 cont 1 enquanto ((cont <= 7) e (pesototal <= 500)) escreva("peso do proximo a subir no elevador") leia(peso) pesototal pesototal + peso cont cont + 1 fimenquanto escreva("numero de pessoas que subiram", cont - 1) escreva("peso total do elevador = ", pesototal) Fimalgoritmo
Problema!!!!! A solução anterior apresenta um problema. Você consegue identificar qual seria esse problema? O problema existente é que mesmo depois de realizar a verificação do pesototal, é possível que a soma do pesototal com o próximo peso exceda 500 quilos. Isso acontece pois dentro da estrutura de repetição o pesototal é somado com o valor do peso que foi recentemente lido, e o resultado dessa soma somente é verificado para a realização da próxima iteração.
Teste de Mesa Por exemplo, considere a execução do algoritmo para os seguintes valores: cont Peso Pesototal Pesototal <= 500 1 100 100 VERDADEIRO 2 100 200 VERDADEIRO 3 120 320 VERDADEIRO 4 120 440 VERDADEIRO 5 120 560 FALSO
Problema!!!!! Ao chegar na 4a iteração, quando o contador cont está com o valor 4, o peso lido será de 120 quilos e o pesototal será de 440. Ao sair dessa iteração, o algoritmo irá avaliar se o pesototal é menor ou igual a 500, e o resultado será verdadeiro. Entrando novamente na estrutura de repetição e indo para a 5a iteração, o peso lido será de 120 quilos e o pesototal irá para 560 quilos, excedendo o limite do elevador.
Solução Alternativa Uma alternativa seria fazer a avaliação antecipada da soma do pesototal e do peso da próxima pessoa que iria entrar no elevador.
Solução Alternativa algoritmo "exemplo" variavel inteiro cont, peso, pesototal inicio pesototal 0 cont 1 escreva("peso do proximo a subir no elevador") leia(peso) enquanto ((cont <= 7) e (pesototal + peso <= 500)) pesototal pesototal + peso cont cont + 1 escreva("peso do proximo a subir no elevador") leia(peso) fimenquanto escreva("numero de pessoas que subiram", cont - 1) escreva("peso total do elevador = ", pesototal) Fimalgoritmo