Você está na página 1de 61

Statements bsicos na linguagem Java

Prof. Ricardo Linden

Statements

Nesta aula analisaremos alguns statements importantes para a


programao.

Todos nesta matria sabem programar imperativamente, logo,


considerem esta aula como uma reviso.

Tpicos principais:
Fluxo de controle atravs de um mtodo
Statements e operadores para tomada de deciso
Statements de repetio

Fluxo de controle

A no ser que ordenado de outra maneira, a ordem de


execuo dentro de um mtodo linear: uma aps a outra na
ordem em que esto escritas.

Alguns statements permitem que modifiquemos esta ordem da


seguinte maneira:
decidindo se vamos executar ou no um (bloco de) statement
realizar uma mesma statements vrias vezes consecutivas.

A ordem de execuo de statements chamada de fluxo de


controle

Fluxo de controle
No se esqueam: a execuo de um programa
Java comea dentro do mtodo main (e s pode
existir um por arquivo!)

Isto um contrasenso:
uma LOO que tem
um mtodo main...
Outras LOO agem de
forma diferente!

Statements Condicionais

Uma statement condicional permite que selecionemos qual


statement ser a prxima executada.

Por isto, elas so muitas vezes chamadas de statements de seleo.

Statements condicionais nos do o poder de tomar decises bsicas.

As statements condicionais do Java so:

if
if-else
switch
e o operador ?

O statement if

O statement if tem a seguinte sintaxe:

if uma palavra
reservada do Java

A condio deve ser uma expresso booleana.


Ele deve retornar um valor verdadeiro ou falso.

if ( condio )
statement;

Se a condio for verdadeira, o statement executado.


Se for falsa, o statement saltado.

O statement if

