Programação – Java Um programa em Java é executado sequencialmente. Esse programa pode ser visto como uma sequência de troços de programa. E esses troços podem por sua vez estar sujeitos a condições de modo a poderem ou não ser executados, repetidos ou reutilizados. if – A sequência de execução de um troço de programa pode ser dirigida através de uma condição, permitindo assim bifurcar o código e optar por continuar a sequência por um dos ramos da bifurcação. Após a execução sequencial de um ou outro ramal a bifurcação fecha novamente e continua a execução sequencial do programa. O número de bifurcações é ilimitado como também a sua combinação. Em Java a instrução que permite bifurcar o código é conhecida como if. A instrução if está sujeita a uma condição que após avaliação e o resultado for verdadeiro pode seguir por um ramo específico. Opcionalmente pode seguir por um outro ramo caso o resultado tenha sido falso. Após a execução do ramo verdadeiro ou eventualmente o do falso, o if termina e o programa continua na instrução seguinte. Visualmente obtém-se a seguinte figura: Um programa a ser executado sequencialmente ? Faz este ramo caso o resultado da condição seja verdadeiro As linhas a tracejado na figura acima mostram a sequência de um programa. Na figura da direita, o ponto de interrogação indica a condição de uma instrução if. Caso o resultado dessa condição seja verdadeiro, o programa continua a execução no ramo assinalado. Depois da instrução if, o programa continua sequencialmente como anteriormente. Mostra-se de seguida a possibilidade de ter o ramo opcional do if para realizar caso a condição seja falsa. A presença do ramo condicionado pelo resultado verdadeiro está sempre presente. ? Faz este ramo caso o resultado da condição seja falso Vitor Vaz da Silva – ISEL Faz este ramo caso o resultado da condição seja verdadeiro PG-D-1 Programação – Java Após a execução do if o programa continua sequencialmente na instrução seguinte. tipo="nada"; antes=1; if(tamanho >= 5) tipo="grande"; depois=2; Exemplo de um troço de código (programa). Se tamanho for maior ou igual a 5, o resultante da execução desse troço de código é: tipo contém “grande”, antes contém 1, depois contém 2. Se tamanho for menor do que 5 então ao executar esse troço de programa: tipo contém “nada”, antes contém 1, depois contém 2. No exemplo seguinte adiciona-se o ramo opcional para o caso da condição ser falsa. tipo="nada"; antes=1; if(tamanho >= 5) tipo="grande"; else tipo="pequeno"; depois=2; Se tamanho for maior ou igual a 5, o resultante da execução desse troço de código é: tipo contém “grande”, antes contém 1, depois contém 2. Se tamanho for menor do que 5 então ao executar esse troço de programa: tipo contém “pequeno”, antes contém 1, depois contém 2. O if só executa uma instrução, em qualquer um dos ramos. Por isso, sempre que se queria executar mais do que uma instrução, tem de se colocar um bloco. Um bloco é uma sequencia de uma ou mais instruções intercaladas por chavetas { … } como mostra o exemplo seguinte: tipo="nada"; antes=1; if(tamanho >= 5) { tipo="grande"; totalGrande++; } else { tipo="pequeno"; totalPequeno++; } if(totalPequeno + totalGrande >100){ fim=true; } depois=2; Vitor Vaz da Silva – ISEL PG-D-2 Programação – Java Os ciclos servem para repetir condicionalmente um troço de programa. Os ciclos presentes em Java são o while() , for() e do{ }while(). while – Este ciclo em português significa enquanto. Isto indica uma acção que é repetida até que uma determinada condição deixe de prevalecer. Ou seja, enquanto a condição for verdadeira faz as instruções que estão dentro do seu corpo. O while só efectua uma instrução, por isso terá de se colocar um bloco de instruções caso se queira delimitar as instruções a efectuar. No while a condição é verificada antes de se efectuar o corpo de instruções. Para que um while esteja correctamente escrito, é necessário assegurar que a condição de permanência do while venha a ter o valor false devido à acção das instruções do seu corpo. Quando ao avaliar a condição o valor for false o while termina. antes=1; num=5; res=1; while(num>0) { res= num* res; num--; } depois=2; No exemplo acima o corpo do while é repetido enquanto num for maior do que 0. Dentro do corpo do while a variável num está a ser modificada e por isso é possível que a condição do while venha a ser 0. Entretanto, enquanto a condição for verdadeira, são executadas as seguintes instruções: res=num*res; num--;. No fim de executar o troço de código acima, obtém-se: antes 1, num 0, res 1*5*4*3*2*1 (ou seja 120), depois 2 Outro exemplo: vezes=4; num=7; res=1; while (num-- >0) res*=2; public class Soma{ vezes++; Depois de executar o troço de código acima as variáveis têm os valores seguintes: vezes 5, num -1, res 128 (2 elevado a 7) Vitor Vaz da Silva – ISEL PG-D-3 Programação – Java do{ }while – Este ciclo tem a particularidade de primeiro fazer o corpo de instruções e só depois avaliar a condição. As chavetas são obrigatórias. A condição enquanto for verdadeira leva à repetição do corpo de instruções. Vejamos com um exemplo: inicio=2; res=3; num=0; do{ res=res+inicio; }while(num-- >0); fim=10; Ao terminar este troço de programa obtemos o seguinte nas diversas variáveis: inicio 2, res 5, num -1, fim 10 Outro exemplo: Scanner teclado = new Scanner(System.in); int num; do{ System.out.print("Escreva um valor inteiro entre 5 e 12"); num=teclado.nextInt(); }while( ! (num >=5 && num<=12) ); System.out.print("O próximo múltiplo desse valor é: " + (num*2) ); Note que a variável num não precisa de ser inicializada porque obterá sempre o valor que for digitado no teclado. A mensagem a pedir um número entre 5 e 12 será sempre escrita enquanto essa condição não se verificar. Depois é escrito um valor vezes 2, ou seja se alguém digitou 9 o resultado será 18. Observe a comparação de um while com um do{ }while e como converter um noutro e vice versa. antes_igual antes_igual corpo_igual do{ corpo_igual while( condição_igual corpo_igual } ){ } while( condição_igual ); depois_igual depois_igual Vitor Vaz da Silva – ISEL PG-D-4 Programação – Java for – Ao observarmos os ciclos while que são feitos na maior parte dos programas encontramos um conjunto de inicializações a efectuar antes do ciclo começar, depois avalia-se a condição do ciclo e por cada ciclo há um conjunto de instruções que é feito no fim de cada volta. Isto levou à criação desta instrução para facilitar a construção de ciclos semelhantes ao acabado de descrever. A instrução for contém 3 partes separadas por dois ponto-e-virgula. Esses ponto-e-virgula são obrigatórios e fazem parte integrante do for. Esta instrução é muito semelhante ao while com alguns pormenores. Vejamos com um exemplo: int i=0; for( ; i < 10 ; ){ System.out.println(i); i++; } int i=0; while( i < 10 ){ System.out.println(i); i++; } Os dois troços de programa acima executam exactamente do mesmo modo. O for tal e qual como está escrito é uma tradução exacta do while e vice-versa. Podemos preencher as duas partes em branco do for para utilizar a forma compacta do for. for(int i=0 ; i < 10 ; i++ ){ System.out.println(i); } A figura seguinte mostra o uso do for Expressões iniciais. São executadas uma for ( vez, antes de começar o primeiro ciclo. As várias expressões são separadas por vírgula. Expressões finais. São executadas sempre ; ; no final de cada ciclo (mesmo no caso de um continue) e antes da condição ser avaliada. As várias expressões são separadas por vírgula. public static void main(String [] argumentos){ Condição. Avaliada no início de cada ciclo. O ciclo é executado se o resultado for verdadeiro Corpo { Instruções que são executadas em cada ciclo. } Segue-se outro exemplo: O troço de programa escreve os 26 caracteres de á a zê. int i; int c; for(i=0, c='a' ; i<26 ; i++){ System.out.print((char) (i+c)); } Vitor Vaz da Silva – ISEL PG-D-5 ) Programação – Java Os ciclos podem ainda ter o seu fluxo controlado através das instruções break e continue. Break – Esta instrução quebra o ciclo. Isto faz com que a próxima instrução a ser executada seja aquela que está depois do ciclo. Continue – Esta instrução obriga a que o ciclo seja encurtado e salta para a avaliação da expressão. A excepção é no for em que as expressões finais que estão na terceira parte do for são sempre executadas antes da avaliação da expressão. .... while( . . . . . . ){ ....... break; ....... continue; ....... } .... .... do{ ....... break; ....... continue; ....... } while( . . . . . . ) ; .... .... for( . . . ; . . . ; . . . ){ ....... break; ....... continue; ....... } .... Há ainda duas outras instruções, return ( ); e System.exit(erro); que também afectam o fluxo de um programa. System.exit (valor); – Esta instrução termina o programa imediatamente. Só deve ser usada numa situação de erro irrecuperável. Devolve um valor que depois é apresentado ao utilizador indicando a causa do erro. Esta não é a forma correcta de terminar um programa. return (valor); – O return só pode ser utilizado dentro de um método e serve para terminar o método devolvendo o resultado (valor) do método. Os parênteses não são obrigatórios e valor pode ser uma expressão cujo resultado seja do mesmo tipo daquele declarado no método. Caso o método não devolva nada (void) então a instrução tem a forma de return; int metodoDevolveInteiro( . . . . ){ while ( . . . .) { ....... return ( 123 ); ....... } ....... . . . . . return y + 2; ....... ....... return y; } Vitor Vaz da Silva – ISEL void metodoDevolveNada ( . . . . ){ while ( . . . .) { ....... return; ....... } ....... . . . . . return; ....... ....... return; } PG-D-6