Capítulo 4 Tipos fundamentais de dados Tipos numéricos. Constantes. Expressões aritméticas Strings Leitura de dados Tipos primitivos em Java Tipo Descrição Ocupação memória int inteiro, com valor entre –2,147,483,648 . . . 2,147,483,647 4 bytes byte byte, com valor entre –128 . . . 127 1 byte short inteiro pequeno, com valor entre –32768 . . . 32767 2 bytes long inteiro longo, com valor entre –9,223,372,036,854,775,808 . . . –9,223,372,036,854,775,807 8 bytes double real de precisão dupla, com valor entre (aprox.) ±10308 e 15 casas decimais significativas 8 bytes float real de precisão simples, com valor entre (aprox.) ±1038 e 7 casas decimais significativas 4 bytes char caracter, com valor de código Unicode 2 bytes boolean booleano, com valor true ou false 1 byte Introdução à Programação 2007/08 A. Lopes Números • Pode existir ultrapassagem de capacidade int n = 1000000; System.out.println(n * n); // imprime -727379968 • Possibilidade de erros de arredondamento quando não é correcta a conversão entre números double f = 4.35; System.out.println(100 * f); // imprime 434.99999999999994 • Não é possível atribuir um valor real a uma variável inteira double balance = 13.75; int dollars = balance; // erro Introdução à Programação 2007/08 A. Lopes Conversão de números • A conversão de um valor para um tipo diferente é feita através de cast int dollars = (int) balance; // elimina a parte fraccionária • O método Math.round converte um número real no seu inteiro mais próximo long rounded = Math.round(balance); // se balance for 13.75, então o arredondamento será 14 Introdução à Programação 2007/08 A. Lopes Cast ! (typeName) expression Exemplo: (int) (balance * 100) Objectivo: Converter uma expressão numa outra de tipo diferente Introdução à Programação 2007/08 A. Lopes Atribuição, incremento e decremento incremento de uma unidade (inteira) items = items + 1; items++; ++items; decremento de uma unidade (inteira) items = items - 1; Introdução à Programação items--; 2007/08 --items; A. Lopes Operações aritméticas / • operador de divisão • se ambos os operandos são inteiros, então o resultado é inteiro (o resto é irrelevante • o resultado de 7.0 / 4 é 1.75 • o resultado de 7/4 é 1 • operador módulo (resto da divisão) • o resultado de 7%4 Introdução à Programação é % 3 2007/08 A. Lopes Métodos matemáticos em Java Classe Math Math.sqrt(x) raiz quadrada Math.pow(x, y) potência x elevado a y Math.exp(x) e elevado a x Math.log(x) logaritmo natural Math.sin(x), Math.cos(x), Math.tan(x) seno, coseno, tangente (x em radianos) Math.round(x) número mais próximo de x Math.abs(x) valor absoluto de x Math.min(x, y), Math.max(x, y) mínimo, máximo Introdução à Programação 2007/08 A. Lopes Constantes final • Uma constante define-se colocando final antes do tipo da variável • Uma constante não pode ser alterada depois de definida • A utilização de constantes torna o código mais legível. Por norma, utilizam-se letras maiúsculas final double QUARTER_VALUE = 0.25; final double DIME_VALUE = 0.1; final double NICKEL_VALUE = 0.05; final double PENNY_VALUE = 0.01; payment = dollars + quarters * QUARTER_VALUE + dimes * DIME_VALUE + nickels * NICKEL_VALUE + pennies * PENNY_VALUE; Introdução à Programação 2007/08 A. Lopes Constantes static final • Se o valor de uma constante for necessário em vários métodos da classe, então deve ser declarada juntamente com os membros de dados da classe, como estática (com static) • Por outro lado, deve também ser declarada como pública para que outras classes a possam utilizar (com public) public class MyMath { ... public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; } ... double circumference = MyMath.PI * diameter; Introdução à Programação 2007/08 A. Lopes Definição de uma constante ! No método: final typeName variableName = expression ; Na classe: accessSpecifier static final typeName variableName = expression ; Exemplo: final double NICKEL_VALUE = 0.05; public static final double LITERS_PER_GALLON = 3.785; Objectivo: Definir uma constante, num método ou numa classe Introdução à Programação 2007/08 A. Lopes Ficheiro CashRegister.java /** A cash register totals up sales and computes change due. */ public class CashRegister { ! public static final double QUARTER_VALUE = 0.25; ! public static final double DIME_VALUE = 0.1; ! public static final double NICKEL_VALUE = 0.05; ! public static final double PENNY_VALUE = 0.01; ! ! private double purchase; ! private double payment; ! /** Constructs a cash register with no money in it. ! */ ! public CashRegister() ! { ! ! purchase = 0; ! ! payment = 0; ! } ! /** Records the purchase price of an item. @param amount the price of the purchased item ! */ ! public void recordPurchase(double amount) ! { ! ! Introdução purchase =à purchase + amount;2007/08 Programação ! } A. Lopes Ficheiro CashRegister.java ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! } /** Enters the payment received from the customer. @param dollars the number of dollars in the payment @param quarters the number of quarters in the payment @param dimes the number of dimes in the payment @param nickels the number of nickels in the payment @param pennies the number of pennies in the payment */ public void enterPayment(int dollars, int quarters, ! ! int dimes, int nickels, int pennies) { ! payment = dollars + quarters * QUARTER_VALUE + dimes * DIME_VALUE ! + nickels * NICKEL_VALUE + pennies * PENNY_VALUE; } /** Computes the change due and resets the machine for the next customer. @return the change due to the customer */ public double giveChange() { ! double change = payment - purchase; ! purchase = 0; ! payment = 0; ! return change; } Introdução à Programação 2007/08 A. Lopes Ficheiro CashRegisterTester.java /** This class tests the CashRegister class. */ public class CashRegisterTester { ! public static void main(String[] args) ! { ! ! CashRegister register = new CashRegister(); ! ! ! ! ! ! ! ! ! ! register.recordPurchase(0.75); register.recordPurchase(1.50); register.enterPayment(2, 0, 5, 0, 0); System.out.print("Change="); System.out.println(register.giveChange()); ! ! ! ! ! ! } ! ! ! ! ! } register.recordPurchase(2.25); register.recordPurchase(19.25); register.enterPayment(23, 2, 0, 0, 0); System.out.print("Change="); System.out.println(register.giveChange()); Introdução à Programação 2007/08 A. Lopes Operações aritméticas final int PENNIES_PER_NICKEL = 5; final int PENNIES_PER_DIME = 10; final int PENNIES_PER_QUARTER = 25; final int PENNIES_PER_DOLLAR = 100; // Valor total em cêntimos int total = dollars * PENNIES_PER_DOLLAR + quarters * PENNIES_PER_QUARTER + nickels * PENNIES_PER_NICKEL + dimes * PENNIES_PER_DIME + pennies; // Conversão em dolares, cêntimos (com divisão inteira) int dollars = total / PENNIES_PER_DOLLAR; int cents = total % PENNIES_PER_DOLLAR; Introdução à Programação 2007/08 A. Lopes Análise de uma expressão Obs: b * b é mais eficiente do que Math.pow(b,2) Introdução à Programação 2007/08 A. Lopes Chamada de métodos estáticos • Um método estático • não opera sobre um objecto • é definido dentro de classes double x = 4; double root = x.sqrt(); // erro • Por norma, as classes começam por uma letra maiúscula e os objectos por uma letra minúscula Math System.out Introdução à Programação 2007/08 A. Lopes Chamada de um método estático ! ClassName.methodName( parameters ) Exemplo: Math.sqrt(4) Objectivo: Chamar um método estático, i.e. um método que não opera sobre um objecto, e fornecer os respectivos parâmetros Introdução à Programação 2007/08 A. Lopes Strings • Uma string é uma sequência de caracteres. São também objectos da classe String • String • constante "Hello, World!" • variável String message = "Hello, World!"; • vazia "" Introdução à Programação 2007/08 A. Lopes Operações com strings • Comprimento da string int n = message.length(); • Concatenação, utilizando o operador + String name = "Dave"; String message = "Hello, " + name; // message é "Hello, Dave" • se um dos operandos é uma string, então o outro operando é convertido automaticamente a string String cop = "Agent"; int n = 7; String bond = cop + n; // bond é Agent7 • exemplo de utilização na escrita para o ecrã int total = 7; System.out.println("The total is " + total); Introdução à Programação 2007/08 A. Lopes Conversão entre strings e números int n = Integer.parseInt(str); string para número int m = Integer.valueOf(str); double x = Double.parseDouble(str); String str = "" + n; número para string str = Integer.toString(n); Introdução à Programação 2007/08 A. Lopes Substrings 1ª posição posição inicial posição após o fim String greeting = "Hello, World!"; String sub = greeting.substring(0, 5); // sub é "Hello" o comprimento de uma substring é a diferença entre posição após o fim e a posição inicial Introdução à Programação 2007/08 A. Lopes Caracteres de controlo Tipo Descrição \” Escreve “ \’ Escreve ‘ \\ Escreve \ \n Nova linha (passa para o início da linha seguinte) \r Enter (passa para o início da linha actual) \t Tab Introdução à Programação 2007/08 A. Lopes Leitura de valores • De forma análoga a System.out, existe também System.in . Acontece que as funcionalidades neste caso são mínimas. Só consegue ler um byte de cada vez. Actualmente, existe a classe Scanner para ler do teclado de uma forma conveniente • nextInt para ler um inteiro import java.util.Scanner; • nextDouble para ler um double • nextLine para ler uma linha (até Enter, que é desprezado) • next para ler uma palavra (até qualquer delimitador inclusive espaço em branco) Scanner in = new Scanner(System.in); System.out.print("Enter quantity: "); Para começar a ler ... Introdução à Programação int quantity = in.nextInt(); 2007/08 A. Lopes Ficheiro InputTester.java import java.util.Scanner; public class InputTester { ! public static void main(String[] args) ! { ! ! Scanner in = new Scanner(System.in); ! ! DataSet data = new DataSet(); ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! } ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! } boolean done = false; while (!done) { ! System.out.print("Enter value, Q to quit: "); ! String input = in.next(); ! if (input.equalsIgnoreCase("Q")) ! ! done = true; ! else ! { ! ! double x = Double.parseDouble(input); ! ! data.add(x); ! } } if (data.getCount() == 0) ! System.out.println("No numbers have been entered."); else { ! System.out.println("Average = " + data.getAverage()); ! System.out.println("Maximum = " + data.getMaximum()); } Introdução à Programação 2007/08 A. Lopes Leitura a partir de uma caixa de diálogo import javax.swing.JOptionPane; String input = JOptionPane.showInputDialog(prompt) • Se necessário, converte-se a string para número int count = Integer.parseInt(input); double x = Double.parseDouble(input); • Não esquecer de colocar System.exit(0) antes de chaveta que termina o método main de qualquer programa que utilize JOptionPane Introdução à Programação 2007/08 A. Lopes