Você está na página 1de 17

AULA TERICA 7

Tema 4. Estruturas de controlo (continuao).


Repetio. O ciclo while. O ciclo do-while. O ciclo for.
Ciclos for encadeados.
Repetio. O ciclo while.
O ciclo do-while.
O ciclo for.
Ciclos for encadeados.

Repetio
A maioria dos programas que tm interesse prtico incluem estruturas
repetitivas. Exemplo: agenda de telefones.
A situao poderia ser ainda mais complicada se o nmero de
pessoas no fosse conhecido partida.
Uma forma eficaz de resolver este problema a utilizao de uma
estrutura que se encarregue de fazer repetir as instrues que
permitem ler os dados de uma pessoa tantas vezes quantas as
pessoas envolvidas.
Estas estruturas so denominadas por estruturas repetitivas ou
ciclos.
Quando no sabemos quantas vezes deve se fazer a repetio
utilizam-se os ciclos while e do...while.
O critrio de execuo ou paragem destes ciclos depende de uma
condio, que ser testada antes ou depois de cada execuo de
ciclo.
2

Ciclo while
O ciclo while faz o teste primeiro e executa as instrues
depois, caso a condio for verdadeira.
Se o resultado for verdadeiro, as instrues (I) so executadas, seguindo-se um novo clculo
da condio. Quando a condio tiver resultado
falso, o ciclo terminar, prosseguindo a execuo
do programa na instruo seguinte ao ciclo.

+
I

Sintaxe da instruo while:


inicializao; //da varivel de controle de repeties
while (condio)
{ instrues;//executadas apenas enquanto condio for true
aco;
//increm. ou decrem. da varivel de controle
}

Exemplo: Calcular a mdia de N nmeros inteiros fornecidos pelo


utilizador.
import java.io.*;
public class MediaN_Numeros1
{ public static void main(String args[])throws IOException
{ //Declarao de variveis
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
float media, soma = 0;
int quant, num;
int contador = 0;
//inicializao da varivel de controle
System.out.println("Quantos so numeros? (>0)");
quant = Integer.parseInt(br.readLine());
while (contador < quant)
{ System.out.println("Intr. o proximo numero inteiro: ");
num = Integer.parseInt(br.readLine());
soma += num;
contador ++;
//aco, i.e. incrementao da varivel de controle
}
media = soma/quant;
System.out.println("A media dos "+quant+" numeros = "+
media);
}}
4

M Note-se que, devido ao facto de a condio boleana ser


testada antes, o conjunto de instrues pode nunca vir a ser
executado. Isto acontece se o resultado da condio for false
logo no incio.
Mao programar um ciclo necessrio criar as condies para
que o mesmo possa terminar.

Ciclo do...while
Ao contrrio do ciclo while, o ciclo do...while primeiro
executa as instrues e depois faz o teste. Caso a condio
for verdadeira o ciclo repete-se.
Sintaxe da instruo do...while:
inicializao;
I
do
{ intrues;
+
?
aco;
}
while (condio);

M Notar que, devido ao facto de a condio apenas ser testada no


fim, o conjunto de instrues executado pelo menos uma vez.
O Exemplo anterior modificamos usando ciclo do-while:
import java.io.*;
public class MediaN_Numeros2
{ public static void main(String args[])throws IOException
{ //Declarao de variveis
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
float soma = 0;
int quant,num,contador=0;
System.out.println("Quantos numeros pretende(>0)?");
quant = Integer.parseInt(br.readLine());
do
{ System.out.println("Intr. proximo numero inteiro: ");
num = Integer.parseInt(br.readLine());
soma += num;
contador++;
//aco, i.e. incrementao da varivel de controle
} while(contador < quant);
System.out.println("media de "+quant+" numeros= "+
soma/quant);
}
6
}

Uma das utilizaes mais comuns deste tipo de repetio a


