semana 11: enumerações, limites de tipos numéricos (gama e precisão)

22
Aula 11 Enumerações Gama limitada dos tipos numéricos Precisão limitada dos tipos de vírgula flutuante

Upload: manuel-menezes-de-sequeira

Post on 11-Jun-2015

930 views

Category:

Technology


3 download

DESCRIPTION

Apresentação da semana 11 da unidade curricular de Introdução à Programação do DCTI do ISCTE-IUL. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI, incluindo Luís Nunes e André Santos.

TRANSCRIPT

Page 1: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Aula 11

EnumeraçõesGama limitada dos tipos numéricosPrecisão limitada dos tipos de vírgula flutuante

Page 2: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 2

Da aula anterior…

Encapsulação

Cópia de instâncias

Igualdade de instâncias

2010/2011

Page 3: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Como representar…

Sexo boolean? int? String?

Dias da semana int? String?

Meses do ano

Pontos cardinais

Estado civil2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 3

Por exemplo:class Human { … public boolean isFemale() { return isFemale; } … private boolean isFemale;}

Problemas:1. Representação indirecta.2. Não se pode imprimir o sexo.

Por exemplo:class Human { … public static final int MALE = 0; public static final int FEMALE = 1; … public int getSex() { return sex; } … private int sex;}

Problemas:1. Inteiros podem tomar muito mais que

os dois valores pretendidos.2. Ao imprimir surgem números.

Por exemplo:class Human { … public static final String MALE = "Male"; public static final String FEMALE = "Female"; … public String getSex() { return sex; } … private String sex;}

Problemas:1. Cadeias de caracteres podem tomar

muito mais que os dois valores pretendidos.

2. Comparação possível apenas com equals.

Mesmos problemas!

Mesmos problemas!

Page 4: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 4

Enumerações: o que são?

São classes, mas especiais

São tipos de valor (e de referência!)

Valores Definidos explicitamente, por extensão Em número finito Fixos Formam sequência

2010/2011

!!??

Page 5: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Enumerações: exemplos simplesTipo de valores a representar Java

Sexo (masculino e feminino) enum Sex { MALE, FEMALE }

Dias da semana (de segunda-feira a domingo)

enum WeekDay { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}

Pontos cardeais (Norte, Sul, Este e Oeste)

enum CardinalDirection { NORTH, SOUTH, EAST, WEST}

2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 5

Page 6: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Enumerações: exemplo de utilização

public static void main(final String[] arguments) { WeekDay monday = WeekDay.MONDAY; WeekDay someDay = WeekDay.FRIDAY; out.println("Monday is " + monday + "."); someDay = WeekDay.valueOf("Friday"); someDay = WeekDay.valueOf("FRIDAY"); if (someDay == WeekDay.SUNDAY) out.println("Some day is Sunday.");

out.println("Some day is " + someDay + ".");}

2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 6

Page 7: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 7

Enumerações: método valueOf

Disponibilizado automaticamente

Devolve valor enumerado dada cadeia de caracteres com o seu nome exacto

Exemplo

public enum Sex { MALE, FEMALE }

Sex sex = Sex.valueOf("MALE");

2010/2011

«enumeration»Sex

MALE

FEMALE

sex

Page 8: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 8

Enumerações: operação toString

Disponibilizada automaticamente

Devolve cadeia de caracteres com nome exacto do valor enumerado

Exemplo

public enum Sex { MALE, FEMALE }

Sex sex = Sex.FEMALE;String sexName = sex.toString();

2010/2011

Mas pode sobrepor-se versão

especializada!

«enumeration»Sex

MALE

FEMALE

sex

sexName

“FEMALE”

Page 9: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 9

Enumerações: operação values

Disponibilizada automaticamente

values() devolve uma matriz com todos os valores, por ordem de declaração

Exemplo

public enum CardinalDirection { NORTH, SOUTH, EAST, WEST}

for (CardinalDirection direction : CardinalDirection.values()) out.println(direction);

