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

Preview:

Citation preview

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

Recommended