validao de dados fornecidos pelo utilizador.
Exemplo: Pretende se introduzir numero de horas trabalhadas,
sabendo que os valores podem variar de 0 a 12. No caso
contrrio deve aparecer um aviso de erro e pedido de repetir a
entrada do valor.
import java.io.*;
public class ValidarHorasTrab
{ public static void main (String args [])throws IOException
{ BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
byte h;
do
{ System.out.print("Qde de horas trabalhadas (0-12)? ");
h = Byte.parseByte(br.readLine());
if (h < 0 || h > 12)
System.out.println("Valor invalido!Tente de novo!");
} while (h < 0 || h > 12);
System.out.println("Horas trabalhadas: "+ h);
}
7
}

J podemos elaborar um menu que permite escolher uma ou mais opes ou


terminar o programa.
import java.io.*;
public class MenuSimples
{ public static void main(String args[]) throws IOException
{ BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
byte op;
do
// repete at escolher opo 3 (sair)
{ System.out.print("Qual a tua opo?\n");
System.out.print("1- Mensagem de boas vindas\n");
System.out.print("2 Ler valor\n");
System.out.print("3 Sair\n ");
op = Byte.parseByte(br.readLine());
switch (op)
{ case 1: System.out.println ("Ola! Bem vindo!\n");
break;
case 2: System.out.println("Intr.valor inteiro:");
int n = Integer.parseInt(br.readLine());
System.out.println("introduziu "+n);break;
default: System.out.println("Opao invalida!");break;

}
} while (op != 3);

Ciclo for
O ciclo for uma estrutura de repetio compacta. Seus
elementos de inicializao, condio e aco so reunidos em
forma de um cabealho. Quando se pretende que um conjunto
de instrues se repita um nmero de vezes bem especfico,
utiliza-se o ciclo for, cuja sintaxe seguinte:
for (inicializao; condio; aco)
{
instrues;
}
inicializao executada apenas uma vez logo no incio do
ciclo. Serve normalmente para inicializar a varivel que vai
controlar o nmero de vezes que as instrues vo ser
repetidas;
condio calculada antes de cada execuo das instrues.
Se o seu resultado for verdadeiro, as instrues so
9
executadas, se for falso, o ciclo termina;

aco executada automaticamente em cada iterao aps as


instrues do ciclo. Normalmente serve para calcular o novo
valor da varivel de controle (geralmente a aco uma
incrementao ou decrementao da varivel de controle). Princrementar e ps incrementar tem o mesmo efeito na
expresso de incremento.
Exemplos com a estrutura for:
1). a varivel de controle varia de 1 a 100 em incrementos de 1:
for (byte i = 1; i <= 100; i++)
{ .... }
2). a varivel de controle varia de 20 a 2 em incrementos de 2 (ou
decrementos de 2):
for (byte k = 20; k >= 2; k -= 2) { ...... }
3). permite somar todos os inteiros pares de 2 a 5600:
for (int num = 2; num <= 5600; num+=2)
sum += num;
As duas ltimas instrues podem ser escritas na forma mais compacta:
for (int num = 2; num <= 5600; sum += num, num+=2)
10
;

Esta ltima verso exemplifica uma situao em que a


componente aco contm mais do que uma instruo,
separados por vrgulas. Neste exemplo, com a incluso da
instruo a repetir na componente aco, o conjunto de
instrues a repetir fica vazio, pelo que a seguir ao for
aparece um ; (instruo vazia). Mas aconselhvel evitar
esta forma pois torna o programa mais difcil de ler.
Apesar de ser usual declarar as variveis no incio, estas
podem de facto ser colocadas em qualquer ponto do
programa.
Exemplo: Escreve o programa que visualiza no ecr todos os
nmeros inteiros entre 1 e um nmero positivo fornecido pelo
utilizador. Algoritmo:
Pedir o nmero ao utilizador
Ler o nmero para a varivel num
Para todos os valores de k entre 1 e num
escreve k
Fim_Para

11

