Você está na página 1de 50

Estruturas de Repetio

Programao em Java Prof. Maurcio Braga

Estruturas de repetio

Diferente do ser humano, o computador no se cansa de realizar operaes repetitivas. Diante disto, podemos incluir nos algoritmos as estruturas de repetio. O que uma repetio?

Tambm chamada a lao ou loop; uma instruo que permite a execuo de um trecho de algoritmo vrias vezes seguidas. Repetio com teste no incio; Repetio com teste no final; Repetio com varivel de controle.

Nesta aula veremos:


Comandos REPITA e ENQUANTO

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 <expr>; enquanto <expr> faa <comando>;

Comando REPITA

O comando REPITA indica que todos os comandos entre a palavra repita e a palavra at encontram-se dentro de um lao e devem ser executados. Aps a palavra at deve haver uma expresso lgica que:

Se falsa, indica que o lao deve ser executado novamente; Se verdadeira, indica que o lao acabou e o algoritmo deve continuar sendo executado.

Esta estrutura chamada de repetio com teste no final

A deciso entre repetir e parar o lao feita ao final do comando. garantido que o lao ser executado aos menos uma vez.

Comando REPITA em Java


O mais prximo do REPITA em java a instruo do...while Teste realizado aps a execuo do corpo do loop.

O corpo do loop sempre executa ao menos uma vez. Diferente do repita, o cdigo continuar sendo executado enquanto a instruo for VERDADEIRA.

do { instruo } while ( condio );

Exemplo comando do...while


int contador = 1; //declara e inicializa o contador
do { // Imprime e incrementa o contador System.out.println( Contador = +contador); contador = contador + 1;

} while (contador <= 10); // testa a condio de parada

Comando ENQUANTO

O comando ENQUANTO indica que o comando seguinte ser executado, desde que o resultado da expresso lgica seja verdadeiro. Apesar do ENQUANTO permitir apenas a repetio de um nico comando, nada que impede que seja utilizado um bloco de comandos. Ao encontrar o fim do comando (ou do bloco), o computador volta para a 1 linha do lao e avalia novamente a expresso lgica:

Se verdadeira, o computador far uma nova execuo do trecho; Se falsa, o computador pra a execuo e continua no prximo comando aps o trecho repetido.

Esta estrutura chamada de repetio com teste no incio

A deciso entre repetir e parar o lao feita no incio do comando. Se o teste for falso desde o incio, o lao no ser executado.
7

Comando Enquanto em Java


Implementado com a instruo while instruo que efetua o teste antes da execuo do corpo do loop.
O

corpo do loop pode nunca ser executado.

while ( condio ) { instruo }

Exemplo comando While


int contador; // declara a varivel de controle
contador = 1; // inicializa a varivel de controle

