Programação – JAVA Unidade 2 – Dados, Variáveis e Cálculos Prof. Aparecido V. de Freitas Mestre e Doutorando em Engenharia da Computação pela EPUSP 1 Nomes de Variáveis • São os identificadores. • Podem ser de qualquer tamanho. • Devem começar com uma letra, ou underscore (_) ou o sinal de dolar ($). • O restante pode incluir quaisquer caracteres exceto aqueles usados como operadores (+, -, *). • Java é sensitive case. • Não podem ser keywords (nomes que são essenciais para a linguagem Java). 2 Tipos Primitivos • São os tipos fundamentais. • Em Java não são considerados classes, apenas tipos básicos. • Correspondem a byte, short, int, long, float, double, char e boolean. 3 Tipos de dados inteiros • • • • byte (1 byte) short (2 bytes) int (4 bytes) long (8 bytes) 4 Valores Inteiros • Literais inteiros são int por default. • Assim, 1, -9999 e 123456789 são todos literais do tipo int. • Literais do tipo long, são definidos acrescentando-se um L ao final do literal. Os valores 1L, -9999L e 123456789L são todos do tipo long. • Não é permitido a definição de literais do tipo short ou byte. • Literais inteiros também podem ser definidos de forma hexadecimal. Ex. 0x100, 0x1234, 0xCAB. 5 Exemplos • • • • long bigOne; long bigOne = 29999999L; long bigOne=99999L, largeOne= 10000000L; int miles =0, fur =0, feet=0; 6 Ponto Flutuante • float • double (4 bytes) (8 bytes) 7 Valores Ponto Flutuante • Literais ponto flutuante são double por default. • Assim, 1.0 e 345.768 são ambos do tipo double. • Literais do tipo float são especificadas acrescentando-se um F ao final do literal. • Assim, 1.0F e 345.678F são constantes literais do tipo float. 8 Valores muito grandes ou muito pequenos • • A distância da Terra ao Sol é de 149600000 kilômetros. Em Java poderíamos definir por: double sunDistance = 1.496E8; A massa de um elétron é 0.0000000000000000000000000009 gramas. Em Java poderíamos definir float eletronMass = 9E-28F; 9 Cálculos Aritméticos • • • numFruit = numApples + numOranges; numApples = numApples + 1; a = b = c = 777; 10 Atribuições • • • Atribuições de valores constantes para variáveis do tipo byte ou short, causam armazenamento da variável com o tipo à esquerda do sinal de =. Exemplo: short value = 0; value = 10; Neste caso, 10 será armazenado numa área de 2 bytes e em seguida será copiado para a variável value. 11 Exemplo import java.io.IOException; // For code that delays ending the program public class Exerc_03 { public static void main(String[] args) { // Declare and initialize three variables int numOranges = 5; int numApples = 10; int numFruit = 0; // Increment oranges and calculate the total fruit numFruit = ++numOranges + numApples; System.out.println("A totally fruity program"); // Display the result System.out.println("Value of oranges is " + numOranges); System.out.println("Total fruit is " + numFruit); 12 Exemplo // Code to delay ending the program System.out.println("(press Enter to exit)"); try { System.in.read(); // Read some input from the keyboard } catch (IOException e) // Catch the input exception { return; // and just return } } } 13 Produzindo saída • System.out.println(“....texto....”); É um método do objeto out Variável static na classe System Nome da classe que contêm o objeto out Como o objeto é static, ele existirá mesmo se não houver objetos do tipo System. 14 Resto e Divisão inteira int numFruit = 0; numFruitEach = numFruit / 4; int remainder = 0; remainder = numFruit % 4; Ao dividirmos um inteiro por outro, o resto é descartado, de forma que o resultado também sempre será um inteiro. O operador modulus (%) deverá ser usado para se obter o resto. 15 Operador incremento e decremento int count = 10; ++count; // Add 1 to count --count; // Subtract 1 from count Uma grande vantagem dos operadores incremento e decremento é que podemos usá-los em uma expressão. 16 Operador incremento e decremento int x = 5; int y = 10; int z = 0; z = ++x + y; // z = 16 , x = 6 17 Operador incremento e decremento int x = 5; int y = 10; int z = 0; z = x++ + y; // z = 15 , x = 6 18 Computação com inteiros shorter • O resultado de operações aritméticas do tipo int são processadas em valores inteiros de 32 bits. • Expressões usando variáveis do tipo short ou byte também são executadas da mesma forma, ou seja o resultado será expresso em inteiros de 32 bits. 19 Computação com inteiros shorter short x =5; short y =10; short z =0; z = x + y; Execute o programa acima e verifique se o mesmo irá compilar !!! 20 Computação com inteiros shorter • No exercício anterior, como a expressão x + y produz um resultado de 32 bits, o compilador não irá conseguir armazenar este valor em z, uma vez que z tem 16 bits (short). O que fazer então ? ? ? 21 Casting short x =5; short y =10; short z =0; z = short (x + y); O compilador irá converter a expressão aritmética para 16-bits. 22 Computação com inteiros long • Uma operação aritmética envolvendo um valor do tipo long sempre produzirá resultados em 64-bits. • Se algum outro valor na expressão não for do tipo long, então ele será convertido (casting) para long antes da operação. 23 Casting long result =0; long fator =10L; int numero =5; result = fator * numero; Como a multiplicação produzirá resultado em 64 bits, o valor armazenado em numero será convertido para long. 24 Exemplo public class AverageFruit { public static void main(String args[]) { // Declare and initialize three variables double numOranges = 50.0E-1; double numApples = 1.0E1; double averageFruit = 0.0; averageFruit = (numOranges + numApples) / 2.0; System.out.println("A totally fruity program"); System.out.println("Average fruit is " + averageFruit); } } 25 Exemplo public class AverageFruit { public static void main(String args[]) { // Declare and initialize three variables double numOranges = 50.0E-1; double numApples = 1.0E1; double fruitTypes = 0.0; double averageFruit = 0.0; averageFruit = (numOranges + numApples) / fruitTypes; System.out.println("A totally fruity program"); System.out.println("Average fruit is " + averageFruit); } } 26 Exemplo public class AverageFruit { public static void main(String args[]) { // Declare and initialize three variables double numOranges = 50.0E-1; double numApples = 1.0E1; double fruitTypes = 0.0; double averageFruit = 0.0; averageFruit = (numOranges - 5.0)/(numApples - 10.0); System.out.println("A totally fruity program"); System.out.println("Average fruit is " + averageFruit); } } 27 Operador % p/Ponto Flutuante • Podemos aplicar o operador % para valores em ponto flutuante. • floatoper1 % floatoper2 • O resultado será o resto em ponto flutuante após dividir floatoper1 por floatoper2 num inteiro de vezes. • Assim, a expressão 12.6 % 5.1 dará como resultado 2.4. 28 Expressões aritméticas mistas • As regras em seqüência devem ser checadas: • Se algum operador for do tipo double, os outros serão convertidos para double antes da operação ser executada. • Se algum operador for do tipo float, os outros serão convertidos para float antes da operação ser executada. • Se algum operador for do tipo long, os outros serão convertidos para long antes da operação ser executada. 29 Expressões aritméticas mistas • Se nenhum operando for do tipo double, float ou long, eles devem ser do tipo int, short ou byte e assim, utilização 32 bits para as operações aritméticas. 30 Casting explícito double result; int three = 3; int two = 2; result = 1.5 + three / two; // result = 2.5 result = 1.5 + (double) (three/two); // result =3.0 Casting explícito 31 Casting automático • Quando o tipo do resultado de uma expressão do lado direito de uma atribuição for diferente do tipo da variável à esquerda, um cast automático será aplicado. • Haverá a possibilidade de perda de informação. • A seqüência aplicada será: byte -> short -> int -> long -> float -> double • Se você quiser ir em direção oposta, então um cast explícito deverá ser aplicado. 32 op= count +=5; // count = count +5; result /= a % b / (a+b); /* result = result / (a%b(a+b); 33 Funções matemáticas e constantes • Disponíveis no pacote java.lang e, portanto, acessadas automaticamente pelo programa. • Os métodos são implementados na classe Math como métodos static, e portanto, podem ser diretamente acessadas por Math.metodo. • Exemplo: Math.sqrt(aNumero) para produzir o valor em ponto flutuante da raiz quadrada de aNumero. 34 Exemplo public class Exerc_04 { public static void main(String[] args) { // Calculate the radius of a circle // which has an area of 100 square feet double radius = 0.0; double circleArea = 100.0; int feet = 0; int inches = 0; radius = Math.sqrt(circleArea/Math.PI); feet = (int)Math.floor(radius); // Get the whole feet and nothing but the feet inches = (int)Math.round(12.0*(radius - feet)); System.out.println("The radius of a circle with area " + circleArea + " square feet is\n " + feet + " feet " + inches + " inches"); } } 35 Armazenando Caracteres • Variáveis do tipo char armazenar um caractere simples. • Cada caractere ocupa 16 bits, pois Java armazena em Unicode. char myCaracter = 'x'; 36 Caracteres Escape • Forma alternativa de se especificar um caractere pelo seu código. char myCaracter = '\u0058'; Código Unicode para a letra X 37 Caracteres Escape • • • • • \b \f \n \r \t Backspace Form Feed New Line Carriage Return Tab 38 Aritmética de Caracteres • Podemos executar operações aritméticas com variáveis do tipo char. char var = 'X'; var+=1; • O resultado em var será 'Y'. • Podemos usar variáveis do tipo char em expressões aritméticas, e seus valores serão convertidos para tipo int. char aChar = 0; char bChar = '\u0028' aChar = (char)(2 * bChar + 8); // aChar = 0x0058 39 Operações Bitwise • Variáveis inteiras são representadas internamente como números binários. • Um valor do tipo int consiste de 32 dígitos binários, conhecidos por bits. • Podemos operar nos bits dos valores inteiros usando os operadores bitwise. 40 Operadores Bitwise & | ^ ~ AND OR OR EXCLUSIVE (XOR) COMPLEMENT 41 Operadores Bitwise & | ^ ~ AND (1 se ambos forem 1) OR (0 se ambos forem 0) XOR (0 se bits forem iguais) COMPLEMENT (1 se 0; 0 se 1) 42 Operadores Bitwise i = 0xFF07; var = i & 0x4; i 0xFF07 1111 1111 0000 0111 mask 0x4 0000 0000 0000 0100 i & 0x4 0x0004 0000 0000 0000 0100 43 Operadores Bitwise i = 0xFF09; var = i & 0x4; i 0xFF09 1111 1111 0000 1001 mask 0x4 0000 0000 0000 0100 i & 0x4 0x0000 0000 0000 0000 0000 44 Operadores Bitwise i = 0xFF09; var = i | 0x4; i 0xFF09 1111 1111 0000 1001 mask 0x4 0000 0000 0000 0100 i | 0x4 0xFF0D 1111 1111 0000 1101 45 Operadores Bitwise i = 0xFF07; i &= ~0x4; i 0xFF07 1111 1111 0000 0111 mask 0x4 0000 0000 0000 0100 ~mask 0xFFFB 1111 1111 1111 1011 i=i & (~0x4) 0xFF03 1111 1111 0000 0011 46 Operadores Bitwise a = 0xFF07; b = 0xABAD; a^b; a 0xD00F 1101 0000 0000 1111 b 0xABAD 1010 1011 1010 1101 a^b 0x7BA2 0111 1011 1010 0010 a=a ^b 0x7BA2 0111 1011 1010 0010 47 Operações de Shift << Shift Left, preenche com zeros a partir da direita >> Shift Right, propaga bit de sinal a partir da esquerda >>> Shift Right,preenche com zeros a partir da esquerda 48 Variáveis Booleanas boolean state = true; boolean state = false; 49 Comentários /********************************* * Este eh um comentario * * da Linguagem Java * * para os alunos do Imes * *********************************/ 50 Operadores são semelhantes ao C++ • Aritméticos – binários: +, -, *, / e % (+ entre strings) – unários: + e - e ainda os prefixos e sufixos ++, -• Relacionais: >, <, ==, <=, >=, !=,instanceof • Condicionais: &&, ||, !, ?: • Bit a bit: >>, <<, &, |, ^, ~, >>> • Afectação: =, +=, -=, *=, etc. • Especiais: [], (param), ., new, (type) • Mas não permite a sobrecarga de operadores 51 Prioridade e associatividade dos operadores • As regras de prioridade e de associatividade dos sufixos [] . (arg) ++ operadores são prefixos ++ -- - + ~ ! semelhantes ao C++. • Todos os operadores binários, excepto os de afectação, são associativos à esquerda. • A prioridade é a indicada na tabela. tipo aritméticos shift relacionais igualdade bit a bit lógicos ternários afectação -- new (type) {* / %} {+ -} >> << >>> > < >= <= instanceof == != {&} {^} {|} {&&} {||} ?: = += *= >>= etc. 52