Em Java:
import java.io.*;
public class VisualizarInteiros
{ public static void main (String args [])throws IOException
{ int num, k;
BufferedReader z =
new BufferedReader(new InputStreamReader(System.in));
System.out.prntln("O programa visualizara numeros
de 1 ate um valor escolhido por si! ");
//validao do numero introduzido
do
{ System.out.println("Intr. at que nmero pretende
ter a lista: ");
num = Integer.parseInt(z.readLine());
if (num <= 1)
System.out.println("Numero deve ser maior que 1!
Tente de novo");
} while (num <= 1);
System.out.println("Numeros entre 1 e "+num+" : ");
for (k = 1; k <= num; k++)
System.out.print(k+" ");
}
}
12

Na maioria dos casos, a estrutura for pode ser representada por uma
estrutura while equivalente:
inicializao;
while (condio)
{ instrues;
aco;
}

Ciclos for um dentro de outro


Por exemplo, para aceder aos elementos duma matriz bidimensional
deve se utilizar dois ciclos for, um dentro do outro. O primeiro serve
para fazer variar linhas e o segundo para fazer variar colunas. Mais
tarde vamos aprender esta tcnica.
Um outro exemplo pode ser seguinte: visualizar no ecr uma tabela de
multiplicao organizada em linhas e colunas:
13

public class ForForTabMult


{ public static void main (String args [])
{ final int SIZE = 12;
int z;
for ( int x=1; x<=SIZE; x++)
{ for ( int y=1; y<=SIZE; y++)
{ z = x*y;
if (z<10) System.out.print(" ");
if (z<100) System.out.print(" ");
System.out.print(" "+ z);
}
System.out.println();
}
}
}
14

O output ser:
1
2
3
4
5
6
7
8
9 10 11 12
2
4
6
8 10 12 14 16 18 20 22 24
3
6
9 12 15 18 21 24 27 30 33 36
. . . . . . . . . . . . . . . . . . . . . . .
12 24 36 48 60 72 84 96 108 120 132 144

Como escolher entre as instrues de repetio


Os trs tipos de controlo de repetio devem ser usados visando s
seguintes caractersticas:
for Utiliza-se no caso de saber o nmero de repeties antecipadamente.
do-while Controla a condio de repetio aps a sua execuo. O
ciclo executado pelo menos uma vez. Assim, s faz sentido utiliz-lo em
situaes em que este comportamento seja desejvel (validao de dados
fornecidos pelo utilizador, pois estes tm que ser lidos antes de ser possvel
valid-los).
while Controla a condio de repetio antes da sua execuo. O ciclo
pode nunca ser executado. O ciclo for pode tambm ser utilizado nestas
situaes, mas a utilizao do ciclo while tende a produzir cdigo mais
claro e mais legvel.
15

Referncia bibliogrfica:
Antnio Jos Mendes; Maria Jos Marcelino.
Fundamentos de programao em Java 2. FCA. 2002.
Carrio, Jos; Carrio, Antnio.
"Computadores, Tecnologias e sistemas de Informao- O Ncleo de Sistema.
Centro de Tecnologias de Informao Ltd. Lisboa. 1997
Carrio, Jos; Carrio, Antnio.
"Computadores, Tecnologias e sistemas de Informao- Perifricos, Internet e multimdia.
Centro de Tecnologias de Informao Ltd. Lisboa. 1997.
Carrio, Jos; Carrio, Antnio.
"Computadores, Tecnologias e sistemas de Informao- Tecnologias de Software.
Centro de Tecnologias de Informao Ltd. Lisboa.1997.
Elliot Koffman; Ursula Wolz.
Problem Solving with Java. 1999.
John R. Hubbard.
Theory and problems of programming with Java. Schaums Outline series. McGraw-Hill.
H. Deitel; P. Deitel.
Java, como programar. 4 edio. 2003. Bookman.
Rui Rossi dos Santos.
Programando em Java 2 Teoria e aplicaes. Axcel Books. 2004
16

TPC
Escrever um programa em Java para resoluo do seguinte
problema:
Visualizar tabuada de 1 a 10 de um valor introduzido pelo
utilizador. Elabora trs variantes utilizando os diferentes ciclos
aprendidos.

17

Você também pode gostar