Aula 3 Variáveis, expressões, operadores e instruções de selecção Estrutura de um programa em Java /** * Estrutura básica de um programa em Java. * @author Xico comentários */ public class NomeDoPrograma { public static void main(String[] parametros) { // Instruções... } } Todas as frases precedidas de // ou entre /* e */ são comentários, sendo ignorados pelo compilador 2 2007/2008 Variáveis Servem para guardar informação Guardam dados que têm de ser de um tipo definido ! (dados provêm de um dado domínio, bem definido) 235 Inteiro ‘a’ Letra/caracter “Letras” 3 435.72 Decimal 435.72 “Letras” Cadeia de caracteres (String) 2007/2008 Variáveis Antes da primeira utilização : Tem de se declarar quais as variáveis que passam a existir nesse programa, qual o seu nome e tipo - declaração Deve também ser dado um valor inicial a cada variável - inicialização Após a declaração: 4 Podem ser utilizadas para guardar dados (valores) Colocação de um valor numa variável chama-se atribuição – atribuição de um valor a uma variável 2007/2008 Variáveis (representação gráfica) Nome: numero Tipo: (int = inteiro) numero : int 12 Em java: int numero = 12; ou: Valor: 12 int numero; numero = 12; 5 2007/2008 Variáveis (declaração e inicialização) Nome Valor inicial boolean encontrado = false; Tipo: booleano, ou seja, só pode tomar os valores falso e verdadeiro encontrado : boolean false 6 2007/2008 Variáveis (declaração e inicialização) int número_de_alunos = 39; double taxa_de_conversão = 200.482; char c = ‘A’; Nomes de pedaços de memória (na verdade são traduzidos para endereços de memória) 7 Interpretação do conteúdo baseada no tipo associado 2007/2008 Variáveis e Identificadores Variáveis são conhecidas pelo seu nome: O nome da variável é um identificador Os identificadores não podem ser repetidos na mesma zona do programa Nota: matéria a desenvolver em aulas futuras 8 2007/2008 Variáveis e Identificadores Identificadores não podem ser quaisquer: São constituídos por letras, números e os caracteres _ e $ • Os identificadores começados por _ e $ são usados nas bibliotecas standard e devem ser evitados noutros programas. 9 Primeiro caracter não pode ser um algarismo (0, 1, …, 9) Maiúsculas e minúsculas são caracteres diferentes! Não podem ser palavras reservadas (e.g. for, while, int, if, for, etc.) 2007/2008 Palavras Reservadas, Variáveis e Tipos Palavras Reservadas de uma Linguagem: Têm um significado especial para o compilador Não podem ser usadas para outras finalidades Variáveis são criadas sempre associadas a um tipo de dados Tipo de dados é sempre uma palavra reservada (tipos primitivos) Não pode ser usado para outras finalidades Exemplo: int é palavra reservada em JAVA float int = 300.0; // ERRO FLAGRANTE! 10 2007/2008 Tipos de dados 11 Primitivos char – um caracter int – número inteiro (existem três outros tipos de inteiros) float ou double – número decimal boolean – verdadeiro ou falso Classes Object String – cadeia de caracteres … Tipos definidos pelo utilizador 2007/2008 Caracteres Tipo: char Número de bits para guardar um caracter: 16 Número total de padrões de bits: 216 = 65 536 Código: Unicode ( associa um número a cada caracter independente do idioma. Sugestão: consulte Unicode ) char memória ‘A’ ..... 0000 0000 0100 0001 ‘a’ ..... 0000 0000 0110 0001 ‘0’ ..... 0000 0000 0011 0000 12 2007/2008 Inteiros Exemplo: Tipo: int Número de bits: 32 Tipo Tamanho byte 8 short 16 int 32 long 64 memória 0000 0000 0000 0000 0000 0000 0100 0001 … 13 int 65 2007/2008 Valores decimais (ou em vírgula flutuante) Exemplos: Tipo: float Tipo: double Número de bits: 32 Número de bits: 64 float x = 0.0f; (ou 0.0F) double x = 0.0; (ou 0.0d ou 0.0D) ( por omissão um real é double; para ser explicitamente float poderá inicializar-se a var. desta forma ) memória 0000 0000 0000 0000 0000 0000 0100 0001 … 14 float 9.1E-44 2007/2008 Memória Os 32 bits de memória: Cada célula tem um endereço, em base hexadecimal, ex: @10b62db 0000 0000 0000 0000 0000 0000 0100 0001 podem corresponder a: 26 * 1 + (char) ‘A’ … apenas considera os 16 à direita (int) 65 (float) 9.1E-44 20 * 1 Nota: o que está num endereço de memória pode ser igual ... mas ser interpretado de formas diferentes... 15 2007/2008 Memória A mesma memória pode ser vista a vários níveis: … x:int letra:char 5 ’A’ … 0 … 0 1 ‘A’ 5 0 1 Variáveis com nomes … e tipos Conteúdos, assumindo tipos definidos … 0 … 0 1 0 0 0 0 0 1 Representação binária (o que realmente lá está) 16 2007/2008 Referências/Objectos Object um_objecto = new Object(); String cadeia = new String(“ISCTE”); Memória dinâmica (heap) @10b62c9 … @10b62ca … … Memória estática (stack) @10b62db um_objecto : Object … @10b62e8 Object@10b62c9 cadeia : String String@10b62db 17 … ‘I’ @10b62e9 ‘S’ @10b62ea ‘C’ @10b62eb ‘T’ @10b62ec ‘E’ 2007/2008 Tipos primitivos em JAVA (8 tipos) Tipo Tamanho/ Formato Valores literais Domínio (números inteiros) byte 8 bits 10, ... [-128, 127] short 16 bits 234, ... [-32768, 32767] int 32 bits 176, ... [-2147483648, 2147483647] long 64 bits 8374L, ... [-9223372036854775808, …07] (números decimais) float 32-bit 3.14f, 200.482F, ... [+/-1.4E-45, +/- ~3.40E38] double 64-bit 18.0, 1.8e1, 18.0d, ... [+/-4.9E-324, +/- ~1.78E308] (outros tipos) char 16 bits/Unicode ‘A’, ‘.’, ‘£’, ... […,’!’,…’ ÿ ‘, …] ou [\u0000, \uffff] boolean (não definido) false e true {false, true} 18 2007/2008 Escrita de valores no ecrã Para escrever informação no monitor: System.out.print(); System.out.println(); • A última versão efectua mudança de linha no fim da escrita ecrã Ex: System.out.println(375); int x = 12; System.out.println(x); 375 12 375-12 System.out.println(“ “ + 375 + “-” + x); 19 2007/2008 Escrita de valores numa janela Para escrever informação numa janela: JOptionPane.showMessageDialog (null, “mensagem”); 20 2007/2008 Escrita de valores no ecrã int x = 3; System.out.print(x); System.out.print(2); double x = 2.0; System.out.println(x); System.out.println(3.0); 21 ecrã 32 2.0 3.0 2007/2008 Leitura de valores do teclado Até há pouco tempo não existia nos packages da linguagem um método directo em JAVA para ler informação do teclado. Era necessária uma sequência de várias operações, por exemplo: String s = ""; char c; try { do { c = (char)System.in.read(); s = s + c; } while (c != '\n'); } catch(IOException e) {} 22 Só por curiosidade 2007/2008 Leitura de valores do teclado Há cerca de dois anos, um grupo de investigadores desenvolveu uma classe, Scanner, utilizável em qualquer máquina, que facilita a interface com o computador e o input em programas em Java. Para podermos recorrer aos métodos definidos para esta classe Scanner, basta que no nosso programa importemos o package (ou biblioteca) desta classe, que lhes permite aceder e utilizar: import java.util.Scanner; e que criemos um objecto do tipo Scanner (p.e., teclado): Scanner teclado = new Scanner (System.in); Agora, recorrendo a teclado, podemos ler diferentes dados, p.e., um valor inteiro n (existem inúmeros métodos: de leitura, pesquisa, etc.): int n = teclado.nextInt(); 23 Introdução à Programação - Aula 3 2007/2008 Leitura de valores do teclado Outro método para ler informação do teclado (sequência de operações) ... ex: public static void main (String[] args) throws Exception { Só por curiosidade /* e System.out.println("Erro de leitura");*/ InputStreamReader leitor = new InputStreamReader (System.in); BufferedReader input = new BufferedReader(leitor); System.out.print("Introduza um inteiro positivo: "); String linha = input.readLine(); int m = Integer.parseInt(linha); System.out.print("Introduza outro inteiro positivo: "); linha = input.readLine(); int n = Integer.parseInt(linha); Por agora abreviaremos as instruções de leitura com: teclado.nextTipo() (sendo teclado uma variável pré-definida por nós) 24 2007/2008 Leitura de valores de uma janela É possível também usar uma janela para ler valores (p.e., uma frase ou cadeia de caracteres - String) a partir do teclado: import javax.swing.JOptionPane; public class Janelas { public static void main(String[] parametros) { String lida = JOptionPane.showInputDialog("Insira uma frase: "); if (lida != null) JOptionPane.showMessageDialog(null, "Escreveu: " + lida); } } 25 2007/2008 Wrappers – objectos com funcionalidades semelhantes às de um tipo primitivo É possível considerar um valor de uma classe primitiva como se fosse um objecto. Para cada um dos oito tipos primitivos em Java existe, associada, uma wrapper class – com variáveis do correspondente tipo primitivo. Entre as funcionalidades das wrapper classes encontramos várias rotinas – termo que passaremos a designar por métodos – como por exemplo: int i = Integer.parseInt(“123”); i = 123 // para converter umaString num valor inteiro Em geral, podemos recorrer a: tipo v = Tipo.parseTipo(); 26 2007/2008 Criação de Objectos – abordagem provisória* Declaração de um objecto (p.e. uma variável) ClasseDoObjecto nomeDoObjecto; ( p.e., int numero; ) ( p.e., int numero = 5; ) Esta declaração somente cria espaço para armazenar um endereço de memória onde um objecto do tipo declarado possa ser guardado (o valor do objecto não foi ainda atribuído) Criação de um objecto (p.e. uma variável) nomeDoObjecto = new ClasseDoObjecto (parâmetros); ( p.e., Integer i = new Integer (i); ) ( p.e., Integer i = new Integer (5); ) A criação de um objecto é feita através do operador new (que o inicializa devidamente) * Nota * : desenvolveremos esta questão mais tarde, quando abordarmos Classes 27 2007/2008 Instruções Uma instrução em Java pode ser da forma expressão; 28 Uma expressão é constituída por: Operadores Variáveis Valores literais ... 2007/2008 Operação de atribuição Altera o valor de uma variável nome : tipo variável = expressão; Exemplo: x = 4 + 8; 29 valor x : int 12 2007/2008 Conversões (cast) Conversões possíveis entre tipos de dados: char «--» números inteiros números decimais «--» números inteiros Conversões impossíveis (por enquanto …): boolean «--» qualquer outro tipo referência «--» qualquer outro tipo 30 2007/2008 Conversões (cast) int i = 65; char c = 'a'; System.out.println(" "+i+“,"+(char)i+“,"+(float)i+" "); System.out.println(" "+c+“,"+(int)c+“,"+(float)c+" "); ecrã 65,A,65.0 31 65,A,65.0 a,97,97.0 2007/2008 Operadores aritméticos (I) +, -, *, / e % A divisão (/) é a divisão inteira se os seus operandos forem inteiros int x = 1 / 2; // System.out.println(x); 0 % significa resto da divisão inteira: int x = 15 % 6; System.out.println(x); 32 ex. exp.java 3 2007/2008 Operadores aritméticos (II) Se os operandos forem de tipos diferentes, o operando de um tipo com menor domínio (gama de valores) é convertido para o tipo maior domínio antes do cálculo: System.out.println(1.5 + 1); 2.5 33 convertido para 1.0 sem ser preciso escrever (double) 2007/2008 Precedência e associatividade (I) Regras comuns respeitadas: System.out.println(1 + 5 * 3); 16 System.out.println(16 / 2 / 2); 4 34 2007/2008 Precedência e associatividade (II) Excepção: atribuição int i = 1, j = 1; i = j = 0; System.out.println(i + “ ” + j); 0 Valor da atribuição é o valor da variável atribuída int x = 0; double f = 0.0; f = x = (int)1.3; System.out.println(f + “ ” + x); 35 0 1.0 1 2007/2008 Operadores relacionais e de igualdade e diferença Operadores relacionais: Operador de igualdade: 36 == Operador de diferença: >, >=, <, <= != O resultado é sempre um boolean (true ou false) 2007/2008 Operadores lógicos Operadores lógicos: && : E || : OU ! : Negação O resultado é sempre um boolean (true ou false) Exemplo (x está entre 0 e 10?): boolean b = (x >= 0 && x <= 10) Exemplo (x é menor que 0 ou maior que 10?): boolean b = (x < 0 || x > 10) // Estas expressões boolean b = !(x >= 0 && x <= 10)// são equivalentes 37 2007/2008 Operadores de incrementação e decrementação ++ e -- prefixos e sufixos (diferenças analisadas mais tarde) Somar 1 a x: ++x; operador prefixo ou x++; operador sufixo nota: ex. em exp.java são ambas abreviaturas de: x = x + 1; x: int 3 1. Soma x+1 -> 4 (guarda 4 em memória) 2. Põe o 4 em x x: int 4 38 2007/2008 Instrução de selecção if(condição){ Guarda instruções_1; } else { instruções_2; executada quando a condição é verdadeira } executada quando a condição é falsa 39 nota: ver ex. exp_if.java 2007/2008 Instrução de selecção: Exemplo //Se x<0 escreve 0 senão escreve 1 int x = 13; if(x < 0) { x = 0; } else { x = 1; } System.out.println(x); 40 x: int 13 1 1 2007/2008 Instrução condicional: Exemplo x: int Abreviatura para instrução de leitura 8 x: int int x = teclado.nextInt(); if(x >= 0 && x <= 10) { x = 0; } System.out.println(x); 0 8 0 Dados introduzidos pelo utilizador 41 2007/2008 Instrução condicional: Exemplo x: int int x = teclado.nextInt(); -3 if(x >= 0 && x <= 10) { x = 0; } System.out.println(x); -3 ? O que apareceria no ecrã? 42 2007/2008 A reter... Variáveis: Servem para guardar informação Têm sempre tipo, nome e valor Expressões: Combinam variáveis e operadores produzindo um valor Instruções de selecção (if): 43 Servem para indicar em que condições um conjunto de instruções é executado ou não 2007/2008 A ler... Capítulos 3, 5 e 7: Y. Daniel Liang, "Introduction to Java Programming", 5ª Edição, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5 44 2007/2008 Aula 3: Sumário 45 Tipos primitivos em Java Noções sobre a representação física dos tipos Noções sobre códigos de caracteres Interpretação de valores do tipo char como inteiros Valores literais Expressões e operações Operação de atribuição: alteração do estado da memória Precedência e associatividade de operadores Instrução de selecção if else 2007/2008