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.
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)
1. Aula 11 Enumerações Gama limitada dos tipos numéricos Precisão limitada dos tipos de vírgula flutuante
2. Da aula anterior… Encapsulação Cópia de instâncias Igualdade de instâncias 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 2
3. Como representar… Sexo boolean? int? String? Dias da semana int? String? Meses do ano Pontos cardinais Estado civil 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 3 Por 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 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 Introdução à Programação - DCTI - ISCTE-IUL 4 !!??
7. Enumerações: método valueOf Disponibilizado automaticamente Devolve valor enumerado dada cadeia de caracteres com o seu nome exacto Exemplo publicenum Sex { MALE, FEMALE } Sex sex = Sex.valueOf("MALE"); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 7 «enumeration» Sex sex MALE FEMALE
8. Enumerações: operação toString Disponibilizada automaticamente Devolve cadeia de caracteres com nome exacto do valor enumerado Exemplo publicenum Sex { MALE, FEMALE } Sex sex = Sex.FEMALE; String sexName = sex.toString(); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 8 Mas pode sobrepor-se versão especializada! «enumeration» Sex sex sexName MALE FEMALE “FEMALE”
9. Enumerações: operação values Disponibilizada automaticamente values() devolve uma matriz com todos os valores, por ordem de declaração Exemplo publicenumCardinalDirection { NORTH, SOUTH, EAST, WEST } for (CardinalDirectiondirection : CardinalDirection.values()) out.println(direction); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 9 «enumeration» CardinalDirection SOUTH direction NORTH WEST EAST
10. 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
11. 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
12. BlueJ ChemicalElement Operações e atributos próprios Switch longName AtomicNumber AtomicMass H He Li Be 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 12
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 Introdução à Programação - DCTI - ISCTE-IUL 13
14. Exemplo (opções de menu / switch) 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 14 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) { caseSAVE: // gravar... break; caseLOAD: // carregar... break; caseEXIT: // sair... break; }
15. Exemplo (direcção) 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 15 public enum Direction { NORTH, SOUTH, EAST, WEST; public String prettyName() { return name().charAt(0) + name().substring(1).toLowerCase(); } } Objectos do tipo Direction String s1 = Direction.NORTH.name(); System.out.println(s1); String s2= Direction.SOUTH.prettyName(); System.out.println(s2); NORTH SOUTH EAST > NORTH > South WEST
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 Introdução à Programação - DCTI - ISCTE-IUL 16 int min= Integer.MIN_VALUE; int max = Integer.MAX_VALUE; min -2147483648 max 2147483647
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 Introdução à Programação - DCTI - ISCTE-IUL 17 int max = Integer.MAX_VALUE; max++; ++ max 2147483647 -2147483648
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 Arithmetic (IEEE 754) 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 18 double a = 3.4; double b = 0.2; double c = a - b; System.out.println(c); ? > 3.1999999999999997
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 Introdução à Programação - DCTI - ISCTE-IUL 19 BigDecimala = 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 reter Enumerados em Java Limites dos tipos primitivos Problemas de precisão ao utilizar double Classe BigDecimal 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 20