Programação I Aula 3 (Entrada de Dados) Prof. Gilberto Irajá Müller Última atualização 11/3/2009 Métodos que retornam valor • Quando um método termina sua execução, ele devolve o controle da máquina para o método que o chamou. Além disso, um método pode, neste momento, devolver junto um valor • Para que um método devolva um valor: • na sua declaração, a palavra void deve ser substituída pelo tipo do valor a ser devolvido pelo método • no bloco de código do método deve haver pelo menos um comando return expressão; • a chamada do método deve ser feita no lugar onde caberia colocar um valor do tipo que ele retorna Métodos que retornam valor • Sintaxe • return expressão; (está relacionando com o tipo de retorno do método) • return; (sair imediatamente do programa, retornando o valor nulo correspondente ao tipo de dado • Normalmente, encontramos nos métodos “getters” Pessoa p1 = new Pessoa(); p1.setNome(“João da Silva”); System.out.println(p1.getNome()); // uso do return • Implementação do método getNome() Public String getNome() { return nome; } Métodos que retornam valor • Podemos alterar o método exibeDados() da nossa classe Pessoa, utilizando os métodos de retorno (getters): public void exibeDados() { System.out.println(“Nome: “ + getNome()); System.out.println(“Peso: “ + getPeso()); System.out.println(“Altura: “ + getAltura()); System.out.println(“Idade: “ + getIdade()); } • Podemos utilizar o método de retorno na classe TestaPessoa, conforme exemplo a seguir: public class TestaPessoa{ public static void main(String args[]) { Pessoa p1 = new Pessoa(“João da Silva”, 1.80, 80.0, 30); System.out.println(“Nome da pessoa é: “ + p1.getNome()); } } Métodos que retornam valor • Exercício. Desenvolva o diagrama de classes (UML) e implemente os métodos “getters”. Após isso, crie a classe teste e instancie objetos, bem como a visualização dos seus dados utilizando o System.out.println + getter. • A classe em questão é o usuário do MSN, ou seja, temos um usuário (que é o e-mail) e sua senha. Após isso, identifique alguns atributos desta classe de forma a gerar os métodos “getters”. Entrada de dados • Até o momento, apenas visualizamos a saída de dados e alteramos os • atributos de nossos objetos diretamente no código fonte Então, vamos criar uma classe chamada TestaPessoa que permiterá entrar com os dados via teclado e, após isso, criar o objeto com os dados digitados pelo teclado • Nossa classe de leitura do teclado (Teclado.java) possui três métodos: • • • • public int leInt() public double leDouble() public String leString() Os métodos acima são VOID? Porque? • Precisaremos instanciar a classe Teclado.java (será fornecida pelo professor). • Teclado t = new Teclado(); Entrada de dados • Exercício. Como ficaria nossa classe TestaPessoa solicitando os dados: nome, altura, peso e idade? Entrada de dados • Exercício. Altere a classe Pessoa e inclua dois métodos: • private double calculaIMC() • public double getIMC() • Detalhe: Solicite o nome, peso e altura para o cálculo. O cálculo do IMC é feito através do peso / (altura2) Entrada de dados (com mensagem) • Aprendemos que a classe teclado possui três métodos para leitura de tipos de diferentes (int, double e String) • Contudo, nos exemplos anteriores, foi necessário colocar uma mensagem antes da solicitação do valor do atributo • Podemos utilizar os seguintes métodos que possuem a mensagem ao ser solicitada a entrada do valor do atributo: • public int leInt(String msg); • public double leDouble(String msg); • public String leString(String msg); Entrada de dados (com mensagem) • Exercício. Como ficaria a nossa classe TestaPessoa ao ser calculado o IMC utilizando os métodos de entrada de dados com mensagem? Entrada de dados (com mensagem) • Exercício. Como não utilizar as variáveis locais? Até mesmo o objeto “p1” para o método exibeDados? Explique os problemas futuros na implementação Expressões Aritméticas • De forma indireta já estamos utilizando expressões aritméticas, em qual momento? Expressões Aritméticas • Tipos de dados • Inteiros correspondem aos números NATURAIS • Números com casas decimais ou ponto flutuante correspondem aos números REAIS Expressões Aritméticas • Números Inteiros: • Java interpreta um número escrito sem ponto decimal como int. Se o valor extrapolar os limites do tipo int, será tratado como inteiro muito grande e dará erro de compilação. Para armazenar um inteiro como long, devemos adicionar o sufixo L ou l ao número. • Ex: • 1147465 é tratado como int, pois está na faixa do tipo int; • 1147465L é tratado como long, devido ao sufixo; • 3000000000 dá o erro de compilação integer number too large. Expressões Aritméticas • Exercício • Complete as linhas seguintes: • • • • -5 é tratado como _____________ -34567890987 é tratado como _____________________ -5L é do tipo _____________ "50" é do tipo ____________ Expressões Aritméticas • Números de ponto flutuante • Em Java, número com ponto decimal é tratado como double. • Caso o valor estiver numa faixa viável ao tipo float, podemos usar o sufixo F ou f para que ele seja tratado • O sufixo D ou d também pode ser usado para informar ao compilador que desejamos tratá-lo como double. • Ex: • • • • • 3.1415 é tratado como double; 3.1415F é float; 3.141524357576575789 é tratado como double; 3.141592837646473637F será um float; 4D será um double, que valerá 4.0; Expressões Aritméticas • Exercício. • Complete as seguintes linhas: • • • • -1837469382988983909.7 é do tipo _________ -456.678787997907575796795797F é __________ 5F é __________ “5F” é do tipo _________ Expressões Aritméticas • O tipo primitivo char • O tipo primitivo char corresponde a um único caractere (Unicode) escrito entre apóstrofos, que ocupa espaço de dois bytes no seu armazenamento. Ex: 'a', 'M', '+', '?‘ • Uma variável pode ser do tipo char. • Ex: char c = 'C'; • Caracteres de escape • Representam caracteres especiais que podem ser atribuídos às variáveis do tipo char e String, ou podem fazer parte de um string. Expressões Aritméticas • Caracteres de escape Expressões Aritméticas • Classe que demonstra o limite de cada tipo de dado • public class testaTipoDado { public static void main(String[] args) { System.out.println("Tipos de dados em Java: \n" + "\nMenor Byte: " + Byte.MIN_VALUE + "\nMaior Byte: " + Byte.MAX_VALUE + "\nMenor Short Int: " + Short.MIN_VALUE + "\nMaior Short Int: " + Short.MAX_VALUE + "\nMenor Int: " + Integer.MIN_VALUE + "\nMaior Int: " + Integer.MAX_VALUE + "\nMenor Long: " + Long.MIN_VALUE + "\nMaior Long:" + Long.MAX_VALUE + "\nMenor Float: " + Float.MIN_VALUE + "\nMaior Float: " + Float.MAX_VALUE + "\nMenor Double: " + Double.MIN_VALUE + "\nMaior Double: " + Double.MAX_VALUE); } } Expressões Aritméticas • Conversão entre tipos de dados • Conversão implícita • É permitido converter qualquer tipo abaixo para um que esteja à sua esquerda, sem qualquer artifício, e sem perda de precisão: • double <- float <- long <- int <- short <- byte • Exemplo: long x = 12678; double dd = x; // dd ficará com 12678.0 byte y = -2; short s = y; // s assumirá valor -2 int i = y; // i ficará com -2 Expressões Aritméticas • Conversão explícita (Coerção ou cast). • Usa-se um conversor (ou cast), que é a colocação do tipo de destino entre parênteses antes do valor a ser convertido • Ex: double dd = 6.789; int ii = (int) dd; // ii guardará o valor 6, pois a conversão descarta a parte decimal short s = (short) ii; //s guardará 6 – não houve perda nenhuma byte b = (byte) 6.7; //perde-se a parte decimal short s = (short) 50000; // CUIDADO – como o tipo short não comporta 50000, será atribuído um valor aleatório a s – erro que não é acusado pelo sistema Expressões Aritméticas • Operadores aritméticos básicos • Na ordem decrescente de prioridade dentro de uma expressão aritmética: • 1º. ) * (multiplicação) / (divisão) % (módulo, ou resto da divisão inteira) • 2º. ) + (adição) - (subtração) • Ex: x * y • 7/n • m % n // resto da divisão inteira de m por n Expressões Aritméticas • Regras importantes • Geralmente, a operação resulta um tipo que é grande o • • • • suficiente para conter o resultado. Por exemplo, multiplicando um float por um int obtém-se um float. • Ex: 4F * 2 resulta 8.0F O resultado da divisão de dois inteiros é sempre inteiro. • Ex: 7 / 2 resulta 3. A presença de um float ou double na expressão, causa um resultado float ou double. • Ex: 7F / 2 resulta 3.5. Quando há mais de um operador, as regras de prioridades serão respeitadas. • Ex: 4 + 7 / 2 resultará 7, pois a divisão é feita antes da adição. Subexpressões entre parênteses terão maior prioridade. • Ex: (4 + 7) / 2.0 resultará 5.5. Expressões Aritméticas • Exercícios • Indique o valor e o tipo do resultado de cada expressão abaixo: • • • • 5000000000L + 500 5F * 3.0 (3 + 4) / (2 * 2) 2 * (3.5 + (7 + 2) * 3.0) / 2 • Indique que valor será gravado nas respectivas variáveis nas atribuições abaixo, ou informe se é operação inválida e porquê. • double x = 3 * 5; • int i = 5 / 2f; • int i = i + 1; Expressões Aritméticas • Operadores de atribuição • Pode-se combinar uma operação com uma atribuição. Por exemplo, a atribuição n=n+2; pode ser escrita como n+=2; • Os diversos operadores de atribuição de Java são mostrados na tabela seguinte: Expressões Aritméticas • Operadores de atribuição • Exemplo: int k = 6; int s = 2; s += k; // mesmo que s = s + k; s = 8, k = 6 s %= 5; // mesmo que s = s % 5; (resto da divisão de s por 5). s=3 Expressões Aritméticas • Operadores de incremento e de decremento • É muito comum nos programas incrementar 1 a uma variável, o que se pode fazer, como já foi visto, de duas maneiras. Por exemplo, int m = 10; m = m + 1; // incrementa 1 a 10, resultando 11 em m m += 1; // m irá para 12 • Os operadores ++ e -- realizam a tarefa de incrementar ou decrementar 1. • Ex: m++; // mesmo que m = m + 1; m--; // mesmo que m = m – 1; double d = 6.51; d++; // podem ser aplicados a campos de ponto flutuante Expressões Aritméticas • Operadores de incremento e de decremento • Os operadores de incremento e de decremento podem ser pós- fixados, quando vêm colocados após a variável, ou pré-fixados, quando vêm antes. Se pós-fixado, a variável é utilizada e depois é incrementada (ou decrementada). Se pré-fixado, a variável é incrementada (ou decrementada) e depois utilizada. • Ex: o trecho int i = 5; System.out.println(++i + “ “ + i++ + “ “ + i); QUAL A SAÍDA DA INSTRUÇÃO ACIMA? Expressões Aritméticas • Exercício. Que valores serão exibidos pelo trecho abaixo? int a = 15; int b = 4; int c = a++ + --b; System.out.println(a + “ “ + b + “ “ + c); Expressões Aritméticas • A classe Math • A classe java.lang.Math possui diversos métodos que implementam operações matemáticas úteis. Seu uso dispensa o comando import (veremos adiante) pois ela é carregada automaticamente. • static double random( ) • Retorna um double randômico no intervalo [0, 1.0). • Ex: double r = Math.random(); // grava em r um randômico • Ex: int i = 1 + (int) (Math.random() * 10) // grava em i um randômico obtido no intervalo de 1 a 10. • static double sqrt (double a) • Retorna um double que é a raiz quadrada positiva de a. • Ex: double y = 25; • System.out.println (Math.sqrt(y)); //Exibe 5.0 • static double pow (double b, double e) • Eleva a base b ao expoente e, retornado double. • Ex: double p = Math.pow(2, 3); // atribui 8.0 a p Expressões Aritméticas • Exercício. Escrever em Java a fórmula de Bhaskara Expressões Aritméticas • Exercício. Crie uma classe Circulo e os métodos calculaArea e calculaPerimetro da classe Circulo. Eles devem devolver os valores calculados. Crie uma classe TestaCirculo para criar um objeto círculo e imprimir sua área e seu perímetro. • Área do círculo: Pi x r2 • Perímetro: 2 * Pi x r • Para o valor do Pi, utilize Math.PI Métodos • Referências bibliográficas • http://inf.unisinos.br/~anibal • http://www.google.com.br