Variáveis primitivas e Controle de fluxo Material baseado na apostila FJ-11: Java e Orientação a Objetos do curso Caelum, Ensino e Inovação, disponível para download em http://www.caelum.com.br/apostilas/ 1 Objetivos • Aprender a trabalhar com os seguintes recursos da linguagem Java – declaração, atribuição de valores, casting e comparação de variáveis; – controle de fluxo através de if e else; – instruções de laço for e while, controle de fluxo com break e continue. 2 Declarando e usando variáveis • Podemos declarar variáveis dentro de blocos (trechos de código delimitados por { ... } ) • Em Java toda variável tem um tipo, que não pode ser mudado uma vez declarado; int idade; • As variáveis declaradas podem agora receber valores idade = 15; 3 Comentários em Java • Um comentário – algo usado para documentar parte do código – nao faz parte do programa propriamente dito. Usado com o propósito de documentação – é uma boa prática de programação incluir comentários em seu código public class Alo { /* * Meu primeiro programa Java */ … } 4 Comentários em Java • A linha em vermelho a seguir é também um comentário Java public class Alo { /** * Meu primeiro programa Java */ public static void main(String[] args) { // imprime a String Alo mundo na tela … } … } 5 Declarando e usando variáveis • As variáveis, uma vez inicializadas, podem ser utilizadas em comandos de saída, cálculo de expressões, etc. public class Alo { public static void main(String[] args) { // declara a idade int idade = 15; // usa idade em uma expressão idade = idade + 1; // imprime a idade System.out.println(idade); } } 6 Operadores aritméticos em Java Operador Uso Descrição + op1 + op2 Soma op1 e op2 * op1 * op2 Multiplica op1 por op2 / op1 / op2 Divide op1 por op2 % op1 % op2 Calcula o resto da divisão inteira de op1 por op2 - op1 – op2 Subtrai op2 de op1 7 Operadores aritméticos: Exemplo class OperadoresAritmeticos { public static void main(String[] args) { // alguns numeros int i = 37; int j = 42; System.out.println("Valor das variaveis..."); System.out.println(" i = " + i); System.out.println(" j = " + j); // somando numeros System.out.println("Somando..."); System.out.println(" i + j = " + (i + j)); // subtraindo numeros System.out.println("subtraindo..."); System.out.println(" i - j = " + (i - j)); ... 8 Operadores aritméticos: Exemplo ... // multiplicando numeros System.out.println("multiplicando..."); System.out.println(" i * j = " + (i * j)); // dividindo numeros System.out.println("dividindo..."); System.out.println(" i / j = " + (i / j)); // resto da divisao inteira System.out.println("Calculand0 o resto..."); System.out.println(" i % j = " + (i % j)); } } 9 Variáveis de tipo primitivo • Além das variáveis de tipo inteiro, podemos ainda declarar variáveis para armazenar números reais (números com casas decimais), valores booleanos (verdadeiro ou falso) e caracteres. // variáveis double double pi = 3.14; // variáveis boolean int idade = 30; boolean menorDeIdade = idade < 18; // variáveis char char letra = ’a’; 10 Tipos primitivos e valores • Variáveis de tipo primitivo (int, double, boolean, char, etc.) armazenam o dado em seu espaço de armazenamento (a pilha ou stack) j 5 i 5 6 stack 11 Casting e promoção • Algumas atribuições entre variáveis de tipos diferentes são incompatíveis. • Nem mesmo o código a seguir compila: 12 Casting e promoção • Se tivermos certeza que o número real “cabe” em uma variável inteira, podemos fazer um cast para evitar o erro de compilação. • O número real é truncado antes da atribuição à variável inteira. 13 Casting e promoção • Casts são usados também para obter a parte fracionária da divisão de números inteiros 14 Tamanhos dos tipos • A tabela a seguir mostra o tamanho em bytes de cada tipo primitivo em Java: • Para tipos numéricos, um número maior de bytes implica na capacidade de armazenar números maiores. 15 Estruturas de Controle • Estruturas de Controle – • Permitem alterar a ordem na qual os comandos em nossos programas são executados Dois tipos de Estruturas de Controle – estruturas de controle de decisão • – permitem selecionar trechos específicos de código para serem executados estruturas de controle de repetição • permitem executar trechos específicos de código repetidas vezes 16 Estruturas de Controle de Decisão • Estruturas de controle de decisão – • Comandos Java que permitem selecionar e executar trechos específicos de código e pular outros trechos de código. Tipos – comando if – comando if-else – comando if-else-if 17 O comando if • O comando if – • especifica que um comando (ou um bloco de comandos) será executado se e somente se uma certa condição booleana for verdadeira Comandos if têm a forma: if (expressão_booleana) comando; ou if (expressão_booleana) { comando1; comando2; } onde: expressão_booleana é qualquer expressão que retorna true ou false 18 Fluxograma do comando if 19 Exemplo 1 20 Exemplo 2 21 Dicas de programação • A expressão booleana do comando if tem sempre de resultar em um valor booleano. Isto é, a avaliação da condição deve sempre resultar em um valor true ou false. • Idente os comandos dentro de um bloco if Exemplo, 22 O comando if-else • O comando if-else – • Usado quando queremos executar um comando se uma condição for verdadeira e um diferente comando se a condição for falsa O comando if-else tem a forma 23 Fluxograma 24 Exemplo 1 25 Exemplo 2 26 Dicas de Programação 1. Para evitar confusão, sempre coloque o comando (ou comandos) de um bloco if ou if-else dentro de chaves {} 2. Você pode usar blocos if-else aninhados. Isto significa que você pode ter outros blocos if-else dentro de um bloco if-else Exemplo: 27 O comando if-else-if • O comando na cláusula else de um bloco if-else pode ser uma outra estrutura if-else • Este encadeamento de estruturas nos permite fazer seleções mais complexas. • O comando tem a forma: 28 Exemplo 29 Operadores lógicos • Você pode concatenar expressões booleanas através dos operadores lógicos E (&&) e OU (||) 30 Operadores lógicos • Este código pode ficar mais legível utilizando-se o operador de negação (!) 31 Operadores Relacionais • • Operadores relacionais comparam dois valores e determinam o relacionamento entre esses valores. O resultado da comparação é um valor booleano true ou false Operador Uso Descrição > op1 > op2 op1 é maior do que op2 >= op1 >= op2 op1 é maior do que ou igual a op2 < op1 < op2 op1 é menor do que op2 <= op1 <= op2 op1 é menor do que ou igual a op2 == op1 == op2 op1 e op2 são iguais != op1 != op2 op1 e op2 são diferentes 32 Erros comuns 1. A condição no bloco if não resulta em um valor booleano. Exemplo, a variável numero não é do tipo boolean 2. Escrever elseif ao invés de else if 33 Erros comuns 3. Usar = ao invés de == para comparações Exemplo: isto deveria ter sido escrito como, 34 O comando switch • switch – • permite a ramificação em múltiplas alternativas O comando switch tem a forma: 35 O comando switch • onde: – expressao_avaliada • – uma expressão inteira ou caractere seletor1, seletor2, etc. • constantes inteiras ou caractere 36 O comando switch • Quando um switch é encontrado, – A expressão expressao_avaliada é avaliada e o fluxo é desviado para o case cujo seletor é igual ao valor da expressão – O programa executa em seqüência os comandos, desde este ponto até que um comando break seja encontrado, pulando então para o primeiro comando após o fim da estrutura switch – Se nenhum dos cases for satisfeito, o bloco default é executado. Observe no entanto, que o bloco default é opcional 37 O comando switch • Observações – De forma diversa ao comando if, não é necessário delimitar por chaves os blocos de instruções no comando switch. – Quando o valor no case é igual ao valor da expressão, todos os comandos no case são executados. E não apenas isso, os comandos associados aos cases seguintes são também executados. – Para impedir o programa de executar os comandos nos cases subseqüentes, usamos o comando break como último comando de um bloco. 38 Exemplo 39 Dicas de Programação • Decidir quando usar um comando if ou um switch é uma decisão sua. Você pode decidir qual deles usar baseado na legibilidade e em outros fatores. • Um comando if pode ser usado para tomar decisões baseadas em uma faixa de valores ou condições, enquanto que um comando switch tem de tomar decisões baseadas apenas em um único valor inteiro ou caractere. Além disso, o valor em cada bloco case tem de ser único. 40 Estruturas de Controle de Repetição • Estruturas de controle de repetição – • comandos Java que permitem-nos executar blocos específicos de código repetidas vezes. Tipos: – laço while – laço do-while – laço for 41 O laço while • O laço while – • comando, ou bloco de comandos, repetidos enquanto uma condição é verdadeira. O laço while tem a forma: – Os comandos no interior do laço while são executados enquanto a expressao_booleana for verdadeira 42 Exemplo 1 43 Exemplo 2 44 Exemplo 3 45 Laço do-while • Laço do-while – similar ao laço while – os comandos no interior do laço do-while são executados várias vezes, enquanto a condição for verdadeira – a principal diferença entre um laço while e um laço do-while: • • os comandos no interior de um laço do-while são executados pelo menos uma vez. O laço do-while tem a forma: 46 Exemplo 1 47 Exemplo 2 48 Exemplo 3 49 Dicas de Programação 1. Um erro comum de programação ao usar o laço do-while é esquecer de escrever o ponto e vírgula depois da expressão do while 2. Assim como no caso dos laços while, esteja certo de que seus laços do-while são finitos, isto é, que eles vão terminar em algum momento. 50 O laço for • O laço for – • permite a execução do mesmo código repetidas vezes. O laço for tem a forma: – onde, • inicializacao – inicializa a variável de controle do laço • condição – compara a variável de controle com algum valor limite • incremento – atualiza a variável de controle 51 Exemplo • O código acima é equivalente ao seguinte laço while, 52 Operadores de Incremento e Decremento • Operador de incremento unário (++) • Operador de decremento unário (--) • Os operadores de incremento e decremento aumentam ou diminuem de uma unidade o valor armazenado em uma variável. • Exemplo: é equivalente a: 53 Operadores de Incremento e Decremento Operador Uso Descrição ++ op++ Incrementa op de 1; na avaliação da expressão, usa o valor de op antes do incremento. ++ ++op Incrementa op de 1; na avaliação da expressão, usa o valor de op depois do incremento. -- op-- Decrementa op de 1; na avaliação da expressão, usa o valor de op antes de decremento. -- --op Decrementa op de 1; na avaliação da expressão, usa o valor de op depois do decremento. 54 Operadores de Incremento e Decremento • Os operadores de incremento e decremento podem ser colocados antes ou depois de um operando. • Quando usado antes de um operando, ele faz com que a variável seja incrementada ou decrementada por 1 e então o novo valor é usado na expressão onde a variável aparece. • Exemplo: 55 Operadores de Incremento e Decremento • Quando os operadores de incremento e decremento são colocados após o operando, o valor antigo da variável é usado na expressão onde eles aparecem. • Exemplo: 56 Operadores de Incremento e Decremento: Dicas de Codificação • Procure sempre manter as expressões contendo operadores de incremento e decremento simples e fáceis de entender. 57 Comandos de Redirecionamento • Comandos de redirecionamento nos permitem modificar o fluxo de execução do programa. • Java oferece três comandos de redirecionamento – break – continue – return 58 O comando break • break – Termina o comando switch onde ele está inserido. O fluxo de controle é transferido para o comando imediatamente seguinte ao switch – Pode ser usado também para terminar um laço for, while ou dowhile 59 Exemplo 60 O comando continue • O comando continue – pula para o fim do laço mais interno e avalia a expressão booleana que controla o laço, basicamente pulando o restante da iteração corrente do laço 61 Exemplo 62 O comando return • O comando return – Usado para sair do método corrente – O fluxo de controle retorna para o comando seguinte à chamada original do método 63 O comando return • Para retornar um valor – Simplesmente ponha o valor (ou uma expressão que calcula o valor) depois da palavra reservada return – Exemplo, return ++conta; ou return "Alo"; – O tipo do dado retornado pelo return deve corresponder ao tipo do valor de retorno declarado para o método 64 O comando return • Quando um método é declarado void, você pode usar apenas o return que não retorna um valor; – • Exemplo, return; Falaremos mais sobre o comando return mais tarde, quando virmos métodos. 65 Escopo de uma variável 66 Escopo de uma variável • • Escopo – Determina em que pontos do programa a variável é acessível – Determina o tempo de vida de uma variável, isto é, durante quanto tempo a variável existe em memória – O escopo é determinado pelo local onde a declaração da variável é colocada no programa Para simplificar as coisas, pense no escopo como algo no interior das chaves {...}. O código no interior das chaves é chamado de um bloco de código. 67 Escopo de uma variável • O escopo de uma variável é: – O interior do bloco onde ela foi declarada, começando do ponto onde ela foi declarada 68 Exemplo A C B E D 69 Exemplo • O código no slide anterior apresenta cinco escopos diferentes indicados pelas linhas e pelas letras • Dadas as variáveis i, j, k, m e n e os escopos A, B, C, D, e E, temos os seguintes escopos para cada variável: – O escopo da variável i é A – O escopo da variável j é B – O escopo da variável k é C – O escopo da variável m é D – O escopo da variável n é E 70 Escopo de uma variável • Ao declarar variáveis, somente uma variável com um dado identificador ou nome pode ser declarada em um escopo. • Isto significa que, se você tiver a declaração: { int teste = 10; int teste = 20; } o compilador Java gerará um erro uma vez que você deveria ter nomes únicos para as suas variáveis em um bloco 71