11. enumerações; instrução switch; limitações dos inteiros – fundamentos de programação

34
Apresentação 11 Enumerações Instrução de selecção switch Gama limitada dos tipos inteiros

Upload: manuel-menezes-de-sequeira

Post on 11-Jun-2015

485 views

Category:

Education


2 download

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.

TRANSCRIPT

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

Apresentação 11

EnumeraçõesInstrução de selecção switch

Gama limitada dos tipos inteiros

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

Fundamentos de Programação 2

Da apresentação anterior…

Encapsulação

Cópia de instâncias

Igualdade de instâncias

2013/2014

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

Enumerações

2013/2014 Fundamentos de Programação 3

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

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!

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

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

!!??

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

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

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

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._

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

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

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

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”

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

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

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

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

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

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

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

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_

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

Instrução de selecção switch

2013/2014 Fundamentos de Programação 14

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

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

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

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! )

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

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!

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

Gama limitada dos tipos inteiros

2013/2014 Fundamentos de Programação 18

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

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.

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

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

Fundamentos de Programação 34

Sumário

Enumerações

Instrução de selecção switch

Gama limitada dos tipos inteiros

2013/2014