11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de Programação

1.133 visualizações

Publicada em

Fundamentos da Programação 11:
• Enumerações
• Instrução switch
• Gama limitada dos inteiros

Apresentação 11 da unidade curricular de Fundamentos de Programação da Universidade Europeia. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI do ISCTE-IUL, incluindo Luís Nunes, Ricardo Ribeiro, André Santos e o próprio Manuel Menezes de Sequeira.

Publicada em: Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.133
No SlideShare
0
A partir de incorporações
0
Número de incorporações
569
Ações
Compartilhamentos
0
Downloads
41
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de Programação

  1. 1. Enumerações Instrução de selecção switch Gama limitada dos tipos inteiros
  2. 2.  Encapsulação  Cópia de instâncias  Igualdade de instâncias 2013/2014 Fundamentos de Programação 2
  3. 3. 2013/2014 Fundamentos de Programação 3
  4. 4.  Sexo  boolean?  int?  String?  Dias da semana  int?  String?  Meses do ano  Pontos cardinais  Estado civil 2013/2014 Fundamentos de Programação 4 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!
  5. 5.  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 2013/2014 Fundamentos de Programação 5 !!??
  6. 6. Tipo de valores a representar Java Sexo (masculino e feminino) public enum Sex { MALE, FEMALE } Dias da semana (de domingo a segunda-feira) public enum DayOfTheWeek { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } Pontos cardeais (Norte, Sul, Este e Oeste) public enum CardinalDirection { NORTH, SOUTH, EAST, WEST } 2013/2014 Fundamentos de Programação 6
  7. 7. public static void main(final String[] arguments) { final DayOfTheWeek day = DayOfTheWeek.MONDAY; DayOfTheWeek someDay = DayOfTheWeek.FRIDAY; out.println("Monday is " + day + "."); someDay = DayOfTheWeek.valueOf("FRIDAY"); someDay = DayOfTheWeek.valueOf("Friday"); if (someDay == DayOfTheWeek.FRIDAY) out.println("Some day is Friday."); out.println("Some day is " + someDay + "."); } 2013/2014 Fundamentos de Programação 7 _Monday is MONDAY. _ Monday is MONDAY. Some day is Friday. _ Monday is MONDAY. Some day is Friday. Some day is FRIDAY. _
  8. 8.  Disponibilizado automaticamente  Devolve valor enumerado dada cadeia de caracteres com o seu nome exacto  Exemplo public enum Sex { MALE, FEMALE } final Sex sex = Sex.valueOf("MALE"); 2013/2014 Fundamentos de Programação 8 «enumeration» Sex MALE FEMALE sex
  9. 9.  Disponibilizada automaticamente  Devolve cadeia de caracteres com nome exacto do valor enumerado  Exemplo public enum Sex { MALE, FEMALE } final Sex sex = Sex.FEMALE; final String sexName = sex.toString(); 2013/2014 Fundamentos de Programação 9 Mas pode sobrepor-se versão especializada! «enumeration» Sex MALE FEMALE sex sexName “FEMALE”
  10. 10.  Disponibilizada automaticamente  values() devolve uma array 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); 2013/2014 Fundamentos de Programação 10 «enumeration» CardinalDirection NORTH EAST SOUTH WEST direction
  11. 11.  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) 2013/2014 Fundamentos de Programação 11
  12. 12.  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 2013/2014 Fundamentos de Programação 12
  13. 13. public enum CardinalDirection { NORTH, SOUTH, EAST, WEST; public String prettyName() { return name().charAt(0) + name().substring(1).toLowerCase(); } } … out.println(CardinalDirection.NORTH.name()); out.println(CardinalDirection.SOUTH.prettyName()); 2013/2014 Fundamentos de Programação 13 _NORTH _ NORTH South _
  14. 14. 2013/2014 Fundamentos de Programação 14
  15. 15. switch (expressão) { case valor1: instruções1 break; case valor2: instruções2 break; … default: instruções break; } 2013/2014 Fundamentos de Programação 15
  16. 16.  Alternativa ao if-else  Quando fluxo de execução tem vários casos de acordo com valor de expressão  Expressão de controlo e valores dos casos  Tipos primitivos inteiros (byte, short, int, etc.)  char  String  Enumerações 2013/2014 Fundamentos de Programação 16 Mas não boolean!(obrigado Nélio! )
  17. 17. public enum Command { SAVE, LOAD, EXIT; } … final Scanner inputScanner = new Scanner(System.in); out.print("Introduza um comando: "); final String commandText = inputScanner.nextLine(); final Command command = Command.valueOf(commandText); switch(command) { case SAVE: … break; case LOAD: … break; case EXIT: … break; } 2013/2014 Fundamentos de Programação 17 Nos casos de um switch recorrendo a uma enumeração, usa-se apenas os valores enumerados, i.e., não se pode preceder o valor do nome da enumeração: Command.LOAD. Sem o break, a execução continua, passando para os casos seguintes!
  18. 18. 2013/2014 Fundamentos de Programação 18
  19. 19. 0 0 0 0 2013/2014 Fundamentos de Programação 19 1 1 1 1 0123456789101112131415 Suponhamos… Com 4 bits representamos 16 inteiros com valores entre 0 e 15. Com n bits representamos 2n inteiros com valores entre 0 e 2n-1.
  20. 20. 0 0 0 0 2013/2014 Fundamentos de Programação 20 0 0 0 10 0 1 00 0 1 10 1 0 00 1 0 10 1 1 00 1 1 11 0 0 01 0 0 11 0 1 01 0 1 11 1 0 01 1 0 11 1 1 01 1 1 1
  21. 21. 0 0 0 0 2013/2014 Fundamentos de Programação 21 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1
  22. 22. 2013/2014 Fundamentos de Programação 22 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
  23. 23. Negativos Positivos 2013/2014 Fundamentos de Programação 23 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0 1 2 3 4 5 6 789 10 11 12 13 14 15 +1 -1 1000 1001 1010 1011 1100 1101 1110 1111 Primeiro bit simpático para identificar valores negativos.
  24. 24. Negativos Positivos 2013/2014 Fundamentos de Programação 24 0000 0001 0010 0011 0100 0101 0110 0111 0 1 2 3 4 5 6 7-8-7 -6 -5 -4 -3 -2 -1 +1 -1 1000 1001 1010 1011 1100 1101 1110 1111 +1 -1
  25. 25. 2013/2014 Fundamentos de Programação 25 Negativos Positivos 0000 0001 0010 0011 0100 0101 0110 0111 0 1 2 3 4 5 6 7-8-7 -6 -5 -4 -3 -2 -1 +1 -1 1000 1001 1010 1011 1100 1101 1110 1111 +1 -1
  26. 26. 7 + 1 = -8 6 + 2 = -8 5 + 4 = -7 -8 - 1 = 7 -5 - 6 = 5 2013/2014 Fundamentos de Programação 26 Negativos Positivos 0000 0001 0010 0011 0100 0101 0110 0111 0 1 2 3 4 5 6 7-8-7 -6 -5 -4 -3 -2 -1 +1 -1 1000 1001 1010 1011 1100 1101 1110 1111 +1 -1
  27. 27. 2013/2014 Fundamentos de Programação 27 0…0 00…01 0… 0… 01…11 0 1 … 2n-1-1-2n-1 … -1 10…00 10…01 1… 1… 11…11
  28. 28. (231 -1) + 1 = -231 -231 - 1 = 231 - 1 ou seja, 2147483647 + 1 = -2147483648 -2147483648 - 1 = 2147483647 2013/2014 Fundamentos de Programação 28 0…0 00…01 0… 0… 01…11 0 1 … 231-1-231 … -1 10…00 10…01 1… 1… 11…11
  29. 29. final int minimum = Integer.MIN_VALUE; final int maximum = Integer.MAX_VALUE; out.println(minimum); out.println(maximum); 2013/2014 Fundamentos de Programação 29 _-2147483648 _ -2147483648 2147483647 _ Também estão definidos os extremos dos outros tipos inteiros.
  30. 30. 2013/2014 Fundamentos de Programação 30 Tipo Bits Valor mínimo Valor máximo byte 8 -128 127 short 16 -32768 32767 int 32 -2147483648 2147483647 long 64 -9223372036854775808 9223372036854775807
  31. 31. import java.math.BigInteger; … public class BigIntegerTester { public static BigInteger factorialOf(BigInteger n) { BigInteger factorial = BigInteger.valueOf(1); while (n != BigInteger.ZERO) { factorial = factorial.multiply(n); n = n.subtract(BigInteger.ONE); } return factorial; } public static void main(final String[] arguments) { out.println("Number of different deck shuffles: " + factorialOf(BigInteger.valueOf(52))); } } 2013/2014 Fundamentos de Programação 31
  32. 32.  Enumerações em Java  Instrução de selecção switch  Limites dos tipos inteiros  Classe especial BigInteger 2013/2014 Fundamentos de Programação 32
  33. 33.  Enumerações no JavaTutorial  Classe BigInteger na API do Java 7 2013/2014 Fundamentos de Programação 33
  34. 34.  Enumerações  Instrução de selecção switch  Gama limitada dos tipos inteiros 2013/2014 Fundamentos de Programação 34

×