while (contador <= 10) { // condio de parada do loop


// incrementa a varivel de controle por 1 System.out.println( Contador = + contador); contador = contador +1; }

Comandos REPITA e ENQUANTO

Exerccio:

Fazer um programa para ler diversos nmeros informados pelo usurio usando o comando do while, e aps cada leitura exibir se o nmero par ou mpar. Considere que ao fornecer um valor negativo o usurio deseja encerrar e entrada de dados.

10

Comandos REPITA e ENQUANTO

Soluo

Quantos dados sero fornecidos? Quantas variveis sero necessrias? Temos que identificar o trecho que ser repetido e adicion-lo dentro de um comando de repetio, declarando apenas as variveis necessrias para uma repetio.

11

Comandos REPITA e ENQUANTO

Soluo usando repita(cont.)

O algoritmo fica assim:


Variveis num : inteiro;

Incio
repita escrever Para sair, entre com um valor menor que 0; escrever Entre com o nmero: ; ler num; se num % 2 = 0 ento escrever O nmero par seno escrever O nmero mpar; at num < 0; Fim
12

Soluo em Java usando do-while


public static void main(String[] args) { // declarao de variveis int num = 0; do { System.out.println( "Para sair, entre com um valor < 0"); System.out.println( "Digite um nmero:"); num = Leia(num); if (num % 2 == 0) System.out.println("O nmero par"); else System.out.println("O nmero impar"); } while (num > 0); // testa a condio de parada }
13

Comandos REPITA e ENQUANTO

Exerccio:

Refazer o programa anterior, s que desta vez usando while.

14

Comandos REPITA e ENQUANTO

Soluo usando enquanto (cont.)

O algoritmo fica assim:


Variveis
inteiro: num =0; Incio enquanto num >= 0 faa [[ escrever Para sair, entre com um valor menor que 0; escrever Entre com o nmero: ; ler num; se num % 2 = 0 ento escrever O nmero par seno escrever O nmero mpar; ]]; Fim
15

Soluo em Java usando while


public static void main(String[] args) { // declarao de variveis int num = 0; while (num >=0) { System.out.println( "Para sair, entre com um valor < 0"); System.out.println( "Digite um nmero:"); num = Leia(num); if (num % 2 == 0) System.out.println("O nmero par"); else System.out.println("O nmero impar"); } }
16

Comandos REPITA e ENQUANTO

Soluo (cont.)

Executando o teste de mesa para os valores 8, 11, 21, 8 e -1, teramos as seguintes mensagens:
8 O nmero par 11 O nmero mpar 21 O nmero mpar 8 O nmero par -1 O nmero mpar

Esta mensagem no deveria ser exibida

17

Comandos REPITA e ENQUANTO

Soluo (cont.)
Como

podemos contornar este problema?


se num >=0 e num %2 = 0 Soluo pouco elegante, pois este teste sempre verdadeiro, exceto no ltimo caso

Adicionando mais uma condio ao comando SE

Utilizando o comando ENQUANTO ao invs do comando REPITA

18

Comandos REPITA e ENQUANTO

Soluo (cont.)
Como

podemos contornar este problema?


Ser gerado um lao infinito, pois num ser lida apenas uma vez, e se for >= 0, o lao nunca terminar.

Retirando a leitura da varivel de dentro do lao:

Iniciar a varivel para um valor padro que sempre executar na 1 vez:

Camos no mesmo problema que no algoritmo utilizando o comando REPITA.

Colocar uma leitura antes do lao, e uma segunda leitura como ltimos comandos dentro do lao.

19

Comandos REPITA e ENQUANTO

Soluo (cont.)

O algoritmo fica assim:


Variveis num : inteiro; Incio escrever Para sair, entre com um valor menor que 0; escrever Entre com o nmero: ; ler num; enquanto num >= 0 faa [[ se num % 2 = 0 ento escrever O nmero par seno escrever O nmero mpar; escrever Entre com o nmero: ; ler num; ]]; Fim
20

Variveis contadoras

Uma varivel chamada de contadora quando armazena dentro de si um nmero referente a uma certa quantidade de elementos ou iteraes. Este tipo de varivel muito comum em estruturas de repetio, dada as suas diversas aplicaes em problemas que envolvem contagens de valores. Exemplo:

Imprimir todos os nmeros inteiros de 1 a 100.

21

Variveis contadoras

Soluo

O algoritmo no tem dados de entrada, e fica assim:


Variveis valor : inteiro; Incio

escrever Valores inteiros de 1 a 100; valor = 1; repita possvel resolver escrever valor; utilizando o ENQUANTO? valor = valor + 1; at valor > 100; Fim

22

Programa em Java
public static void main(String[] args) { int valor = 1; System.out.println( "Valores inteiros entre 1 e 100"); do { System.out.println( "valor = " + valor); valor = valor + 1; } while (valor <100);

23

Variveis contadoras

Soluo

Utilizando o ENQUANTO o algoritmo fica assim:


Variveis valor : inteiro; Incio escrever Valores inteiros de 1 a 100; valor = 1; enquanto valor <= 100 faa [[ escrever valor; valor = valor + 1; ]]; Fim

24

Variveis contadoras

Exerccio:

Escrever um programa que leia 10 nmeros inteiros fornecidos pelo usurio, e exiba quantos nmeros mpares foram informados.

25

Variveis contadoras
Soluo

Sero necessrias 10 leituras. Podemos criar uma varivel contadora para controlar este lao. Precisaremos de uma outra varivel para contar a quantidade de nmeros mpares.

No podemos deixar para contar aps a repetio, pois cada nmero fornecido apaga o anterior. Logo precisamos ir contando aps cada entrada, incrementando uma nova varivel contadora. Esta nova varivel contadora s incrementada se o nmero informado for mpar.

26

Variveis contadoras

Soluo
Variveis cont, num, qtd_impar : inteiro;

A varivel iniciada como 0 pois o usurio poder informar 10 nmeros pares

Incio
cont = 1; qtd_impar = 0 enquanto cont <= 10 faa [[ escrever Digite um nmero: ; ler num; se num % 2 <> 0 ento qtd_impar = qtd_impar + 1; cont = cont + 1; ]]; escrever O total de mpares foi + qtd_impar;

Fim
27

Programa em Java
public static void main(String[] args) { int contador=1, numero=0, qtd_impar = 0; while (contador <=10) { System.out.println( "Entre o " + contador + " nmero:"); numero = Leia(numero); if (numero % 2 != 0) qtd_impar = qtd_impar + 1; contador = contador +1; }

System.out.println("O total de nmeros mpares digitado foi: " + qtd_impar);


}
28

Variveis acumuladoras

Uma varivel chamada de acumuladora quando tem por caracterstica armazenar dentro de si o resultado acumulado de uma srie de valores. Quando armazenamos a soma de uma quantidade pequena de nmeros, a atribuio direta. Numa repetio devemos armazenar a soma de diversos nmeros sucessivos, e para isto utilizamos uma varivel acumuladora. Exemplo

Calcular a soma de diversos nmeros reais informados pelo usurio. A entrada de dados termina com o nmero -999.
29

Variveis acumuladoras

Soluo

O algoritmo fica assim:


Variveis num, soma : real;

A varivel iniciada como 0 pois, caso o usurio fornea -999 na primeira execuo, o valor total da soma 0.

Incio
soma = 0; escrever Para sair, entre com -999; escrever Entre com o nmero: ; ler num; enquanto num <> -999 faa [[ soma = soma + num; escrever Entre com o nmero: ; ler num; ]]; escrever A soma foi , soma;

Fim
30

Variveis acumuladoras

Exerccio

Fazer um programa que leia diversos nmeros reais e exiba qual foi o maior de todos. O cdigo -1 sinaliza o fim da leitura.

31

Variveis acumuladoras

Soluo

Variveis num, maior : real; Incio escrever Para sair, entre com -1; escrever Entre com o nmero: ; ler num; maior <- num; enquanto num <> -1 faa [[ se num > maior ento maior <- num; escrever Entre com o nmero: ; ler num; ]]; se maior <> -1 ento escrever O maior nmero digitado foi , maior seno escrever Nenhum nmero vlido foi informado.; Fim
32

Programa em Java
public static void main(String[] args) { double numero = 0, numero_maior =0; System.out.println("Para sair, digite -1."); System.out.println("Digite um nmero:"); numero = Leia(numero); numero_maior = numero; while (numero != -1) { if (numero > numero_maior) numero_maior = numero; System.out.println("Digite um nmero:"); numero = Leia(numero); } if (numero_maior != -1) System.out.println("O maior nmero foi: " + numero_maior); else System.out.println("Nenhum nmero vlido foi informado"); }
33

Laos infinitos

Ao trabalhar com repeties, preciso tomar cuidado para no criar um lao infinito, ou seja, um lao que no termina. Neste tipo de situao a mquina permaneceria executando o lao indefinidamente, at que ocorra uma interveno externa. Exemplo:

Imprimir os quadrados dos nmeros inteiros de 1 a 10.

34

Laos infinitos

Soluo:
Este decremento provoca um loop infinito.

Variveis

valor, quadrado : real;


Incio escrever Quadrados dos nmeros inteiros de 1 a 10; escrever Entre com o nmero: ; valor = 1; repita quadrado = sqr(valor); escrever quadrado; valor = valor - 1; at valor > 10; escrever Fim da impresso.; Fim
35

Repeties encadeadas

Da mesma forma que permitido o encadeamento de testes, tambm possvel encadear comandos de repetio. Um encadeamento de repeties ocorre quando h necessidade de efetuar um lao dentro de outro. Neste tipo de situao, o algoritmo possui repeties controladas por um teste interno e outro externo. Exemplo

Imprimir as tabuadas de multiplicao dos nmeros 3, 4, 5 e 6.

36

Repeties encadeadas

Soluo
Variveis num, mult, cont : inteiro; Incio num <- 3; enquanto num <= 6 faa [[ escrever Tabuada de , num; cont = 1; enquanto cont <= 10 faa [[ mult = num * cont; escrever num, x, cont, =, mult; cont = cont + 1; ]]; num = num + 1; ]]; Fim
37

Repeties encadeadas

Exerccio

Escreva o algoritmo anterior em Java e observe o seu funcionamento. Em seguida, modifique o mesmo para mostrar a tabuada dos nmeros 1 a 5.

38

Comando PARA

muito comum a existncia de repeties que fazem uso de variveis contadoras, especialmente para contagens de 1 em 1. Para facilitar a construo deste tipo de lao, pode-se utilizar um outro comando de repetio complementar chamada PARA. Sua sintaxe :
para <var> de <valor_inicial> at <valor_final> faa <comando>;

39

Comando PARA

Exemplo:

Escrever os nmeros inteiros de 1 a 100.

Soluo com o comando PARA:


Variveis valor : inteiro; Incio escrever Valores inteiros de 1 a 100; para valor de 1 at 100 faa escrever valor; Fim

40

Comando Para em Java

Instruo de repetio for foi criada para repetio por contador


Especifica

os detalhes da repetio controlador por contador em uma nica linha


for ( int contador = 1; contador <= 10; contador++ ) { System.out.printf( %d , contador ); }

Inicializao da varivel

Condio de parada

Incremento aps iterao

41

Instruo de repetio for

Formato geral
for (inicializao; condioDeParada; incremento) { instruo }

Inicializao

Nomeia a varivel de controle e incializa seu valor. Condio que determina se o loop deve parar.

Condio de parada

Incremento

Modifica o valor do contador para que a condio de parada tornese falsa ao final.

42

Instruo de repetio for

Expresses da condio so opcionais


Se

condio de parada for omitida, o compilador entende que a condio sempre verdadeira.
Loop infinito.

Caso

incremento seja calculado no corpo do loop, esta expresso pode ser omitida; Caso contador seja inicializado antes de chegar a instruo, esta expresso pode ser omitida.

43

Instruo de repetio for

Calcule e exiba a soma de todos os nmeros pares contidos entre zero e um nmero fornecido via teclado (caso o nmero fornecido seja par, o mesmo dever fazer parte da soma).

44

Soluo
public static void main(String[] args) { double numero = 0, soma_pares =0; System.out.println("Digite um nmero > 0:"); numero = Leia(numero); if (numero >0) { for (int i=1;i<=numero; i++) { if (i % 2 == 0) soma_pares = soma_pares + i; } System.out.println("A soma dos pares : "+soma_pares); } else System.out.println("Nmero invlido informado."); }

45

Comando PARA

Exerccios:

Faa um programa para exibir os nmeros 1, 4, 9, 16, 25, 36, ... , 10000. Faa um programa que leia 10 valores inteiros e positivos e depois informe:

Qual o maior valor; Qual o menor valor; A mdia dos nmeros lidos.

46

Soluo exerccio 1
public static void main(String[] args) { int numero = 1, contador =3; System.out.println(numero); while (numero < 10000) { System.out.println((numero + contador)); numero = numero + contador; contador = contador + 2; } }

47

Soluo exerccio 2
public static void main(String[] args) { double numero = 0, numero_maior =0, numero_menor=0,soma =0, contador =0; System.out.println("Para sair, digite -1."); System.out.println("Digite um nmero:"); numero = Leia(numero); numero_maior = numero; numero_menor = numero; while (numero != -1) { contador = contador + 1; soma = soma + numero; if (numero > numero_maior) numero_maior = numero;
48

Soluo exerccio 2
else if (numero < numero_menor) numero_menor = numero; System.out.println("Digite um nmero:"); numero = Leia(numero); } if (numero_maior != -1) { System.out.println("O maior nmero digitado foi: " + numero_maior); System.out.println("O menor nmero digitado foi: " + numero_menor); System.out.println("A mdia dos nmeros digitados : " + soma/contador); } else System.out.println("Nenhum nmero vlido foi informado");}

49

Estruturas de Repetio

Programao em Java Prof. Maurcio Braga

Você também pode gostar