540 likes | 825 Views
Estruturas de Repetição. Programação em Java Prof. Maurício Braga. Estruturas de repetição. Diferente do ser humano, o computador não se cansa de realizar operações repetitivas. Diante disto, podemos incluir nos algoritmos as estruturas de repetição. O que é uma repetição ?
E N D
Estruturas de Repetição Programação em Java Prof. Maurício Braga
Estruturas de repetição • Diferente do ser humano, o computador não se cansa de realizar operações repetitivas. • Diante disto, podemos incluir nos algoritmos as estruturas de repetição. • O que é uma repetição? • Também chamada a laço ou loop; • É uma instrução que permite a execução de um trecho de algoritmo várias vezes seguidas. • Nesta aula veremos: • Repetição com teste no início; • Repetição com teste no final; • Repetição com variável de controle.
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> faça <comando>;
Comando REPITA • O comando REPITA indica que todos os comandos entre a palavra repita e a palavra até encontram-se dentro de um laço e devem ser executados. • Após a palavra até deve haver uma expressão lógica que: • Se falsa, indica que o laço deve ser executado novamente; • Se verdadeira, indica que o laço acabou e o algoritmo deve continuar sendo executado. • Esta estrutura é chamada de repetição com teste no final • A decisão entre repetir e parar o laço é feita ao final do comando. • É garantido que o laço será executado aos menos uma vez.
Comando REPITA em Java • O mais próximo do REPITA em java é a instrução do...while • Teste realizado após a execução do corpo do loop. • O corpo do loop sempre executa ao menos uma vez. • Diferente do repita, o código continuará sendo executado enquanto a instrução for VERDADEIRA. do { instrução } while ( condição );
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 condição de parada
Comando ENQUANTO • O comando ENQUANTO indica que o comando seguinte será executado, desde que o resultado da expressão lógica seja verdadeiro. • Apesar do ENQUANTO permitir apenas a repetição 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 laço e avalia novamente a expressão lógica: • Se verdadeira, o computador fará uma nova execução do trecho; • Se falsa, o computador pára a execução e continua no próximo comando após o trecho repetido. • Esta estrutura é chamada de repetição com teste no início • A decisão entre repetir e parar o laço é feita no início do comando. • Se o teste for falso desde o início, o laço não será executado.
Comando Enquanto em Java • Implementado com a instrução while • instrução que efetua o teste antes da execução do corpo do loop. • O corpo do loop pode nunca ser executado. while ( condição ) { instrução }
Exemplo comando While int contador; // declara a variável de controle contador = 1; // inicializa a variável de controle while (contador <= 10) { // condição de parada do loop // incrementa a variável de controle por 1 System.out.println( “Contador = ” + contador); contador = contador +1; }
Comandos REPITA e ENQUANTO • Exercício: • Fazer um programa para ler diversos números informados pelo usuário usando o comando do while, e após cada leitura exibir se o número é par ou ímpar. Considere que ao fornecer um valor negativo o usuário deseja encerrar e entrada de dados.
Comandos REPITA e ENQUANTO • Solução • Quantos dados serão fornecidos? • Quantas variáveis serão necessárias? • Temos que identificar o trecho que será repetido e adicioná-lo dentro de um comando de repetição, declarando apenas as variáveis necessárias para uma repetição.
Comandos REPITA e ENQUANTO • Solução usando repita(cont.) • O algoritmo fica assim: Variáveis num : inteiro; Início repita escrever “Para sair, entre com um valor menor que 0”; escrever “Entre com o número: “; ler num; se num % 2 = 0 então escrever “O número é par” senão escrever “O número é ímpar”; até num < 0; Fim
Solução em Java usando do-while public static void main(String[] args) { // declaração de variáveis int num = 0; do { System.out.println( "Para sair, entre com um valor < 0"); System.out.println( "Digite um número:"); num = Leia(num); if (num % 2 == 0) System.out.println("O número é par"); else System.out.println("O número é impar"); } while (num > 0); // testa a condição de parada }
Comandos REPITA e ENQUANTO • Exercício: • Refazer o programa anterior, só que desta vez usando while.
Comandos REPITA e ENQUANTO • Solução usando enquanto (cont.) • O algoritmo fica assim: Variáveis inteiro: num =0; Início enquanto num >= 0 faça [[ escrever “Para sair, entre com um valor menor que 0”; escrever “Entre com o número: “; ler num; se num % 2 = 0 então escrever “O número é par” senão escrever “O número é ímpar”; ]]; Fim
Solução em Java usando while public static void main(String[] args) { // declaração de variáveis int num = 0; while (num >=0) { System.out.println( "Para sair, entre com um valor < 0"); System.out.println( "Digite um número:"); num = Leia(num); if (num % 2 == 0) System.out.println("O número é par"); else System.out.println("O número é impar"); } }
Esta mensagem não deveria ser exibida Comandos REPITA e ENQUANTO • Solução (cont.) • Executando o teste de mesa para os valores 8, 11, 21, 8 e -1, teríamos as seguintes mensagens: 8 O número é par 11 O número é ímpar 21 O número é ímpar 8 O número é par -1 O número é ímpar
Comandos REPITA e ENQUANTO • Solução (cont.) • Como podemos contornar este problema? • Adicionando mais uma condição ao comando SE • se num >=0 e num %2 = 0 • Solução pouco elegante, pois este teste é sempre verdadeiro, exceto no último caso • Utilizando o comando ENQUANTO ao invés do comando REPITA
Comandos REPITA e ENQUANTO • Solução (cont.) • Como podemos contornar este problema? • Retirando a leitura da variável de dentro do laço: • Será gerado um laço infinito, pois num será lida apenas uma vez, e se for >= 0, o laço nunca terminará. • Iniciar a variável para um valor padrão que sempre executará na 1ª vez: • Caímos no mesmo problema que no algoritmo utilizando o comando REPITA. • Colocar uma leitura antes do laço, e uma segunda leitura como últimos comandos dentro do laço.
Comandos REPITA e ENQUANTO • Solução (cont.) • O algoritmo fica assim: Variáveis num : inteiro; Início escrever “Para sair, entre com um valor menor que 0”; escrever “Entre com o número: “; ler num; enquanto num >= 0 faça [[ se num % 2 = 0 então escrever “O número é par” senão escrever “O número é ímpar”; escrever “Entre com o número: “; ler num; ]]; Fim
Variáveis contadoras • Uma variável é chamada de contadora quando armazena dentro de si um número referente a uma certa quantidade de elementos ou iterações. • Este tipo de variável é muito comum em estruturas de repetição, dada as suas diversas aplicações em problemas que envolvem contagens de valores. • Exemplo: • Imprimir todos os números inteiros de 1 a 100.
Variáveis contadoras • Solução • O algoritmo não tem dados de entrada, e fica assim: Variáveis valor : inteiro; Início escrever “Valores inteiros de 1 a 100”; valor = 1; repita escrever valor; valor = valor + 1; até valor > 100; Fim É possível resolver utilizando o ENQUANTO?
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); }
Variáveis contadoras • Solução • Utilizando o ENQUANTO o algoritmo fica assim: Variáveis valor : inteiro; Início escrever “Valores inteiros de 1 a 100”; valor = 1; enquanto valor <= 100 faça [[ escrever valor; valor = valor + 1; ]]; Fim
Variáveis contadoras • Exercício: • Escrever um programa que leia 10 números inteiros fornecidos pelo usuário, e exiba quantos números ímpares foram informados.
Variáveis contadoras • Solução • Serão necessárias 10 leituras. Podemos criar uma variável contadora para controlar este laço. • Precisaremos de uma outra variável para contar a quantidade de números ímpares. • Não podemos deixar para contar após a repetição, pois cada número fornecido apaga o anterior. Logo precisamos ir contando após cada entrada, incrementando uma nova variável contadora. • Esta nova variável contadora só é incrementada se o número informado for ímpar.
A variável é iniciada como 0 pois o usuário poderá informar 10 números pares Variáveis contadoras • Solução Variáveis cont, num, qtd_impar : inteiro; Início cont = 1; qtd_impar = 0 enquanto cont <= 10 faça [[ escrever “Digite um número: ”; ler num; se num % 2 <> 0 então qtd_impar = qtd_impar + 1; cont = cont + 1; ]]; escrever “O total de ímpares foi “ + qtd_impar; Fim
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 + "º número:"); numero = Leia(numero); if (numero % 2 != 0) qtd_impar = qtd_impar + 1; contador = contador +1; } System.out.println("O total de números ímpares digitado foi: " + qtd_impar); }
Variáveis acumuladoras • Uma variável é chamada de acumuladora quando tem por característica armazenar dentro de si o resultado acumulado de uma série de valores. • Quando armazenamos a soma de uma quantidade pequena de números, a atribuição é direta. Numa repetição devemos armazenar a soma de diversos números sucessivos, e para isto utilizamos uma variável acumuladora. • Exemplo • Calcular a soma de diversos números reais informados pelo usuário. A entrada de dados termina com o número -999.
A variável é iniciada como 0 pois, caso o usuário forneça -999 na primeira execução, o valor total da soma é 0. Variáveis acumuladoras • Solução • O algoritmo fica assim: Variáveis num, soma : real; Início soma = 0; escrever “Para sair, entre com -999”; escrever “Entre com o número: “; ler num; enquanto num <> -999 faça [[ soma = soma + num; escrever “Entre com o número: “; ler num; ]]; escrever “A soma foi ”, soma; Fim
Variáveis acumuladoras • Exercício • Fazer um programa que leia diversos números reais e exiba qual foi o maior de todos. O código -1 sinaliza o fim da leitura.
Variáveis acumuladoras Variáveis num, maior : real; Início escrever “Para sair, entre com -1”; escrever “Entre com o número: “; ler num; maior <- num; enquanto num <> -1 faça [[ se num > maior então maior <- num; escrever “Entre com o número: “; ler num; ]]; se maior <> -1 então escrever “O maior número digitado foi ”, maior senão escrever “Nenhum número válido foi informado.”; Fim • Solução
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 número:"); numero = Leia(numero); numero_maior = numero; while (numero != -1) { if (numero > numero_maior) numero_maior = numero; System.out.println("Digite um número:"); numero = Leia(numero); } if (numero_maior != -1) System.out.println("O maior número foi: " + numero_maior); else System.out.println("Nenhum número válido foi informado"); }
Laços infinitos • Ao trabalhar com repetições, é preciso tomar cuidado para não criar um laço infinito, ou seja, um laço que não termina. • Neste tipo de situação a máquina permaneceria executando o laço indefinidamente, até que ocorra uma intervenção externa. • Exemplo: • Imprimir os quadrados dos números inteiros de 1 a 10.
Este decremento provoca um loop infinito. Laços infinitos • Solução: Variáveis valor, quadrado : real; Início escrever “Quadrados dos números inteiros de 1 a 10”; escrever “Entre com o número: “; valor = 1; repita quadrado = sqr(valor); escrever quadrado; valor = valor - 1; até valor > 10; escrever “Fim da impressão.”; Fim
Repetições encadeadas • Da mesma forma que é permitido o encadeamento de testes, também é possível encadear comandos de repetição. • Um encadeamento de repetições ocorre quando há necessidade de efetuar um laço dentro de outro. • Neste tipo de situação, o algoritmo possui repetições controladas por um teste interno e outro externo. • Exemplo • Imprimir as tabuadas de multiplicação dos números 3, 4, 5 e 6.
Repetições encadeadas • Solução Variáveis num, mult, cont : inteiro; Início num <- 3; enquanto num <= 6 faça [[ escrever “Tabuada de ”, num; cont = 1; enquanto cont <= 10 faça [[ mult = num * cont; escrever num, “x”, cont, “=“, mult; cont = cont + 1; ]]; num = num + 1; ]]; Fim
Repetições encadeadas • Exercício • Escreva o algoritmo anterior em Java e observe o seu funcionamento. Em seguida, modifique o mesmo para mostrar a tabuada dos números 1 a 5.
Comando PARA • É muito comum a existência de repetições que fazem uso de variáveis contadoras, especialmente para contagens de 1 em 1. • Para facilitar a construção deste tipo de laço, pode-se utilizar um outro comando de repetição complementar chamada PARA. Sua sintaxe é: para <var> de <valor_inicial> até <valor_final> faça <comando>;
Comando PARA • Exemplo: • Escrever os números inteiros de 1 a 100. • Solução com o comando PARA: Variáveis valor : inteiro; Início escrever “Valores inteiros de 1 a 100”; para valor de 1 até 100 faça escrever valor; Fim
Comando Para em Java • Instrução de repetição for foi criada para repetição por contador • Especifica os detalhes da repetição controlador por contador em uma única linha for ( int contador = 1; contador <= 10; contador++ ) { System.out.printf( “%d ”, contador ); } Condição de parada Incremento após iteração Inicialização da variável
Instrução de repetição for • Formato geral for (inicialização; condiçãoDeParada; incremento) { instrução } • Inicialização • Nomeia a variável de controle e incializa seu valor. • Condição de parada • Condição que determina se o loop deve parar. • Incremento • Modifica o valor do contador para que a condição de parada torne-se falsa ao final.
Instrução de repetição for • Expressões da condição são opcionais • Se condição de parada for omitida, o compilador entende que a condição é sempre verdadeira. • Loop infinito. • Caso incremento seja calculado no corpo do loop, esta expressão pode ser omitida; • Caso contador seja inicializado antes de chegar a instrução, esta expressão pode ser omitida.
Instrução de repetição for • Calcule e exiba a soma de todos os números pares contidos entre zero e um número fornecido via teclado (caso o número fornecido seja par, o mesmo deverá fazer parte da soma).
Solução public static void main(String[] args) { double numero = 0, soma_pares =0; System.out.println("Digite um número > 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("Número inválido informado."); }
Comando PARA • Exercícios: • Faça um programa para exibir os números 1, 4, 9, 16, 25, 36, ... , 10000. • Faça um programa que leia 10 valores inteiros e positivos e depois informe: • Qual o maior valor; • Qual o menor valor; • A média dos números lidos.
Solução exercício 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; } }
Solução exercício 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 número:"); 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;
Solução exercício 2 else if (numero < numero_menor) numero_menor = numero; System.out.println("Digite um número:"); numero = Leia(numero); } if (numero_maior != -1) { System.out.println("O maior número digitado foi: " + numero_maior); System.out.println("O menor número digitado foi: " + numero_menor); System.out.println("A média dos números digitados é: " + soma/contador); } else System.out.println("Nenhum número válido foi informado");}
Estruturas de Repetição Programação em Java Prof. Maurício Braga