Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado...

35
Estruturas de Repetição Comando Enquanto-FimEnquanto Algoritmos e Técnicas de Programação Prof. Kleber Rezende

Transcript of Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado...

Page 1: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

Estruturas de Repetição Comando Enquanto-FimEnquanto

Algoritmos e Técnicas de

Programação

Prof. Kleber Rezende

Page 2: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 3: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 4: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 5: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 6: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 7: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 8: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 9: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 10: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 11: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 12: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 13: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 14: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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);

}

}

Page 15: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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 "

Page 16: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 17: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 18: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 19: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 20: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 21: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 22: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 23: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 24: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 25: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 26: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 27: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 28: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 29: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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?

Page 30: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 31: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 32: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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

Page 33: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 34: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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.

Page 35: Estruturas de Repetição fileoferecendo ao usuário 3 opções de menu sendo ... Caso o resultado da mesma seja ... e então os comandos das linhas 7, 8 e 9 serão executados . Linha

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