Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado...
Transcript of Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado...
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
nome ← ""
Início
nome != "fim"?
Fim
Escreva "digite o nome: "
Verdadeiro
Falso
Leia nome
Escreva " ("o nome digitado foi " + nome "
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