Capítulo 6 Iteração Ciclos utilizando as instruções while, for, e do Ciclos infinitos. Erros frequentes. Ciclos encadeados Instruções break e continue em ciclos Ciclo while • Inúmeras operações de computadores envolvem o processamento de tarefas repetitivas, como por exemplo, acrescentar números a uma lista ou ler caracteres do teclado • O ciclo while permite executar um bloco de código, repetidamente. Por norma, é um bloco de instruções, ou seja, instruções delimitadas por { } • Existe uma condição que controla quantas vezes o ciclo é executado while (condição) instrução Introdução à Programação 2007/08 A. Lopes Exemplo crescimento de um investimento • Investimento de 10 000 Euros a uma taxa anual de 5%. Quantos anos são necessários para alcançar um determinado valor? Ano Saldo 0 10 000 ! 1 10 500 ! 2 11 025 ! 3 11 576,25 ! 4 12 155,06 ! 5 12 762,82 ! ... while (balance < targetBalance) { years++; double interest = balance * rate / 100; balance = balance + interest; } Introdução à Programação 2007/08 A. Lopes Instrução while while (condição) instrução Exemplo: while (balance < targetBalance) { years++; double interest = balance * rate / 100; balance = balance + interest; } Objectivo: Executar repetidamente uma instrução enquanto uma condição for verdadeira Introdução à Programação 2007/08 A. Lopes Ficheiro Investment.java Introdução à Programação 2007/08 A. Lopes Ficheiro InvestmentTester.java Introdução à Programação 2007/08 A. Lopes Erros comuns ciclos infinitos • Quando os ciclos não terminam, é necessário terminar abruptamente o programa int years = 20; while (years > 0) { years++; double interest = balance*rate / 100; balance = balance + interest; } X X int years = 0; while (years < 20) { double interest = balance*rate / 100; balance = balance + interest; } Introdução à Programação 2007/08 A. Lopes Erros comuns “engano por um” • Uma variável deve começar com um valor n ou n+1? Ou ainda, por exemplo, o teste deve ser < ou <= ? • De modo a evitar este tipo de erros, é conveniente testar com valores simples int years = 0; // ou 1 ? int balance = initialBalance; while (balance < 2 * initialBalance) // ou <= ? { years++; double interest = balance * rate / 100; balance = balance + interest; } System.out.println("O investimento atingiu o objectivo apos " + years + " anos."); Introdução à Programação 2007/08 A. Lopes Ciclos do • Executa o corpo do ciclo pelo menos uma vez do instrução while (condição) • Exemplo: validação de valores de entrada double value; do { System.out.print("Indique um numero positivo: "); value = in.nextDouble(); } while (value <= 0); Introdução à Programação 2007/08 A. Lopes Ciclos for • O ciclo for é utilizado sobretudo quando se sabe à priori quantas vezes se deve executar o ciclo for (inicialização; condição; actualização) instrução variáveis locais no ciclo !! • Exemplos for (int i = 1; i <= n; i++) { double interest = balance * rate / 100; balance = balance + interest; } interest e i não são válidos fora do ciclo for (x = -10; x <= 10; x = x + 0.5) ... for (years = n; years > 0; years--) ... Introdução à Programação 2007/08 A. Lopes Conversão entre ciclos • É possível re-escrever determinado ciclo noutro equivalente. Exemplos: double value; do { System.out.print("Indique um numero positivo: "); value = in.nextDouble(); } while (value <= 0); boolean done = false; while (!done) { System.out.print("Indique um numero positivo: "); value = in.nextDouble(); if (value > 0) done = true; } Introdução à Programação inicialização; while (condição) { instrução; actualização; } for (inicialização; condição; actualização) instrução 2007/08 A. Lopes Instrução for for (inicialização; condição; actualização) instrução Exemplo: for (int i = 1; i <= n; i++) { balance += balance * rate / 100; } Objectivo: Executa uma inicialização e de seguida executa, sucessivamente, uma instrução e actualiza uma expressão, enquanto a condição for verdadeira Introdução à Programação 2007/08 A. Lopes Erros comuns ; • ; a mais sum = 0; for (i = 1; i <= 10; i++); sum = sum + i; System.out.println(sum); // ??? • ; em falta estilo de programação pouco aconselhável for (years = 1; (balance = balance+balance*rate/100) < targetBalance; years++) // ??? System.out.println(years); Introdução à Programação 2007/08 A. Lopes Ciclos encadeados [] [ ][ ] [ ][ ][ ] [ ][ ][ ][ ] • Exercício: criar um padrão • Ciclo para as linhas (o i indica o número de pares de parêntesis a escrever em cada linha) for (int i = 1; i <= n; i++) { // faz linha i do triangulo } • Outro ciclo para uma linha do triângulo for (int j = 1; j <= i; j++) r = r + "[]"; r = r + "\n"; Introdução à Programação 2007/08 for (int i = 1; i <= n; i++) { // faz linha i do triangulo for (int j = 1; j <= i; j++) r = r + "[]"; r = r + "\n"; } Atenção: em geral, convém não usar demasiados ciclos encadeados A. Lopes Ficheiro Triangle.java Introdução à Programação 2007/08 A. Lopes Ficheiro TriangleTester.java Introdução à Programação 2007/08 A. Lopes Teste no meio de um ciclo • Por vezes, a condição de teste de um ciclo só pode ser avaliada no meio do ciclo. Nesse caso, deve-se introduzir uma variável lógica para controlar o ciclo boolean done = false; while (!done) { Print prompt String input = read input; if (“foi indicado fim de entrada”) done = true; else { “Processa a entrada” } } Introdução à Programação 2007/08 A. Lopes Processamento de valores sentinela • Valor sentinela visa indicar o fim de um conjunto de dados • ex: letra F (não utilizar 0 ou -1) System.out.print("Qual o valor (F para fim)? "); String input = in.next(); if (input.equalsIgnoreCase("F")) “Vai terminar o ciclo” else { double x = Double.parseDouble(input); ... } Introdução à Programação 2007/08 A. Lopes Ficheiro DataSet.java Introdução à Programação 2007/08 A. Lopes Ficheiro InputTester.java Introdução à Programação 2007/08 A. Lopes Instruções break e continue em ciclos • Permitem um maior controlo sobre a forma como os ciclos são executados • break permite terminar a execução de um ciclo a qualquer momento • continue permite ignorar o resto do corpo do ciclo e ir directamente para a próxima iteração do ciclo ... não é de enaltecer a utilização destas duas instruções while ( true ) { // !!! input_number = input.nextInt(); if (input_number == 0) break; if (input_number < 0) { System.out.println(“POSITIVO !!!”); continue; } System.out.println(“Numero indicado: “ + input_number); } Introdução à Programação while ( 0 < 1 ) // !!! { input_word = input.next(); if (input_word.equals(“fim”)) break; System.out.println( “Numero indicado “ + input_word); } 2007/08 A. Lopes Exemplo de projecto Máquina de venda • Requisitos do projecto, do ponto de vista do cliente • dois tipos de produto: água e fanta • funciona com moedas de 1!, 50, 20 e 10 cêntimos • ... Introdução à Programação 2007/08 A. Lopes