Você está na página 1de 49

Desenvolvimento OO com Java

3 Estruturas de
Controle e Programao
Bsica
Vtor E. Silva Souza
(vitorsouza@inf.ufes.br)
http://www.inf.ufes.br/
~

vitorsouza

Departamento de Informtica
Centro Tecnolgico
Universidade Federal do Esprito Santo
Este obra foi licenciada sob uma Licena Creative Commons Atribuio 3.0 No Adaptada.
Cb[euvos da parLe 3
- ApresenLar as esLruLuras de conLrole de uxo,
- Lnslnar comandos de enLrada e salda de dados bslcos
(Leclado / Lela),
- uesLa forma:
- CapaclLar os alunos a escrever programas slmples,
uullzando os recursos da programao lmperauva,
- Conclulr a parLe bslca (procedural) para parur para
concelLos novos (orlenLao a ob[eLos).
Malo 2013 C aradlgma CrlenLado a Cb[eLos 2
ConLrole de uxo
- um programa de compuLador (algorlLmo) e como uma
recelLa: uma sequncla de lnsLrues:
- Lela um valor x,
- Calcule ? como funo de x: ? = x * 2,
- lmprlma o resulLado.
- CaracLerlsuco da programao lmperauva,
- CuLros paradlgmas so dlferenLes:
- Lx.: em Ls funclonals, um programa e um con[unLo
de funes maLemucas.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 3
ConLrole de uxo
- SomenLe programas mulLo slmples so esLrlLamenLe
sequenclals:
- Lela Lrs noLas de um aluno: n1, n2 e n3,
- Calcule a medla do aluno pela funo M = (n1 + n2 +
n3) / 3,
- Se a medla M for malor ou lgual a 7:
- lmprlma Aluno aprovado",
- Se a medla no for malor ou lgual a 7:
- Calcule a noLa que o aluno preclsa para passar pela
funo l = (2 * l) - M,
- lmprlma Aluno em prova nal, noLa mlnlma: <l>".
Malo 2013 C aradlgma CrlenLado a Cb[eLos 4
ConLrole de uxo
- Ls lmperauvas geralmenLe possuem as segulnLes
esLruLuras de conLrole de uxo:
- LsLruLuras de desvlo de uxo: desvla o uxo e quebra
a esLruLura sequenclal. ode ser condlclonal ou
lncondlclonal. Lm !ava Lemos if e switch,
- LsLruLuras de repeuo slmples: repeLe um ou mals
comandos em laos ou !""#$ um numero xo de
vezes. Lm !ava, Lemos a dlreuva for,
- LsLruLuras de repeuo condlclonal: semelhanLe a
repeuo slmples, mas um numero lndenldo de
vezes, assoclada a uma condlo. Lm !ava Lemos
while e do while.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 3
CuLros mecanlsmos
- Mecanlsmos de modularlzao:
- ulvlso de um programa em funes e
procedlmenLos (ou meLodos),
- C uxo e desvlado de uma funo para ouLra.
- 1raLamenLo de excees:
- Cuando um erro ocorre, desvla o uxo para o cdlgo
de LraLamenLo do erro (exceo),
- Ambos sero dlscuudos em malor profundldade
posLerlormenLe.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 6
ConcelLos bslcos: dlreuvas
- ulreuvas ($%&%'(')%$) so as lnsLrues que uma L
fornece para a consLruo de programas,
- ueve haver alguma forma de separar uma dlreuva da
ouLra:
- Cada uma em uma llnha,
- Separadas por um caracLere (ex.: .", ;", eLc.).
- !ava herdou de C a separao com ;":
Malo 2013 C aradlgma CrlenLado a Cb[eLos 7
diretiva1;
diretiva2; diretiva3;
diretiva4;
...
ConcelLos bslcos: blocos
- ulreuvas podem ser dlsposLas em blocos,
- um bloco recebe o mesmo LraLamenLo de uma dlreuva
lndlvldual,
- !ava Lambem herdou de C a denlo de blocos com
{ e }":
Malo 2013 C aradlgma CrlenLado a Cb[eLos 8
{
diretiva1;
diretiva2; diretiva3;
diretiva4;
...
}
...
LsLruLuras de desvlo de uxo
- uesvlam o cdlgo para um ouLro Lrecho, ao lnves de
prossegulr para a llnha segulnLe,
- P dols upos de desvlo de uxo:
- uesvlo condlclonal (if, switch),
- uesvlo lncondlclonal (goto).
- !ava no possul goto. ossul dols casos especlcos de
desvlo lncondlclonal com break e continue.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 9
uesvlo condlclonal com if
- [expresso]: expresso lglca avallada (deve reLornar
valor do upo boolean),
- [dlreuva 1]: dlreuva ou bloco de dlreuvas execuLadas
se a condlo reLornar true,
- [dlreuva 2]: dlreuva ou bloco de dlreuvas execuLadas
se a condlo reLornar false.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 10
if ([expresso])
[diretiva 1]
else
[diretiva 2]
lunclonamenLo do lf
Malo 2013 C aradlgma CrlenLado a Cb[eLos 11
A parLe do else e opclonal
Malo 2013 C aradlgma CrlenLado a Cb[eLos 12
if ([expresso])
[diretiva]
LncadeamenLo de lfs
- C if e uma dlreuva como qualquer ouLra,
- odemos coloc-lo como [dlreuva 2], logo aps o else
(execuLada quando expresso e false):
Malo 2013 C aradlgma CrlenLado a Cb[eLos 13
if ([expresso])
[diretiva 1]
else if ([expresso 2])
[diretiva 2]
else if ([expresso 3])
[diretiva 3]
...
else
[diretiva N]

Lxemplos
Malo 2013 C aradlgma CrlenLado a Cb[eLos 14
int x = 10, y = 15, z = 20;
boolean imprimir = true;

if ((x == 10) || (z > y)) {
if (imprimir) System.out.println(x);
}
else if (x == 20) {
z += x + y;
if (imprimir) System.out.println(z);
}
else System.out.println("No sei!");
uesvlo condlclonal com swlLch
Malo 2013 C aradlgma CrlenLado a Cb[eLos 13
switch ([expresso ordinal ou string]) {
case [valor ordinal 1]:
[diretiva 1]
break;
case [valor ordinal 2]:
[diretiva 2]
break;
...
default:
[diretiva N]
}
uesvlo condlclonal com swlLch
- [expresso ordlnal ou sLrlng]: expresso que reLorna um
valor de algum upo dlscreLo (int, char, eLc.) ou $%*+),
(a parur do !ava 7),
- [valor ordlnal x]: um dos posslvels valores que a
expresso ordlnal pode assumlr (deve ser do mesmo
upo),
- [dlreuva x]: dlreuva ou con[unLo de dlreuvas (no e
necessrlo abrlr um bloco) execuLado se a expresso
ordlnal for lgual ao [valor ordlnal x].
Malo 2013 C aradlgma CrlenLado a Cb[eLos 16
lunclonamenLo do swlLch
Malo 2013 C aradlgma CrlenLado a Cb[eLos 17
CaracLerlsucas
- L posslvel consLrulr um if equlvalenLe ao switch, mas
esLe Lem desempenho melhor,
- 1er uma opo default e opclonal,
- C uxo e desvlado para o -&$' aproprlado e conunua
dall aLe enconLrar um break ou o m do swlLch.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 18
Lxemplo
Malo 2013 C aradlgma CrlenLado a Cb[eLos 19
switch (letra) { // letra do tipo char
case 'a':
case 'A': System.out.println("Vogal A");
break;
case 'e': case 'E':
System.out.println("Vogal E");
break;

/* ... */

case 'u': case 'U':
System.out.println("Vogal U");
break;
default:
System.out.println("No uma vogal");
}
LsLruLuras de repeuo slmples
- 8epeuo de um Lrecho de cdlgo,
- numero xo de repeues (sabe-se de anLemo
quanLas vezes o Lrecho ser repeudo),
- !ava dlspe da dlreuva for (slnLaxe Lambem herdada de
C):
Malo 2013 C aradlgma CrlenLado a Cb[eLos 20
// Contar de 1 a 10:
for (int i = 1; i <= 10; i++)
System.out.println(i);
LsLruLura do for
- [lnlclo]: dlreuva execuLada anLes do lao comear
(geralmenLe, aLrlbulr o valor lnlclal do conLador),
- [condlo]: expresso de condlo de parada do lao
(geralmenLe, comparao com o valor nal),
- [lnc/dec]: dlreuva execuLada aps cada lLerao do
lao (geralmenLe usada para lncremenLar ou
decremenLar o conLador),
- [dlreuva]: dlreuva ou bloco de dlreuvas execuLadas
em cada lLerao do lao.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 21
for ([incio]; [condio]; [inc/dec])
[diretiva]
lunclonamenLo do for
Malo 2013 C aradlgma CrlenLado a Cb[eLos 22
Cs campos do for so opclonals
Malo 2013 C aradlgma CrlenLado a Cb[eLos 23
// Conta at 10.
int i = 1;
for (; i < 10;) {
System.out.println(i++);
}

// Preenche um vetor.
int[] v = new int[5];
for (int i = 0; i < 5; v[i] = i++);

// Loop infinito.
for (;;);
8epeuo condlclonal com o for
- Lm vrlas llnguagens de programao, o for (ou slmllar)
serve somenLe para repeuo slmples:
- Lm !ava pode-se usar para fazer repeuo condlclonal:
Malo 2013 C aradlgma CrlenLado a Cb[eLos 24
para i de 1 at 10 faa
Escreva i
fim_para
boolean achou = false;
for (int i = 0; (! achou); i++) {
/* ... */
}
lnlclallzao / lncremenLo muluplo
- odemos efeLuar muluplas dlreuvas na lnlclallzao e
no lncremenLo, se necessrlo, separando com vlrgulas:
- Claro que Lambem podemos Ler condlclonals grandes
(usando operadores lglcos):
Malo 2013 C aradlgma CrlenLado a Cb[eLos 23
for (int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
System.out.println("i= " + i + " j= " + j);
}
for (int i = 0; (i < 5) && (! achou); i++) {
/* ... */
}
LsLruLuras de repeuo condlclonal
- 8epeuo de um Lrecho de cdlgo,
- numero lndeLermlnado de repeues, depende de uma
condlo (expresso lglca),
- !ava dlspe da dlreuva whlle e do whlle (slnLaxe
Lambem herdada de C):
Malo 2013 C aradlgma CrlenLado a Cb[eLos 26
// Contar de 1 a 10:
int i = 1;
while (i <= 10) System.out.println(i++);

i = 1;
do System.out.println(i++); while (i <= 10);
LsLruLura de whlle e do whlle
- [condlo]: expresso de condlo de parada do lao
(expresso lglca),
- [dlreuva]: dlreuva ou bloco de dlreuvas execuLadas
em cada lLerao do lao.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 27
while ([condio]) [diretiva]

do [diretiva] while [condio]
lunclonamenLo do whlle
Malo 2013 C aradlgma CrlenLado a Cb[eLos 28
lunclonamenLo do do whlle
Malo 2013 C aradlgma CrlenLado a Cb[eLos 29
CaracLerlsucas
- while avalla a condlo anLes da dlreuva, podendo
nunca execuL-la,
- do while s avalla depols, cerLamenLe execuLando a
dlreuva ao menos uma vez,
- C programador deve garanur que a condlo se Lorna
falsa em algum momenLo na dlreuva, do conLrrlo
poder gerar um !""# lnnlLo.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 30
Lxemplos
Malo 2013 C aradlgma CrlenLado a Cb[eLos 31
int i = 0, j = 10;
while (i <= j) {
System.out.println(i + " - " + j);
i++; j--;
}

// Executar ao menos 1 vez!
do {
System.out.println(i + " - " + j);
i++; j--;
} while (i <= j);

// Podemos fazer um for equivalente!
for (i = 0, j = 10; i <= j; i++, j--) {
System.out.println(i + " - " + j);
}
uesvlos lncondlclonals
- C uso de desvlos lncondlclonals com goto levam a
programas de balxa leglbllldade,
- !ava s Lem dols casos especlcos de desvlos
lncondlclonals: break e continue,
- odem ser usados denLro de laos ou denLro da
esLruLura switch (como [ vlmos):
- break sal da esLruLura (lao ou switch),
- continue val para a prxlma lLerao (somenLe
laos).
Malo 2013 C aradlgma CrlenLado a Cb[eLos 32
Lxemplos
Malo 2013 C aradlgma CrlenLado a Cb[eLos 33
while (ano < 2001) {
saldo = (saldo + salario) * (1 + juros);
if (saldo >= saldoLimite) break;
ano++;
}

for (int i = 0; i < 100; i++) {
if (i % 9 == 0) continue;
System.out.println(i);
}
break e conunue com rLulos (labels)
- 8Lulos podem lndlcar de qual lao queremos salr ou
conunuar a prxlma lLerao,
- odem ser usados apenas em laos e s fazem senudo
em laos anlnhados.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 34
externo:
for (int i = 1; i < 100; i++) {
for (j = 5; j < 10; j++) {
int x = i * j - 1;
if (x % 9 != 0) break;
if (x % 15 == 0) break externo;
System.out.println(x);
}
}
LnLrada e salda de dados bslca
- 1oda llnguagem de programao deve prover um melo
de lnLerao com o usurlo,
- C melo mals bslco e o uso do console, com enLrada de
dados pelo Leclado e salda em LexLo,
- CuLros melos so: lnLerface grca ([anelas), pela .'/,
comandos de voz, eLc.0
- Aprenderemos agora a forma de lnLerao bslca, pelo
console:
- C shell" ou console" do Llnux/Mac,
- C prompL de comando" do Wlndows.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 33
Salda de dados pelo console
- !ava usa o concelLo de $%*'&(: um duLo capaz de
LransporLar dados de um lugar a ouLro,
- A classe java.lang.System oferece um $%*'&( padro
de salda chamado out,
- L um ob[eLo da classe java.io.PrintStream,
aberLo e manudo auLomaucamenLe pela !vM,
- Cferece vrlos meLodos para lmpresso de dados:
print(), println() e printf().
- odemos Lrocar o dlsposluvo padro de salda:
System.setOut(novaStream).
Malo 2013 C aradlgma CrlenLado a Cb[eLos 36
Lxemplos
Malo 2013 C aradlgma CrlenLado a Cb[eLos 37
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
for (i = 1; i < 10; i++) {
System.out.print(i + ", ");
}
System.out.println(10);

String s = "Ol, Java!";
float valor = 45.67;
boolean teste = true;

System.out.println(s); // Ol, Java!
System.out.print(valor); // 45.67 (sem quebra)
System.out.println(); // Quebra de linha
System.out.println(teste); // true
Salda formaLada
- A parur do !ava 3, a funo printf() do C fol colocada
na classe PrintWriter,
- laclllLa a mlgrao de cdlgo C para !ava,
- L uma forma mals poderosa de formaLar a salda,
- C Lrabalho de formaLao e, na verdade, felLo pela
classe java.util.Formatter.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 38
Como funclona o printf
- ArgumenLos:
- uma sLrlng de formaLao, com cdlgos especlals,
- uma llsLa de argumenLos a serem lmpressos.
- Lxemplos:
Malo 2013 C aradlgma CrlenLado a Cb[eLos 39
System.out.printf("Ol, Java!%n"); // Ol, Java!

// [ 12] e [12345678]
System.out.printf("[%5d]%n", 12);
System.out.printf("[%5d]%n", 12345678);

double PI = 3.141592;
System.out.printf("[%6.6f]%n", PI); // [3.141592]
System.out.printf("[%6.4f]%n", PI); // [ 3.1416]
Cdlgos de formaLao
- ossuem a segulnLe slnLaxe:
%[i$][flags][tam][.prec]converso
i: lndlce do argumenLo (opclonal),
flags: modlcam o formaLo de salda (opclonal),
tam: Lamanho da salda em caracLeres (opclonal),
prec: preclso das casas declmals (opclonal),
converso: cdlgo de converso (lndlca se e um
LexLo, lnLelro, real, booleano, eLc. - obrlgaLrlo).
Malo 2013 C aradlgma CrlenLado a Cb[eLos 40
Cdlgos de converso
Malo 2013 C aradlgma CrlenLado a Cb[eLos 41
Cdigo Tipo do
arg.
Descrio
'b' ou 'B'
Booleano Imprime true ou false.
's' ou 'S'
Geral Imprime como string (texto).
'c' ou 'C'
Caractere O resultado um caractere Unicode.
'd'
Inteiro
O resultado formatado como nmero inteiro na
base decimal.
'e' ou 'E'
Real (PF)
O resultado formatado como nmero decimal
em notao cientfica.
'f'
Real (PF)
O resultado formatado como nmero decimal.
'g' ou 'G'
Real (PF)
Uma das duas opes acima (depende do valor).
'%'
-
O resultado o caractere %.
'n'
-
O resultado uma quebra de linha.
Mals exemplos
Malo 2013 C aradlgma CrlenLado a Cb[eLos 42
// 5, 00005
System.out.printf("%1$d, %1$05d%n", 5);

// Agora: 12 de Maio de 2006 - 04:29:42 PM.
System.out.printf("Agora: %te de %<tB de %<tY - %<tr.
%n", new Date());

// PI = 3.141592654
System.out.printf("PI = %.9f%n", Math.PI);

// PI = 3,141592654
Locale br = new Locale("pt", "BR");
System.out.printf(br, "PI = %.9f%n", Math.PI);

// Veja outros formatos na documentao!
LnLrada de dados pelo console
- A classe java.lang.System oferece um $%*'&( padro
de enLrada chamado in,
- L um ob[eLo da classe java.io.InputStream,
aberLo e manudo auLomaucamenLe pela !vM,
- Seus meLodos de lelLura so mulLo prlmluvos, se
comparados com os meLodos de escrlLa que vlmos,
- reclsamos de ouLras classes que auxlllem na lelLura.
- Alem da lelLura por System.in, podemos ler Lambem
os argumenLos passados na chamada do programa.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 43
A classe java.util.Scanner
- oderoso melo de ler dados de qualquer $%*'&( de
enLrada, exlsLenLe a parur do !ava 3,
- lunclonamenLo:
- L uma lnformao,
- Cuebra a lnformao em %"2')$ de acordo com um
separador (que pode ser congurado),
- ConverLe para o upo de dados adequado (quando
posslvel).
Malo 2013 C aradlgma CrlenLado a Cb[eLos 44
Lxemplos
Malo 2013 C aradlgma CrlenLado a Cb[eLos 43
// L do console.
Scanner scanner = new Scanner(System.in);

// L linha por linha e imprime o "eco".
while (scanner.hasNext()) {
String s = scanner.nextLine();
System.out.println("Eco: " + s);
}

// Quebra palavra por palavra.
while (scanner.hasNext()) {
String s = scanner.next();
System.out.println("Eco: " + s);
}

// Depois de usado deve ser fechado.
scanner.close();
Mals exemplos
Malo 2013 C aradlgma CrlenLado a Cb[eLos 46
// L do console.
Scanner scanner = new Scanner(System.in);

// L nmeros e imprime o dobro.
while (scanner.hasNextDouble()) {
double d = scanner.nextDouble();
System.out.println("Dobro: " + (d * 2));
}

// Separa os tokens usando vrgulas.
scanner.useDelimiter(",");
while (scanner.hasNext()) {
String s = scanner.next();
System.out.println("Eco: " + s);
}

scanner.close();
LelLura de argumenLos
- C meLodo main() possul a segulnLe asslnaLura:
public static void main(String[] args);
- C veLor args conLem os dados passados como
argumenLos para o programa.
Malo 2013 C aradlgma CrlenLado a Cb[eLos 47
Lco.[ava novamenLe
Malo 2013 C aradlgma CrlenLado a Cb[eLos 48
public class Eco {

// Mtodo principal.
public static void main(String[] args) {

// i vai de 0 at o n de argumentos.
for (int i = 0; i < args.length; i++)

// Imprime o argumento na tela.
System.out.print(args[i] + " ");

// Quebra de linha.
System.out.println();

}

}
!"#$%%&'()*+&,*-,'.*/0%
Malo 2013 C aradlgma CrlenLado a Cb[eLos 49

Você também pode gostar