Capítulo 6 Iteração Ciclo while

Propaganda
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
Download