Upload
manuel-menezes-de-sequeira
View
487
Download
2
Embed Size (px)
DESCRIPTION
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.
Citation preview
Apresentação 11
EnumeraçõesInstrução de selecção switch
Gama limitada dos tipos inteiros
Fundamentos de Programação 2
Da apresentação anterior…
Encapsulação
Cópia de instâncias
Igualdade de instâncias
2013/2014
Enumerações
2013/2014 Fundamentos de Programação 3
Como representar…
Sexo boolean? int? String?
Dias da semana int? String?
Meses do ano
Pontos cardinais
Estado civil2013/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!
Fundamentos de Programação 5
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
2013/2014
!!??
Exemplos simples
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
Exemplo de utilização
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._
Fundamentos de Programação 8
Método valueOf
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
«enumeration»Sex
MALE
FEMALE
sex
Fundamentos de Programação 9
Operação toString
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
Mas pode sobrepor-se versão
especializada!
«enumeration»Sex
MALE
FEMALE
sex
sexName
“FEMALE”
Fundamentos de Programação 10
Operação values
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
«enumeration»CardinalDirection
NORTH
EAST
SOUTH
WEST
direction
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)2013/2014 Fundamentos de Programação 11
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
2013/2014 Fundamentos de Programação 12
Fundamentos de Programação 13
Exemplo de método em enumerado
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
_NORTH_NORTHSouth_
Instrução de selecção switch
2013/2014 Fundamentos de Programação 14
Fundamentos de Programação 15
Sintaxe
switch (expressão) {case valor1: instruções1
break;
case valor2: instruções2
break;…default: instruções break;}2013/2014
Fundamentos de Programação 16
Funcionamento
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
Mas não boolean!(obrigado Nélio! )
Fundamentos de Programação 17
Exemplo
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
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!
Gama limitada dos tipos inteiros
2013/2014 Fundamentos de Programação 18
0 0 0 0
Inteiros com 4 bits
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.
0 0 0 0
Inteiros com 4 bits
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
0 0 0 0
Inteiros com 4 bits
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 11 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
Inteiros com 4 bits
2013/2014 Fundamentos de Programação 22
0 0 0 00 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 11 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 10000
0001
0010
0011
0100
0101
0110
01111000
1001
1010
1011
1100
1101
1110
1111
Negativos Positivos
Inteiros com 4 bits
2013/2014 Fundamentos de Programação 23
00000001
0010
0011
0100
0101
0110
01111000
1001
1010
1011
1100
1101
1110
1111
01
2
3
4
5
6
789
10
11
12
13
1415
+1
-1
10001001
1010
1011
1100
1101
1110
1111
Primeiro bit simpático para identificar valores negativos.
Negativos Positivos
Inteiros com 4 bits
2013/2014 Fundamentos de Programação 24
00000001
0010
0011
0100
0101
0110
0111
01
2
3
4
5
6
7-8-7
-6
-5
-4
-3
-2-1
+1
-1
10001001
1010
1011
1100
1101
1110
1111
+1
-1
Inteiros com 4 bits
2013/2014 Fundamentos de Programação 25
Negativos Positivos
00000001
0010
0011
0100
0101
0110
0111
01
2
3
4
5
6
7-8-7
-6
-5
-4
-3
-2-1
+1
-1
10001001
1010
1011
1100
1101
1110
1111
+1
-1
Inteiros com 4 bits
7 + 1 = -86 + 2 = -85 + 4 = -7-8 - 1 = 7-5 - 6 = 5
2013/2014 Fundamentos de Programação 26
Negativos Positivos
00000001
0010
0011
0100
0101
0110
0111
01
2
3
4
5
6
7-8-7
-6
-5
-4
-3
-2-1
+1
-1
10001001
1010
1011
1100
1101
1110
1111
+1
-1
Inteiros com n bits
2013/2014 Fundamentos de Programação 27
0…000…01
0…
0…
01…11
01
…
2n-1-1-2n-1
…-1
10…0010…01
1…
1…
11…11
int tem 32 bits
(231 -1) + 1 = -231
-231 - 1 = 231 - 1
ou seja,
2147483647 + 1 = -2147483648
-2147483648 - 1 = 2147483647
2013/2014 Fundamentos de Programação 28
0…000…01
0…
0…
01…11
01
…
231-1-231
…-1
10…0010…01
1…
1…
11…11
Fundamentos de Programação 29
Valores extremos de int
final int minimum = Integer.MIN_VALUE;final int maximum = Integer.MAX_VALUE;
out.println(minimum);out.println(maximum);
2013/2014
_-2147483648_-21474836482147483647_
Também estão definidos os extremos dos outros tipos inteiros.
Valores extremos dos inteiros
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
Solução? BigInteger
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
Fundamentos de Programação 32
A reter
Enumerações em Java
Instrução de selecção switch
Limites dos tipos inteiros
Classe especial BigInteger
2013/2014
Fundamentos de Programação 33
Referências
Enumerações no Java Tutorial
Classe BigInteger na API do Java 7
2013/2014
Fundamentos de Programação 34
Sumário
Enumerações
Instrução de selecção switch
Gama limitada dos tipos inteiros
2013/2014