2010/2011

«enumeration»CardinalDirection

NORTH

EAST

SOUTH

WEST

direction

Page 10: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Enumerações: operações técnicas

Evitar usar!

name() devolve sempre cadeia de caracteres com nome exacto do valor enumerado

ordinal() devolve número de ordem do valor enumerado Por ordem de declaração Primeiro valor tem ordem 0 (zero)2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 10

Page 11: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Enumerações: vantagens adicionais

Pode-se definir atributos e métodos específicos

Pode-se definir construtores específicos (desde que privados ou privados do pacote)

Cada valor pode ter sua própria sobreposição de uma dada operação

2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 11

Page 12: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

BlueJ

Chemical ElementOperações e atributos própriosSwitch longNameAtomicNumberAtomicMassH He Li Be

2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 12

Page 13: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 13

Instrução de selecção switch

Alternativa ao if-else Adequada quando as diferentes

alternativas de execução são determinadas pelo valor de determinada variável▪ A variável pode ter um dos tipos primitivos

numéricos para representar inteiros (byte, short, int) , char, ou ser de um tipo enumerado

2010/2011

Page 14: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 14

Exemplo (opções de menu / switch)

2010/2011

public enum Command { SAVE, LOAD, EXIT;}

...Scanner scanner = new Scanner(System.in);System.out.println(“Introduza uma comando:”);String line = scanner.nextLine();Command command = Command.valueOf(line);switch(command) { case SAVE: // gravar... break; case LOAD: // carregar... break; case EXIT: // sair... break;}

Page 15: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 15

Exemplo (direcção)

2010/2011

public enum Direction { NORTH, SOUTH, EAST, WEST; public String prettyName() { return name().charAt(0) + name().substring(1).toLowerCase(); }} Objectos do tipo

Direction

SOUTH

NORTH

EAST

WEST

String s1 = Direction.NORTH.name();System.out.println(s1);String s2 = Direction.SOUTH.prettyName();System.out.println(s2);

> NORTH> South

Page 16: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 16

Limites nos tipos primitivos

Uma variável de tipo primitivo tem um intervalo de valores possíveis, relacionado com o número de bits que é utilizado para representar p.e. no tipo int é [-2147483648,

2147483647]

2010/2011

int min = Integer.MIN_VALUE;int max = Integer.MAX_VALUE;

2147483647max

-2147483648min

Page 17: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 17

Rotação entre valor extremos

Ao efectuar uma operação aritmética cujo resultado ultrapasse o limite, é efectuada uma rotação do limite superior para o inferior, ou vice-versa

2010/2011

int max = Integer.MAX_VALUE;max++;

2147483647max -2147483648++

Page 18: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 18

double: problemas de precisão

Ao efectuar operações aritméticas utilizando o tipo primitivo double (ou float) podem ocorrer problemas de precisão IEEE Standard for Floating-Point Arithmet

ic (IEEE 754)

2010/2011

double a = 3.4;double b = 0.2;double c = a - b;System.out.println(c);

> 3.1999999999999997 ?

Page 19: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 19

Classe BigDecimal

Classe que permite a manipulação de números decimais, garantindo que não ocorrem erros de precisão

Deve ser utilizada sempre que a precisão é crucial (p.e. cálculo financeiro)

2010/2011

BigDecimal a = new BigDecimal(3.4);BigDecimal b = new BigDecimal(0.2);BigDecimal c = a.subtract(b, MathContext.DECIMAL32);double d = c.doubleValue();System.out.println(d);

> 3.2

Page 20: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 20

A reter

Enumerados em JavaLimites dos tipos primitivosProblemas de precisão ao utilizar double Classe BigDecimal

2010/2011

Page 22: Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)

Introdução à Programação - DCTI - ISCTE-IUL 22

Sumário

EnumeraçõesGama limitada dos tipos numéricosPrecisão limitada dos tipos de vírgula

flutuante

2010/2011