Statements básicos na linguagem Java Prof. Ricardo Linden Programação Orientada a Objetos - 1 Statements Nesta aula analisaremos alguns statements importantes para a programação. Todos nesta matéria sabem programar imperativamente, logo, considerem esta aula como uma revisão. Tópicos principais: Fluxo de controle através de um método Statements e operadores para tomada de decisão Statements de repetição Programação Orientada a Objetos - 2 Fluxo de controle A não ser que ordenado de outra maneira, a ordem de execução dentro de um método é linear: uma após a outra na ordem em que estão escritas. Alguns statements permitem que modifiquemos esta ordem da seguinte maneira: decidindo se vamos executar ou não um (bloco de) statement realizar uma mesma statements várias vezes consecutivas. A ordem de execução de statements é chamada de fluxo de controle Programação Orientada a Objetos - 3 Fluxo de controle Não se esqueçam: a execução de um programa Java começa dentro do método main (e só pode existir um por arquivo!) Isto é um contrasenso: uma LOO que tem um método main... Outras LOO agem de forma diferente! Programação Orientada a Objetos - 4 Statements Condicionais Uma statement condicional permite que selecionemos qual statement será a próxima executada. Por isto, elas são muitas vezes chamadas de statements de seleção. Statements condicionais nos dão o poder de tomar decisões básicas. As statements condicionais do Java são: if if-else switch e o operador ? Programação Orientada a Objetos - 5 O statement if O statement if tem a seguinte sintaxe: if é uma palavra reservada do Java A condição deve ser uma expressão booleana. Ele deve retornar um valor verdadeiro ou falso. if ( condição ) statement; Se a condição for verdadeira, o statement é executado. Se for falsa, o statement é “saltado”. Programação Orientada a Objetos - 6 O statement if Exemplo de um statement if if (sum > MAX) delta = sum - MAX; System.out.println (”A soma é " + sum); Primeiro a condição é avaliada. Se o valor de sum é maior que o valor de MAX, ou não Se a condição for verdaeira, a atribuição é executada Se a condição for falsa, a atribuição é saltada. De qualquer maneira, a chamada para o println é executada, pois ela não pertence ao corpo do if. Programação Orientada a Objetos - 7 Lógica de um statement if condição avaliada true false Você não lembra de fluxogramas? Nós os vimos em Programação I Eles são uma ótima ferramenta de definição de algoritmos e merecem ser revistos! statement : Resto do Programa : Programação Orientada a Objetos - 8 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); } } Programação Orientada a Objetos - 9 O Statement if-else Uma cláusula else pode ser adicionada a um statement if para torná-lo um statement if-else: if ( condição ) statement1; else statement2; Se a condição é verdadeira, a statement1 é executada; Se a condição for falsa, a statement2 é executada. Como a condição não pode ser verdadeira e falsa ao mesmo tempo, ou statement1 é executada ou statement2 é executada. Não podemos executar ambas. Programação Orientada a Objetos - 10 Lógica de uma statement if-else condição avaliada true false statement1 statement2 : Resto do Programa : Note que os caminhos não se cruzam - logo statement1 e statement2 não podem ser executadas juntas, dada a mesma condição Programação Orientada a Objetos - 11 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); } } Programação Orientada a Objetos - 12 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 substituídas por um bloco. Fazemos isto quando precisamos tomar várias atitudes quando de um teste, por exemplo, ao invés de uma só. Programação Orientada a Objetos - 13 Exemplo completo de bloco de instruções 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 números é”+n1); d=n1-n2; } else { System.out.println(“O maior dos números é”+n2); d=n2+n1; } System.out.println(“O valor de d é “+d); System.exit(0); } } Programação Orientada a Objetos 14 Conselho sobre blocos Se não usarmos as chaves, somente a primeira statement subseqüente 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 instrução não pertence ao if! Isto é uma causa muito comum de erros! Para evitá-los, basta usar sempre as chaves, mesmo quando temos apenas uma única instrução subordinada ao if! Programação Orientada a Objetos - 15 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 válido do Java, sem distinção! A isto é dado o nome de ifs aninhados A cláusula else encontrada, a não ser que haja chaves delimitantes, é relacionada com o último if. Não importa o que a identação quer implicar! Programação Orientada a Objetos - 16 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); } } Programação Orientada a Objetos - 17 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 “pertençam” a quem nós efetivamente queremos. Veja como o exemplo anterior fica mais claro quando usamos as chaves. Programação Orientada a Objetos - 18 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); } } Programação Orientada a Objetos - 19 Comparando Strings Lembre-se que uma string de caracteres em Java é um objeto. Nós não podemos usar o operador relacional para comparar strings. Porque? Porque objetos são ponteiros. Se nós os compararmos, estaremos vendo se apontam para o mesmo lugar. Programação Orientada a Objetos - 20 Comparando Strings • O método equals da classe string pode ser chamado de um a string para determinar se duas strings contêm exatamente os mesmos caracteres na mesma ordem. • A classe String também tem uma método chamado compareTo para determinar se uma string vem antes de outra alfabeticamente (conforme determinado pelo conjunto de caracteres Unicode) Programação Orientada a Objetos - 21 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(“Usuário não autorizado”); } System.exit(0); Repare que os métodos em Java sempre começam } com minúsculas. Se eles tiverem uma segunda palavra, então esta será escrita com maiúscula } (exemplo : compareTo) Programação Orientada a Objetos - 22 Comparando valores em ponto flutuante Nós também devemos ser bastante cautelosos quando compararmos dois valores de ponto flutuante (float or double) para saber se eles são iguais. Em termos práticos, nós raramente devemos usar o operador de igualdade (==) para comparar dois reais. Na maioria das situações, nós devemos analsar se dois números são próximos os suficiente para serem considerados iguais. Por exemplo: if (Math.abs (f1 - f2) < 0.00001) System.out.println (”Praticamente iguais."); Programação Orientada a Objetos - 23 Comparando valores em ponto flutuante Isto ocorre por problemas de arredondamento normais em um ambiente de representação finita. Às vezes, duas operações que deveriam resultar em números idêntico, por problemas de arredondamento, não o fazem e podemos ter um problema de lógica em nossos programas. Uma lembrança boa: Em Java, se errarmos e substituirmos o == por um =, o programa não compila. Isto evita erros chatos que tínhamos em C Programação Orientada a Objetos - 24 O statement switch O statement switch fornece outra maneira de decidir qual dentre várias opções de statements será executada a seguir. O switch avalia uma expressão e depois tenta casar o resultado com um dentre vários casos possíveis. Cada caso contém 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 expressão avaliada Programação Orientada a Objetos - 25 O statement switch A sintaxe geral do statement switch é a seguinte: Switch e case sao palavras reservadas Java switch ( expressão ) { case valor1 : statement-list1 case valor2 : statement-list2 case valor3 : statement-list3 case ... } Programação Orientada a Objetos - Se a expressão casa com valor2, o fluxo de controle salta para cá. 26 O statement switch Freqüentemente, um statement break é usado como última instrução 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 não for usado, o fluxo de controle continua executando as statements do próximo case Algumas vezes isto pode ser útil, especialmente quando houver um caso que executa um suoperconjunto de instruções do outro. Entretanto, na maioria dos casos, esquecer um break é uma causa de bugs em seus programas. Programação Orientada a Objetos - 27 O statement switch A expressão de um switch deve resultar em um integral data type, como um inteiro ou caracter. Não pode resultado em um ponto flutuante ou string. Note que implicitamente estamos usando o operador de igualdade em cada case do switch. Não podemos realizar testes relacionais dentro de um switch para isto usamos o if. Programação Orientada a Objetos - 28 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? Programação Orientada a Objetos - 29 O statement switch Um statement switch pode ter um caso default opcional. O caso default não 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 expressão. Apesar do caso default poder ser colocado em qualquer posição no switch, ele normalmente é colocado no fim. Se não há caso default e nenhum valor casa com a expressão, o controle é transferido para a primeira instrução após o switch. Programação Orientada a Objetos - 30 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 inválido.”);} } System.exit(0); } Porque não colocamos break no default? } Programação Orientada a Objetos - 31 O operador condicional Java tem um operador condicional, como o C, que avalia uma condição booleana e determina qual de duas outras expressões são avaliadas O resultado da expressão selecionada é então o resultado da expressão condicional Sua sintaxe é: condição ? expressão1 : expressão2 Se a condição avalia para verdadeira, a expressão1 é avaliada; se condição for falsa, a expressão2 é avaliada Programação Orientada a Objetos - 32 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.”: “Usuário não autorizado.”) System.exit(0); } } Programação Orientada a Objetos - 33 Statements de Repetição Statements de repetição nos permitem executar uma ou mais statements múltiplas vezes. Eles são chamados freqüentemente de loops Assim como as statements condicionais, eles são controlados por expressões booleanas. Java tem três tipos de statements de repetição statements while do loop for Cada uma delas tem peculiaridades que as fazem adequadas para diferentes situações e cabe ao programador escolher a mais apropriada Programação Orientada a Objetos - 34 O statement while O statement while tem a seguinte sintaxe: A condição deve ser uma expressão booleana. Ele deve retornar um valor verdadeiro ou falso. while é uma palavra reservada while ( condição ) statement; Se a condição for avaliada como verdadeira, o statement é executado. Ao fim do statement, “volta-se para cima” e a condição é re-avaliada O statement é executado de forma repetitiva até que a condição torne-se falsa. Programação Orientada a Objetos - 35 Lógica de um loop while condição avaliada true statement false A chave do bom uso do while é perceber que o statement pode executar zero ou várias vezes, já que a condição é avaliada antes do statement ser executado Programação Orientada a Objetos - 36 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); } } Programação Orientada a Objetos - 37 Desafio em sala de aula Que tal modificarmos o programa de senha para dar três chances para o usuário acertar? Programação Orientada a Objetos - 38 Loops Infinitos O corpo de um loop while deve eventualmente fazer com que a condição de teste se torne falsa. Se não, temos uma situação de um loop infinito, que executará para sempre, a não ser que o usuário interrompa o programa Este é um tipo de erro lógico comum que deve ser evitado. Sempre cheque seus programas para garantir que existam pontos de saída em seus loops. Programação Orientada a Objetos - 39 Perguntas Razoáveis Em nosso exemplo anterior, para que servia o valor de inicialização de n1? Garantir que o loop executasse pela primeira vez O que fazia com que o loop tivesse um ponto de saída? A entrada de um número menor ou igual que zero pelo usuário Programação Orientada a Objetos - 40 Loops Aninhados Da mesma maneira que os statements ifs podem ser aninhados, loops também podem sê-lo. Isto é, o corpo de um loop pode conter outro loop. O loop que contém é 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. Programação Orientada a Objetos - 41 Lógica dos loops aninhados condição avaliada true false condição avaliada true statement false Loop mais interno : cada vez que entramos no loop mais externo, executamos este loop n vezes Programação Orientada a Objetos - 42 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); } } Programação Orientada a Objetos - 43 Mãos à massa Vamos colocar o programa anterior para funcionar e ver o resultado. Como garantimos os pontos de saída dos dois loops do exemplo? Programação Orientada a Objetos - 44 O Statement do O statement do tem a seguinte sintaxe: Usa as palavras reservadas do e while do { statement; } while ( condição ) O statement é executado uma vez e depois a condição é avaliada. O processo se repete até que a condição se torne falsa. Programação Orientada a Objetos - 45 Lógica de um loop do statement true condição avaliada Note que o loop do é muito similar ao loop while, exceto que a condição é avaliada ao fim do corpo do loop. Isto garante que o corpo do loop seja executado ao menos uma vez. false Programação Orientada a Objetos - 46 Comparando os loops while e do Loop while Loop do statement condição avaliada true true false condição avaliada statement false Programação Orientada a Objetos - 47 Outro exercício Vamos modificar o exemplo com loop while para fazer o mesmo, só que usando um loop do. Fica melhor? Precisamos inicialização de n1? Porquê? Programação Orientada a Objetos - da 48 O Statement for O statement for tem a seguinte sintaxe: Palavra Reservada A porção de initialização O statement é executado é executada uma vez até que a condição se torne falsa quando o loop começa for ( initialização ; condição ; incremento ) statement; A porção incremento é executada ao fim de cada iteração Programação Orientada a Objetos - 49 O Statement for Um loop for é equivalente à seguinte estrutura do loop while: initialização; while ( condição ) { statement; incremento; } Logo, como no caso do while, o corpo do loop pode executar 0 ou n vezes! Programação Orientada a Objetos - 50 Lógica de um loop for initialização O for é bom quando temos um número fixo de execuções. condição avaliada true statement false Os programadores C adoram fazer construções bem complexas com o FOR! incremento Programação Orientada a Objetos - 51 O Statement for Cada elemento de um statement for é opcional: Se não usarmos a inicialização, nenhuma inicialização é realizada Se a condição não é usada, nenhum teste é feito e criamos um loop infinito. Se o incremento não é usado, nenhum incremento é realizado. Mesmo que não usemos os elementos, os pontos-e-vírgulas ainda são necessários. Exemplos for ( ; x < 10 ; x++) for ( x=1 ; ; x++) for ( x=1; x<10 ; ) Sem inicialização Sem condição Sem incremento Programação Orientada a Objetos - 52 Continue A statement continue faz com que o programa abandone a iteração corrente (mais interna) e começe a próxima iteração do loop. Use o continue para pular execuções que não são necessárias. Ao encontrar o continue, o programa volta para a primeira instrução do loop (for, while ou do). Programação Orientada a Objetos - 53 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 saída deste programa? Programação Orientada a Objetos - 54 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 instrução imediatamente após o bloco do loop mais interno. Use o break para interromper uma interação específica quando encontrar um situação não usual ou de erro. Programação Orientada a Objetos - 55 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 saída deste programa? Programação Orientada a Objetos - 56 Labels Qualquer instrução pode receber um rótulo (label). Um label nada mais é do que um identificador Java seguido de um : (dois pontos). Os labels não precisam ser únicos, desde que seus escopos não tenham interseções. Exemplos: label1: for(int i = 0; i < 10; i++) { loopx : while (a<10) { Programação Orientada a Objetos - 57 Break e Continue rotulados Podemos colocar rótulos (sem os dois pontos) após as statements break e continue. Assim, ao invés de causar a interrupção ou voltar para o início necessariamente do loop mais interno, nós o faremos com o loop cujo rótulo seja explicitado. Esta é a maneira do Java de simular o comando GOTO, que não é suportado. Programação Orientada a Objetos - 58 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); } } Programação Orientada a Objetos - 59 Dentro dos métodos, trabalhamos como se estivéssemos usando uma LP imperativa. Agora estamos prontos para entrar no mundo da OO Programação Orientada a Objetos - 60 Só não esqueçam de fazer as listas de exercícios! Programação Orientada a Objetos - 61