Exemplo de um statement if
if (sum > MAX)
delta = sum - MAX;
System.out.println (A soma " + sum);

Primeiro a condio avaliada. Se o valor de sum maior que o valor de


MAX, ou no
Se a condio for verdaeira, a atribuio executada
Se a condio for falsa, a atribuio saltada.

De qualquer maneira, a chamada para o println


executada, pois ela no pertence ao corpo do if.

Lgica de um statement if

condio
avaliada
true
statement

:
Resto do Programa
:

false

Voc no lembra de
fluxogramas? Ns os
vimos em Programao I
Eles so uma tima ferramenta
de definio de algoritmos e
merecem ser revistos!

Exemplo completo de if
import javax.swing.JOptionPane;
public class Exemplo_If {
public static void main (String[] args)
{
int n1;
n1=Integer.parseInt(JOptionPane.showInputDialog(Entre com um num. :"));
if (n1>50)
System.out.println(O numero e maior que 50);
System.out.println(Fim do programa.);
System.exit(0);
}
}

O Statement if-else

Uma clusula else pode ser adicionada a um statement if


para torn-lo um statement if-else:
if ( condio )
statement1;
else
statement2;

Se a condio verdadeira, a statement1 executada; Se a


condio for falsa, a statement2 executada.
Como a condio no pode ser verdadeira e falsa ao
mesmo tempo, ou statement1 executada ou
statement2 executada. No podemos executar ambas.

Lgica de uma statement if-else


condio
avaliada
true

false

statement1

statement2

:
Resto do Programa
:

Note que os caminhos no se cruzam - logo


statement1 e statement2 no podem ser
executadas juntas, dada a mesma condio

Exemplo completo de if-else


import javax.swing.JOptionPane;
public class Exemplo_If_Else {
public static void main (String[] args)
{
int n1=Integer.parseInt(JOptionPane.showInputDialog(Entre com num. :"));
if (n1>50)
System.out.println(O numero e maior que 50);
else
System.out.println(O numero nao e maior que 50);
System.out.println(Fim do programa.);
System.exit(0);
}
}

Bloco de Statements

Muitas statements podem ser agrupadas em um bloco de statement

Um bloco delimitado por chaves ( { } )

Um bloco de statements pode ser usado em qualquer lugar que


uma statement for definida na sintaxe do Java

Por exemplo, no if ou no if-else, tanto a statement do if quanto a


do if-else podem ser substitudas por um bloco.

Fazemos isto quando precisamos tomar vrias atitudes quando de


um teste, por exemplo, ao invs de uma s.

Exemplo completo de bloco de instrues


import javax.swing.JOptionPane;
public class Exemplo_Bloco {
public static void main (String[] args) {
int d,n1=Integer.parseInt(JOptionPane.showInputDialog(Entre com n1. :"));
int n2=Integer.parseInt(JOptionPane.showInputDialog(Entre com n2. :"));
if (n1>n2) {
System.out.println(O maior dos nmeros +n1);
d=n1-n2;
} else {
System.out.println(O maior dos nmeros +n2);
d=n2+n1;
}
System.out.println(O valor de d +d);
System.exit(0);
}
}

Conselho sobre blocos

Se no usarmos as chaves, somente a primeira statement


subseqente a um if (e a outras statements que veremos
depois) ser-lhe- subordinada.

Exemplo:
if (n1>n2)
n1=n1-n2;
n2=n2+1;

if termina aqui!
Esta instruo no pertence ao if!

Isto uma causa muito comum de erros! Para evit-los,


basta usar sempre as chaves, mesmo quando temos
apenas uma nica instruo subordinada ao if!

Ifs aninhados

Uma statement executada dentro de um statement if ou dentro


de um statement else pode ser outra statement if
Na verdade, pode ser qualquer statement vlido do Java, sem
distino!

A isto dado o nome de ifs aninhados

A clusula else encontrada, a no ser que haja chaves


delimitantes, relacionada com o ltimo if.
No importa o que a identao quer implicar!

Exemplo completo de ifs aninhados


import javax.swing.JOptionPane;
public class Exemplo_Bloco {
public static void main (String[] args) {
int n1=Integer.parseInt(JOptionPane.showInputDialog(Entre com n1. :"));
int n2=Integer.parseInt(JOptionPane.showInputDialog(Entre com n2. :"));
int n3=Integer.parseInt(JOptionPane.showInputDialog(Entre com n3. :"));
if (n1>n2)
if (n1>n3) System.out.println(O maior e +n1)
else System.out.println(O maior e +n3)
else
if (n2>n3) System.out.println(O maior e +n2)
else System.out.println(O maior e +n3);
System.exit(0);
}
}

Conselho sobre ifs aninhados


O else dependurado uma bomba pronta para
criar bugs inesperados em seu programa. Para
evitar isto, basta usar as chaves para garantir
que os ifs e elses pertenam a quem ns
efetivamente queremos.

Veja como o exemplo anterior fica mais claro


quando usamos as chaves.

Novamente o exemplo de ifs aninhados


import javax.swing.JOptionPane;
public class Exemplo_Bloco {
public static void main (String[] args) {
int n1=Integer.parseInt(JOptionPane.showInputDialog(Entre com n1. :"));
int n2=Integer.parseInt(JOptionPane.showInputDialog(Entre com n2. :"));
int n3=Integer.parseInt(JOptionPane.showInputDialog(Entre com n3. :"));
if (n1>n2) {
if (n1>n3) System.out.println(O maior e +n1)
else System.out.println(O maior e +n3)
} else {
if (n2>n3) System.out.println(O maior e +n2)
else System.out.println(O maior e +n3);
}
System.exit(0);
}
}

Comparando Strings

Lembre-se que uma string de caracteres em Java um objeto.

Ns no podemos usar o operador relacional para comparar


strings.
Porque?

Porque objetos so ponteiros. Se ns


os compararmos, estaremos vendo
se apontam para o mesmo lugar.

Comparando Strings
O mtodo equals da classe string pode ser chamado de um a string
para determinar se duas strings contm exatamente os mesmos
caracteres na mesma ordem.
A classe String tambm tem uma mtodo chamado compareTo
para determinar se uma string vem antes de outra alfabeticamente
(conforme determinado pelo conjunto de caracteres Unicode)

Exemplo completo de Strings


import javax.swing.JOptionPane;
public class Compara_Strings {
public static void main (String[] args) {
String senha=JOptionPane.showInputDialog(Entre com a senha:");
if (senha.equals(senha1)) {
System.out.println(Bem vindo ao programa.)
} else {
System.out.println(Usurio no autorizado);
}
System.exit(0);
Repare que os mtodos em Java sempre comeam
com minsculas. Se eles tiverem uma segunda
}
palavra, ento esta ser escrita com maiscula
}
(exemplo : compareTo)

Comparando valores em ponto flutuante

Ns tambm devemos ser bastante cautelosos quando


compararmos dois valores de ponto flutuante (float or
double) para saber se eles so iguais.
Em termos prticos, ns raramente devemos usar o operador
de igualdade (==) para comparar dois reais.
Na maioria das situaes, ns devemos analsar se dois
nmeros so prximos os suficiente para serem considerados
iguais.
Por exemplo:
if (Math.abs (f1 - f2) < 0.00001)
System.out.println (Praticamente iguais.");

Comparando valores em ponto flutuante


Isto ocorre por problemas de arredondamento
normais em um ambiente de representao finita.
s vezes, duas operaes que deveriam resultar
em nmeros idntico, por problemas de
arredondamento, no o fazem e podemos ter um
problema de lgica em nossos programas.

Uma lembrana boa: Em Java, se


errarmos e substituirmos o == por um
=, o programa no compila. Isto evita
erros chatos que tnhamos em C

O statement switch

O statement switch fornece outra maneira de decidir qual


dentre vrias opes de statements ser executada a seguir.

O switch avalia uma expresso e depois tenta casar o resultado


com um dentre vrios casos possveis.

Cada caso contm um valor e uma lista de statements

O fluxo de controle transferido para a lista de statements


associada ao primeiro valor que casa com a expresso avaliada

O statement switch

A sintaxe geral do statement switch a seguinte:

Switch e case
sao palavras
reservadas Java

switch ( expresso )
{
case valor1 :
statement-list1
case valor2 :
statement-list2
case valor3 :
statement-list3
case ...
}

Se a expresso
casa com valor2,
o fluxo de controle
salta para c.

O statement switch

Freqentemente, um statement break usado como ltima instruo de


cada lista de statements.

Um statement break faz com que o fluxo de controle seja transferido para
o fim do statement switch.

Se o break no for usado, o fluxo de controle continua executando as


statements do prximo case

Algumas vezes isto pode ser til, especialmente quando houver um caso
que executa um suoperconjunto de instrues do outro.

Entretanto, na maioria dos casos, esquecer um break uma causa de bugs


em seus programas.

O statement switch

A expresso de um switch deve resultar em um integral data type,


como um inteiro ou caracter.

No pode resultado em um ponto flutuante ou string.

Note que implicitamente estamos usando o operador de igualdade


em cada case do switch.

No podemos realizar testes relacionais dentro de um switch para isto usamos o if.

Exemplo completo de switch


import javax.swing.JOptionPane;
public class Exemplo_Switch {
public static void main (String[] args) {
char sexo=M;
switch sexo {
case M,m : { System.out.println( um homem.)
break; }
case F,f : { System.out.println( uma mulher.)
break; }
}
System.exit(0);
}
}
O que acontece se apagarmos os breaks?

O statement switch

Um statement switch pode ter um caso default opcional.

O caso default no tem nenhum valor associado, e simplesmente


usa a palavra reservada default

Se o caso default estiver presente, o controle ser transferido para


ele caso nenhum outro caso tenha um valor que case com a
expresso.

Apesar do caso default poder ser colocado em qualquer posio


no switch, ele normalmente colocado no fim.

Se no h caso default e nenhum valor casa com a expresso, o


controle transferido para a primeira instruo aps o switch.

Exemplo completo de switch-default


import javax.swing.JOptionPane;
public class Exemplo_Switch {
public static void main (String[] args) {
char sexo=M;
switch sexo {
case M,m : {
System.out.println( um homem.)
break; }
case F,f : { System.out.println( uma mulher.)
break; }
default : {System.out.println(Sexo invlido.);}
}
System.exit(0);
}
Porque no colocamos break
}

no default?

O operador condicional

Java tem um operador condicional, como o C, que avalia uma


condio booleana e determina qual de duas outras expresses
so avaliadas

O resultado da expresso selecionada ento o resultado da


expresso condicional

Sua sintaxe :
condio ? expresso1 : expresso2

Se a condio avalia para verdadeira, a expresso1 avaliada;


se condio for falsa, a expresso2 avaliada

Exemplo completo do operador condicional


import javax.swing.JOptionPane;
public class op_Condicional {
public static void main (String[] args) {
String senha=JOptionPane.showInputDialog(Entre com a senha:");
System.out.println(senha.equals(senha1) ?Bem vindo ao programa.:
Usurio no autorizado.)
System.exit(0);
}
}

Statements de Repetio

Statements de repetio nos permitem executar uma ou mais statements


mltiplas vezes.

Eles so chamados freqentemente de loops

Assim como as statements condicionais, eles so controlados por


expresses booleanas.

Java tem trs tipos de statements de repetio statements


while
do loop
for

Cada uma delas tem peculiaridades que as fazem adequadas para


diferentes situaes e cabe ao programador escolher a mais apropriada

O statement while

O statement while tem a seguinte sintaxe:

A condio deve ser uma expresso booleana.


Ele deve retornar um valor verdadeiro ou falso.

while uma
palavra reservada

while ( condio )
statement;

Se a condio for avaliada como verdadeira, o statement executado.


Ao fim do statement, volta-se para cima e a condio re-avaliada

O statement executado de forma repetitiva


at que a condio torne-se falsa.

Lgica de um loop while


condio
avaliada
true
statement

false

A chave do bom uso


do while perceber
que o statement pode
executar
zero
ou
vrias vezes, j que a
condio avaliada
antes do statement ser
executado

Exemplo completo de um while


import javax.swing.JOptionPane;
public class Exemplo_While {
public static void main (String[] args)
{
int n1=1,soma=0;
while(n1>0) {
n1=Integer.parseInt(JOptionPane.showInputDialog(No. positivo :"));
soma+=n1;
}
System.out.println(Fim do programa. Soma=+soma);
System.exit(0);
}
}

Desafio em sala de aula

Que tal modificarmos o programa


de senha para dar trs chances
para o usurio acertar?

Loops Infinitos

O corpo de um loop while deve eventualmente fazer com que a


condio de teste se torne falsa.

Se no, temos uma situao de um loop infinito, que executar


para sempre, a no ser que o usurio interrompa o programa

Este um tipo de erro lgico


comum que deve ser evitado.
Sempre cheque seus programas
para garantir que existam pontos
de sada em seus loops.

Perguntas Razoveis

Em nosso exemplo anterior, para que servia


o valor de inicializao de n1?
Garantir que o loop executasse
pela primeira vez
O que fazia com que o loop tivesse um ponto
de sada?
A entrada de um nmero menor
ou igual que zero pelo usurio

Loops Aninhados

Da mesma maneira que os statements ifs podem ser


aninhados, loops tambm podem s-lo.

Isto , o corpo de um loop pode conter outro loop.

O loop que contm chamado de loop mais externo,


enquanto que o loop contido chamado de loop mais
interno.

Cada vez que executamos o loop mais externo, o loop mais


interno executar n vezes.

Lgica dos loops aninhados


condio
avaliada
true

false

condio
avaliada
true
statement

false

Loop mais interno : cada


vez que entramos no loop
mais externo, executamos
este loop n vezes

Exemplo de loops aninhados


public class Exemplo_Aninhados {
public static void main (String[] args)
{
int n1=0,n2;
while(++n1<10) {
n2=n1+1;
while(n2<10) {
System.out.println(n1+ +n2++);
}
}
System.out.println(Fim do programa. Soma=+soma);
System.exit(0);
}
}

Mos massa

Vamos colocar o programa anterior


para funcionar e ver o resultado.

Como garantimos os pontos de sada


dos dois loops do exemplo?

O Statement do

O statement do tem a seguinte sintaxe:

Usa as palavras
reservadas
do e while

do
{
statement;
}
while ( condio )

O statement executado uma vez e


depois a condio avaliada. O
processo se repete at que a
condio se torne falsa.

Lgica de um loop do

statement
true
condio
avaliada
false

Note que o loop do muito similar


ao loop while, exceto que a condio
avaliada ao fim do corpo do loop.
Isto garante que o corpo do loop seja
executado ao menos uma vez.

Comparando os loops while e do


Loop while

Loop do

statement

condio
avaliada
true
true

false

condio
avaliada

statement
false

Outro exerccio

Vamos modificar o exemplo com loop


while para fazer o mesmo, s que
usando um loop do.

Fica
melhor?
Precisamos
inicializao de n1? Porqu?

da

O Statement for

O statement for tem a seguinte sintaxe:

Palavra
Reservada

A poro de initializao
O statement executado
executada uma vez
at que a condio se torne falsa
quando o loop comea

for ( initializao ; condio ; incremento )


statement;

A poro incremento executada ao fim de cada iterao

O Statement for

Um loop for equivalente seguinte estrutura do loop


while:
initializao;
while ( condio )
{
statement;
incremento;
}

Logo, como no caso do while, o corpo


do loop pode executar 0 ou n vezes!

Lgica de um loop for


initializao
O for bom quando
temos um nmero fixo
de execues.

condio
avaliada
true
statement
incremento

false

Os programadores C
adoram fazer
construes bem
complexas com o
FOR!

O Statement for

Cada elemento de um statement for opcional:


Se no usarmos a inicializao, nenhuma inicializao realizada
Se a condio no usada, nenhum teste feito e criamos um loop infinito.
Se o incremento no usado, nenhum incremento realizado.

Mesmo que no usemos os elementos, os pontos-e-vrgulas ainda


so necessrios.

Exemplos
for ( ; x < 10 ; x++)
Sem inicializao
for ( x=1 ; ; x++) Sem condio
for ( x=1; x<10 ; ) Sem incremento

Continue

A statement continue faz com que o programa abandone a


iterao corrente (mais interna) e comee a prxima iterao do
loop.

Use o continue para pular execues que no so necessrias.

Ao encontrar o continue, o programa volta para a primeira


instruo do loop (for, while ou do).

Exemplo de continue
public class Exemplo_Continue {
public static void main (String[] args)
{
for(int i = 0; i < 10; i++) {
if( (i == 5 ) continue;
System.out.println(i = + i );
}
System.exit(0);
}
}

Qual a sada deste programa?

Break

A statement break faz com que o programa interrompa o loop


corrente (mais interno) sem executar o resto das suas
statements.

Faz com que o controle seja transferido para a primeira


instruo imediatamente aps o bloco do loop mais interno.

Use o break para interromper uma interao especfica quando


encontrar um situao no usual ou de erro.

Exemplo de break
public class Exemplo_Break {
public static void main (String[] args)
{
for(int i = 0; i < 10; i++) {
if( i == 5 ) break;
System.out.println(i = + i );
}
System.exit(0);
}
}

Qual a sada deste programa?

Labels

Qualquer instruo pode receber um rtulo (label).

Um label nada mais do que um identificador Java seguido de um :


(dois pontos).

Os labels no precisam ser nicos, desde que seus escopos no


tenham intersees.

Exemplos:
label1: for(int i = 0; i < 10; i++) {
loopx : while (a<10) {

Break e Continue rotulados

Podemos colocar rtulos (sem os dois pontos) aps as statements


break e continue.

Assim, ao invs de causar a interrupo ou voltar para o incio


necessariamente do loop mais interno, ns o faremos com o loop
cujo rtulo seja explicitado.

Esta a maneira do Java de simular o comando GOTO, que no


suportado.

Exemplo de continue rotulado


public class Continue_Rotulado {
public static void main (String[] args)
{
loop_ext:for(int i = 0; i < 10; i++) {
if( (i == 5 ) continue;
for(int j=i;j<=10;j++) {
if (j=(i+3)) continue loop_ext;
if (j=2*i) continue;
System.out.println(i = + i +j=+j);
}
}
System.exit(0);
}
}

Dentro dos mtodos, trabalhamos


como se estivssemos usando
uma LP imperativa.
Agora estamos prontos para
entrar no mundo da OO

S no esqueam de fazer
as listas de exerccios!

Você também pode gostar