Aula 11EnumeraçõesGama limitada dos tipos numéricosPrecisão limitada dos tipos de vírgula flutuante
Da aula anterior…EncapsulaçãoCópia de instânciasIgualdade de instâncias2010/2011Introdução à Programação - DCTI - ISCTE-IUL2
Como representar…Sexoboolean?int? String?Dias da semanaint?String?Meses do anoPontos cardinaisEstado civil2010/2011Introdução à Programação - DCTI - ISCTE-IUL3Por exemplo:classHuman {    …publicbooleanisFemale() {returnisFemale;    }    …privatebooleanisFemale;}Problemas:Representação indirecta.Não se pode imprimir o sexo.Por exemplo:classHuman {    …publicstaticfinalintMALE = 0;publicstaticfinalintFEMALE = 1;    …publicintgetSex() {returnsex;    }    …privateintsex;}Problemas:Inteiros podem tomar muito mais que os dois valores pretendidos.Ao imprimir surgem números.Por exemplo:classHuman {    …publicstaticfinalStringMALE = "Male";publicstaticfinalStringFEMALE = "Female";    …publicStringgetSex() {returnsex;    }    …privateStringsex;}Problemas:Cadeias de caracteres podem tomar muito mais que os dois valores pretendidos.Comparação possível apenas com equals.Mesmos problemas!Mesmos problemas!
Enumerações: o que são?São classes, mas especiaisSão tipos de valor (e de referência!)ValoresDefinidos explicitamente, por extensãoEm número finitoFixosFormam sequência2010/2011Introdução à Programação - DCTI - ISCTE-IUL4!!??
Enumerações: exemplos simples2010/2011Introdução à Programação - DCTI - ISCTE-IUL5
Enumerações: exemplo de utilizaçãopublicstaticvoidmain(finalString[] arguments) {WeekDaymonday = WeekDay.MONDAY;WeekDaysomeDay = WeekDay.FRIDAY;out.println("Mondayis " + monday + ".");someDay = WeekDay.valueOf("Friday");someDay = WeekDay.valueOf("FRIDAY");if(someDay == WeekDay.SUNDAY)out.println("Some day is Sunday.");    out.println("Some dayis " + someDay + ".");}2010/2011Introdução à Programação - DCTI - ISCTE-IUL6
Enumerações: método valueOfDisponibilizado automaticamenteDevolve valor enumerado dada cadeia de caracteres com o seu nome exactoExemplopublicenum Sex { MALE, FEMALE }Sex sex = Sex.valueOf("MALE");2010/2011Introdução à Programação - DCTI - ISCTE-IUL7«enumeration»SexsexMALEFEMALE
Enumerações: operação toStringDisponibilizada automaticamenteDevolve cadeia de caracteres com nome exacto do valor enumeradoExemplopublicenum Sex { MALE, FEMALE }Sex sex = Sex.FEMALE;String sexName = sex.toString();2010/2011Introdução à Programação - DCTI - ISCTE-IUL8Mas pode sobrepor-se versão especializada!«enumeration»SexsexsexNameMALEFEMALE“FEMALE”
Enumerações: operação valuesDisponibilizada automaticamentevalues() devolve uma matriz com todos os valores, por ordem de declaraçãoExemplopublicenumCardinalDirection {    NORTH,    SOUTH,    EAST,    WEST}for (CardinalDirectiondirection : CardinalDirection.values())out.println(direction);2010/2011Introdução à Programação - DCTI - ISCTE-IUL9«enumeration»CardinalDirectionSOUTHdirectionNORTHWESTEAST
Enumerações: operações técnicasEvitar usar!name() devolve sempre cadeia de caracteres com nome exacto do valor enumeradoordinal() devolve número de ordem do valor enumeradoPor ordem de declaraçãoPrimeiro valor tem ordem 0 (zero)2010/2011Introdução à Programação - DCTI - ISCTE-IUL10
Enumerações: vantagens adicionaisPode-se definir atributos e métodos específicosPode-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ção2010/2011Introdução à Programação - DCTI - ISCTE-IUL11
BlueJChemicalElementOperações e atributos própriosSwitchlongNameAtomicNumberAtomicMassH He Li Be2010/2011Introdução à Programação - DCTI - ISCTE-IUL12
Instrução de selecção switchAlternativa ao if-elseAdequada quando as diferentes alternativas de execução são determinadas pelo valor de determinada variávelA variável pode ter um dos tipos primitivos numéricos para representar inteiros (byte, short, int) , char, ou ser de um tipo enumerado2010/2011Introdução à Programação - DCTI - ISCTE-IUL13
Exemplo (opções de menu / switch)2010/2011Introdução à Programação - DCTI - ISCTE-IUL14public 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) {caseSAVE:// gravar...break;caseLOAD:// carregar...break;caseEXIT:// sair...break;}
Exemplo (direcção)2010/2011Introdução à Programação - DCTI - ISCTE-IUL15public enum Direction {NORTH, SOUTH, EAST, WEST;   public String prettyName() {     return name().charAt(0) + name().substring(1).toLowerCase();        }}Objectos do tipo DirectionString s1 = Direction.NORTH.name();System.out.println(s1);String s2= Direction.SOUTH.prettyName();System.out.println(s2);NORTHSOUTHEAST> NORTH> SouthWEST
Limites nos tipos primitivosUma 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/2011Introdução à Programação - DCTI - ISCTE-IUL16int min= Integer.MIN_VALUE;int max = Integer.MAX_VALUE;min-2147483648max2147483647
Rotação entre valor extremosAo efectuar uma operação aritmética cujo resultado ultrapasse o limite, é efectuada uma rotação do limite superior para o inferior, ou vice-versa2010/2011Introdução à Programação - DCTI - ISCTE-IUL17int max = Integer.MAX_VALUE;max++;++max2147483647-2147483648
double: problemas de precisãoAo efectuar operações aritméticas utilizando o tipo primitivo double (ou float) podem ocorrer problemas de precisãoIEEE Standard for Floating-Point Arithmetic (IEEE 754) 2010/2011Introdução à Programação - DCTI - ISCTE-IUL18double a = 3.4;double b = 0.2;double c = a - b;System.out.println(c);?> 3.1999999999999997
Classe BigDecimalClasse que permite a manipulação de números decimais, garantindo que não ocorrem erros de precisãoDeve ser utilizada sempre que a precisão é crucial (p.e. cálculo financeiro)2010/2011Introdução à Programação - DCTI - ISCTE-IUL19BigDecimala = new BigDecimal(3.4);BigDecimalb = new BigDecimal(0.2);BigDecimalc = a.subtract(b, MathContext.DECIMAL32);double d = c.doubleValue();System.out.println(d);> 3.2
A reterEnumerados em JavaLimites dos tipos primitivosProblemas de precisão ao utilizar doubleClasse BigDecimal2010/2011Introdução à Programação - DCTI - ISCTE-IUL20
A ler...http://download.oracle.com/javase/tutorial/java/javaOO/enum.htmlIEEE Standard for Floating-Point Arithmetic (IEEE 754) http://download.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html2010/2011Introdução à Programação - DCTI - ISCTE-IUL21
SumárioEnumeraçõesGama limitada dos tipos numéricosPrecisão limitada dos tipos de vírgula flutuante2010/2011Introdução à Programação - DCTI - ISCTE-IUL22

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

  • 1.
    Aula 11EnumeraçõesGama limitadados tipos numéricosPrecisão limitada dos tipos de vírgula flutuante
  • 2.
    Da aula anterior…EncapsulaçãoCópiade instânciasIgualdade de instâncias2010/2011Introdução à Programação - DCTI - ISCTE-IUL2
  • 3.
    Como representar…Sexoboolean?int? String?Diasda semanaint?String?Meses do anoPontos cardinaisEstado civil2010/2011Introdução à Programação - DCTI - ISCTE-IUL3Por exemplo:classHuman { …publicbooleanisFemale() {returnisFemale; } …privatebooleanisFemale;}Problemas:Representação indirecta.Não se pode imprimir o sexo.Por exemplo:classHuman { …publicstaticfinalintMALE = 0;publicstaticfinalintFEMALE = 1; …publicintgetSex() {returnsex; } …privateintsex;}Problemas:Inteiros podem tomar muito mais que os dois valores pretendidos.Ao imprimir surgem números.Por exemplo:classHuman { …publicstaticfinalStringMALE = "Male";publicstaticfinalStringFEMALE = "Female"; …publicStringgetSex() {returnsex; } …privateStringsex;}Problemas:Cadeias de caracteres podem tomar muito mais que os dois valores pretendidos.Comparação possível apenas com equals.Mesmos problemas!Mesmos problemas!
  • 4.
    Enumerações: o quesão?São classes, mas especiaisSão tipos de valor (e de referência!)ValoresDefinidos explicitamente, por extensãoEm número finitoFixosFormam sequência2010/2011Introdução à Programação - DCTI - ISCTE-IUL4!!??
  • 5.
    Enumerações: exemplos simples2010/2011Introduçãoà Programação - DCTI - ISCTE-IUL5
  • 6.
    Enumerações: exemplo deutilizaçãopublicstaticvoidmain(finalString[] arguments) {WeekDaymonday = WeekDay.MONDAY;WeekDaysomeDay = WeekDay.FRIDAY;out.println("Mondayis " + monday + ".");someDay = WeekDay.valueOf("Friday");someDay = WeekDay.valueOf("FRIDAY");if(someDay == WeekDay.SUNDAY)out.println("Some day is Sunday."); out.println("Some dayis " + someDay + ".");}2010/2011Introdução à Programação - DCTI - ISCTE-IUL6
  • 7.
    Enumerações: método valueOfDisponibilizadoautomaticamenteDevolve valor enumerado dada cadeia de caracteres com o seu nome exactoExemplopublicenum Sex { MALE, FEMALE }Sex sex = Sex.valueOf("MALE");2010/2011Introdução à Programação - DCTI - ISCTE-IUL7«enumeration»SexsexMALEFEMALE
  • 8.
    Enumerações: operação toStringDisponibilizadaautomaticamenteDevolve cadeia de caracteres com nome exacto do valor enumeradoExemplopublicenum Sex { MALE, FEMALE }Sex sex = Sex.FEMALE;String sexName = sex.toString();2010/2011Introdução à Programação - DCTI - ISCTE-IUL8Mas pode sobrepor-se versão especializada!«enumeration»SexsexsexNameMALEFEMALE“FEMALE”
  • 9.
    Enumerações: operação valuesDisponibilizadaautomaticamentevalues() devolve uma matriz com todos os valores, por ordem de declaraçãoExemplopublicenumCardinalDirection { NORTH, SOUTH, EAST, WEST}for (CardinalDirectiondirection : CardinalDirection.values())out.println(direction);2010/2011Introdução à Programação - DCTI - ISCTE-IUL9«enumeration»CardinalDirectionSOUTHdirectionNORTHWESTEAST
  • 10.
    Enumerações: operações técnicasEvitarusar!name() devolve sempre cadeia de caracteres com nome exacto do valor enumeradoordinal() devolve número de ordem do valor enumeradoPor ordem de declaraçãoPrimeiro valor tem ordem 0 (zero)2010/2011Introdução à Programação - DCTI - ISCTE-IUL10
  • 11.
    Enumerações: vantagens adicionaisPode-sedefinir atributos e métodos específicosPode-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ção2010/2011Introdução à Programação - DCTI - ISCTE-IUL11
  • 12.
    BlueJChemicalElementOperações e atributosprópriosSwitchlongNameAtomicNumberAtomicMassH He Li Be2010/2011Introdução à Programação - DCTI - ISCTE-IUL12
  • 13.
    Instrução de selecçãoswitchAlternativa ao if-elseAdequada quando as diferentes alternativas de execução são determinadas pelo valor de determinada variávelA variável pode ter um dos tipos primitivos numéricos para representar inteiros (byte, short, int) , char, ou ser de um tipo enumerado2010/2011Introdução à Programação - DCTI - ISCTE-IUL13
  • 14.
    Exemplo (opções demenu / switch)2010/2011Introdução à Programação - DCTI - ISCTE-IUL14public 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) {caseSAVE:// gravar...break;caseLOAD:// carregar...break;caseEXIT:// sair...break;}
  • 15.
    Exemplo (direcção)2010/2011Introdução àProgramação - DCTI - ISCTE-IUL15public enum Direction {NORTH, SOUTH, EAST, WEST; public String prettyName() { return name().charAt(0) + name().substring(1).toLowerCase(); }}Objectos do tipo DirectionString s1 = Direction.NORTH.name();System.out.println(s1);String s2= Direction.SOUTH.prettyName();System.out.println(s2);NORTHSOUTHEAST> NORTH> SouthWEST
  • 16.
    Limites nos tiposprimitivosUma 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/2011Introdução à Programação - DCTI - ISCTE-IUL16int min= Integer.MIN_VALUE;int max = Integer.MAX_VALUE;min-2147483648max2147483647
  • 17.
    Rotação entre valorextremosAo efectuar uma operação aritmética cujo resultado ultrapasse o limite, é efectuada uma rotação do limite superior para o inferior, ou vice-versa2010/2011Introdução à Programação - DCTI - ISCTE-IUL17int max = Integer.MAX_VALUE;max++;++max2147483647-2147483648
  • 18.
    double: problemas deprecisãoAo efectuar operações aritméticas utilizando o tipo primitivo double (ou float) podem ocorrer problemas de precisãoIEEE Standard for Floating-Point Arithmetic (IEEE 754) 2010/2011Introdução à Programação - DCTI - ISCTE-IUL18double a = 3.4;double b = 0.2;double c = a - b;System.out.println(c);?> 3.1999999999999997
  • 19.
    Classe BigDecimalClasse quepermite a manipulação de números decimais, garantindo que não ocorrem erros de precisãoDeve ser utilizada sempre que a precisão é crucial (p.e. cálculo financeiro)2010/2011Introdução à Programação - DCTI - ISCTE-IUL19BigDecimala = new BigDecimal(3.4);BigDecimalb = new BigDecimal(0.2);BigDecimalc = a.subtract(b, MathContext.DECIMAL32);double d = c.doubleValue();System.out.println(d);> 3.2
  • 20.
    A reterEnumerados emJavaLimites dos tipos primitivosProblemas de precisão ao utilizar doubleClasse BigDecimal2010/2011Introdução à Programação - DCTI - ISCTE-IUL20
  • 21.
    A ler...http://download.oracle.com/javase/tutorial/java/javaOO/enum.htmlIEEE Standardfor Floating-Point Arithmetic (IEEE 754) http://download.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html2010/2011Introdução à Programação - DCTI - ISCTE-IUL21
  • 22.
    SumárioEnumeraçõesGama limitada dostipos numéricosPrecisão limitada dos tipos de vírgula flutuante2010/2011Introdução à Programação - DCTI - ISCTE-IUL22