Aula 6 Instruções de selecção e instruções condicionais.

55
Aula 6 Instruções de selecção e instruções condicionais

Transcript of Aula 6 Instruções de selecção e instruções condicionais.

Page 1: Aula 6 Instruções de selecção e instruções condicionais.

Aula 6

Instruções de selecção e instruções condicionais

Page 2: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação2

Instrução de selecção

if(G) instrução1;else instrução2; instrução1 instrução2

[G] [¬G]

Início da actividade

Fim da actividade

Guarda

Actividade

Transição

Entroncamento

Ramificação

Page 3: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação3

Instrução de selecção: Exemplo

int x;cin >> x;

if(x < 0) x = 0; else x = 1;

cout << x << endl;131

x: int

1

x: int

?

x: int

13

Page 4: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação4

Instrução condicional

if(G) instrução1;

instrução1

[G]

[¬G]

Page 5: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação5

Instrução condicional: Exemplo

int x;cin >> x;

if(x < 0) x = 0;

cout << x << endl;1313

x: int

13

x: int

?

Page 6: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação6

Instrução condicional

if(G) instrução1;

é o mesmo que

if(G) instrução1;else ; // Instrução nula

instrução1

[G]

[¬G]

Page 7: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação7

Porquê ser disciplinado?

Para não errar? Problema simples na Aula prática Aposto:

Vão esquecer a disciplina Vão errar 1ª versão Vão errar 2ª versão Talvez acertem à terceira…

Page 8: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação8

absolutoDe()

/** Devolve o valor absoluto do argumento.

@pre ?.

@post ?. */

int absolutoDe(int const valor){ ... }

O que faz

Como funciona

Como se usa

Page 9: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação9

absolutoDe(): pré-condição

/** Devolve o valor absoluto do argumento.

@pre V.

@post ?. */

int absolutoDe(int const valor){ ... }

Page 10: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação10

absolutoDe():condição-objectivo

/** Devolve o valor absoluto do argumento.

@pre V.

@post 0 ≤ absolutoDe. */

int absolutoDe(int const valor) { ... }

É suficiente? Não há relação entre o valor devolvido e valor!

Page 11: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação11

absolutoDe():condição-objectivo

/** Devolve o valor absoluto do argumento.

@pre V.

@post 0 ≤ absolutoDe. */

int absolutoDe(int const valor) { return 5;}

Errado! Mas, ... A condição objectivo verifica-se!

Page 12: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação12

absolutoDe():condição-objectivo

/** Devolve o valor absoluto do argumento.

@pre V.

@post 0 ≤ absolutoDe e (absolutoDe = valor ou

absolutoDe = -valor). */

int absolutoDe(int const valor){ ...

}

Page 13: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação13

absolutoDe()

/** Devolve o valor absoluto do argumento. @pre V. @post 0 ≤ absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */int absolutoDe(int const valor){ int absoluto;

...

return absoluto;}

Page 14: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação14

absolutoDe()

/** Devolve o valor absoluto do argumento. @pre V. @post 0 ≤ absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */int absolutoDe(int const valor){ // V int absoluto;

...

// 0 ≤ absoluto e // (absoluto = valor ou absoluto = -valor) return absoluto;}

Asserções: afirmações acerca do estado do programa

Asserções: afirmações acerca do estado do programa

Page 15: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação15

absolutoDe()

/** Devolve o valor absoluto do argumento. @pre V. @post 0 ≤ absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */int absolutoDe(int const valor) { assert(true); // V int absoluto;

...

// 0 ≤ absoluto e // (absoluto = valor ou absoluto = -valor) assert(0 <= absoluto); assert(absoluto == valor or absoluto == -valor);

return absoluto;}

Asserções: afirmações acerca do estado do programa

Instruções de asserção: Verificação explícita de asserções.

Page 16: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação16

absolutoDe()

Instruções que resolvem o problema:

absoluto = valor;

absoluto = -valor;

Page 17: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação17

Dedução de asserções (I)

double x, y;

...

y = x * x;

Em que circunstâncias se garante que, depois desta instrução, se tem 2 < y?

Page 18: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação18

Dedução de asserções (II)

double x, y;

...

y = x * x;// 2 < y

Page 19: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação19

Dedução de asserções (III)

double x, y;

...

// ?

y = x * x;// 2 < y

Page 20: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação20

Dedução de asserções (IV)

double x, y;

...

// PC: ?

y = x * x;// CO: 2 < y

Page 21: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação21

Dedução de asserções (IV)

double x, y;

...

// PC: 100 < xy = x * x;// CO: 2 < y

Demasiado forte!

Muito restritiva.

Conjunto de valores possíveis podia ser maior!

Page 22: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação22

Asserções

Asserção A mais forte que asserção B: A mais restritiva que B Conjunto de valores verificando A contido em conjunto de

valores verificando B Asserções fortes correspondem a conjuntos pequenos

Asserção A mais fraca que asserção B: A menos restritiva que B Conjunto de valores verificando A contém conjunto de

valores verificando B Asserções fracas correspondem a conjuntos grandes

Page 23: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação23

Partindo da condição objectivo...

1. Solução do problema é mais simples

2. Programação é actividade dirigida pelos objectivos

Page 24: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação24

Dedução da PC mais fraca

Dada a instrução de atribuição

variável = expressão;// CO

Qual PC mais fraca possível? Na CO, substituir todas as ocorrências de variável por expressão

Page 25: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação25

Dedução da PC mais fraca:exemplo 1

double x, y;

...

// PC: ?

y = x * x;// CO: 2 < y

Page 26: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação26

Dedução da PC mais fraca:exemplo 1

double x, y;

...

// PC: 2 < x2, ou seja, x < -2½ ou 2½ < xy = x * x;// CO: 2 < y

Page 27: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação27

Dedução da PC mais fraca:exemplo 2

// PC: ?++x;// CO: x ≤ 0

é equivalente a

// PC: ?x = x + 1;// CO: x ≤ 0

Page 28: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação28

Dedução da PC mais fraca:exemplo 2

// PC: x + 1 ≤ 0, ou seja, x ≤ -1

x = x + 1;// CO: x ≤ 0

Page 29: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação29

Dedução da PC mais fraca:exemplo 3

// PC: ?

x = x * x - 2; // CO: 0 ≤ x

Page 30: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação30

Dedução da PC mais fraca:exemplo 3

// PC: 0 ≤ x2 - 2, ou seja, 2 ≤ x2, ou seja,

// PC: x ≤ -2½ ou 2½ ≤ xx = x * x - 2; // CO: 0 ≤ x

Page 31: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação31

absolutoDe()

// PC1: ?absoluto = -valor;// 0 ≤ absoluto e// (absoluto = valor ou absoluto = -valor)

e

// PC2: ?absoluto = valor;// 0 ≤ absoluto e// (absoluto = valor ou absoluto = -valor)

Page 32: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação32

absolutoDe(): PC1

// PC1: 0 ≤ -valor e

// (-valor = valor ou -valor = -valor), ou seja,

// PC1: valor ≤ 0 e (-valor = valor ou V), ou seja,

// PC1: valor ≤ 0 e V, ou seja,

// PC1: valor ≤ 0

absoluto = -valor;// 0 ≤ absoluto e

// (absoluto = valor ou absoluto = -valor)

Page 33: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação33

absolutoDe(): PC2

// PC2: 0 ≤ valor e

// (valor = valor ou valor = -valor), ou seja,

// PC2: 0 ≤ valor e (V ou valor = -valor), ou seja,

// PC2: 0 ≤ valor e V, ou seja,

// PC2: 0 ≤ valor

absoluto = valor;// 0 ≤ absoluto e

// (absoluto = valor ou absoluto = -valor)

Page 34: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação34

absolutoDe():instrução de selecção

if(valor <= 0) absoluto = -valor;else // 0 < valor    absoluto = valor;

0 < valor implica 0 ≤ valor

// 0 < valor // 0 ≤ valor

Diferente de0 ≤ valor

Page 35: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação35

Implicação

A implica B Conjunto de valores verificando A (A) está

contido no conjunto de valores que satisfaz B (B)

A é mais forte que B

// A

// B

A

B

Page 36: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação36

absolutoDe()

/** Devolve o valor absoluto do argumento. @pre V. @post 0 ≤ absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */int absolutoDe(int const valor){ int absoluto;

if(valor <= 0) absoluto = -valor; else absoluto = valor;

assert(0 <= absoluto); assert(absoluto == valor or absoluto == -valor);

return absoluto;}

Page 37: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação37

absolutoDe()

/** Devolve o valor absoluto do argumento. @pre V. @post 0 ≤ absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */int absolutoDe(int const valor) { int absoluto = valor <= 0 ? –valor : valor;

assert(0 <= absoluto); assert(absoluto == valor || absoluto == -valor);

return absoluto;}

Page 38: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação38

absolutoDe()

/** Devolve o valor absoluto do argumento. @pre V. @post 0 ≤ absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */int absolutoDe(int const valor){ return valor <= 0 ? –valor : valor;}

Page 39: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação39

valorMaisProximoDentroDe()

double valorMaisPróximoDentroDe(double const v, double const mín, double const máx){ double r;

...

return r;}

Page 40: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação40

valorMaisProximoDentroDe()

/** Devolve o valor de v limitado ao intervalo dado. @pre mín ≤ máx. @post (v < mín e valorMaisPróximoDentroDe = mín) ou (máx < v e valorMaisPróximoDentroDe = máx) ou (mín ≤ v e v ≤ máx e valorMaisPróximoDentroDe = v). */ double valorMaisPróximoDentroDe(double const v, double const mín, double const máx){ assert(mín <= máx); // PC: mín ≤ máx

double r; ... // CO: v < mín e r = mín ou máx < v e r = máx ou mín ≤ v e v ≤ máx e r = v assert(v < mín and r = mín or máx < v and r = máx or mín <= v and v <= máx and r = v);

return r;}

Page 41: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação41

valorMaisProximoDentroDe()

Instruções que resolvem o problema:

r = mín;

r = máx;

r = v;

Page 42: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação42

r = mín;

// PC1: (v < mín e mín = mín) ou (máx < v e mín = máx) ou // (mín ≤ v e v ≤ máx e mín = v)r = mín; // (v < mín e r = mín) ou (máx < v e r = máx) ou // (mín ≤ v e v ≤ máx e r = v)

Pode-se simplificar esta pré-condição:

// PC1: (v < mín e V) ou (máx < v e mín = máx) ou// (v ≤ máx e mín = v)

// PC1: v < mín ou (máx < v e mín = máx) ou// (v ≤ máx e mín = v)

mín ≤ ve

min = v

Page 43: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação43

r = máx;

// PC2: (v < mín e máx = mín) ou (máx < v e máx = máx) ou // (mín ≤ v e v ≤ máx e máx = v)r = máx; // (v < mín e r = mín) ou (máx < v e r = máx) ou // (mín ≤ v e v ≤ máx e r = v)

Pode-se simplificar a pré-condição para:

// PC2: (v < mín e máx = mín) ou (máx < v e V) ou// (mín ≤ v e máx = v)

// PC2: (v < mín e máx = mín) ou máx < v ou// (mín ≤ v e máx = v)

v ≤ máxe

máx = v

Page 44: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação44

r = v;

// PC3: (v < mín e v = mín) ou (máx < v e v = máx) ou// (mín ≤ v e v ≤ máx e v = v)r = v;// (v < mín e r = mín) ou (máx < v e r = máx) ou // (mín ≤ v e v ≤ máx e r = v).

Pode-se simplificar esta pré-condição para:

// PC3: F ou F ou (mín ≤ v e v ≤ máx)

ou seja

// PC3: mín ≤ v e v ≤ máx

Page 45: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação45

Instrução de selecção (I)

// PC: mín ≤ máxif(C1) // PC1: v < mín ou (máx < v e mín = máx) ou (v ≤ máx e mín = v) r = mín;else if(C2) // PC2: (v < mín e máx = mín) ou máx < v ou (mín ≤ v e máx = v) r = máx;else // PC3: mín ≤ v e v ≤ máx r = v;

Page 46: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação46

Instrução de selecção (II)

Sabendo que min ≤ máx

// PC: mín ≤ máxif(C1) // PC1: v < mín ou (máx < v e mín = máx) ou (v ≤ máx e mín = v) // v < mín ou (máx < v e mín = máx) ou mín = v // v ≤ mín ou (máx < v e mín = máx) r = mín;else if(C2) // PC2: (v < mín e máx = mín) ou máx < v ou (mín ≤ v e máx = v) // (v < mín e máx = mín) ou máx < v ou máx = v // (v < mín e máx = mín) ou máx ≤ v r = máx;else // PC3: mín ≤ v e v ≤ máx r = v;

Page 47: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação47

Instrução de selecção (III)

// PC: mín ≤ máxif(C1)

// PC1: v ≤ mín ou (máx < v e mín = máx) r = mín;else if(C2)

// PC2: (v < mín e máx = mín) ou máx ≤ v r = máx;else // PC3: mín ≤ v e v ≤ máx r = v;

Diferente de0 ≤ valor

Sobreposições!

Page 48: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação48

Instrução de selecção (IV)

Eliminando as sobreposições

// PC: mín ≤ máxif(C1) // PC1: v ≤ mín r = mín;else if(C2) // PC2: máx ≤ v r = máx;else // PC3: mín ≤ v e v ≤ máx r = v;

Page 49: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação49

Instrução de selecção (V)

Eliminando ainda mais algumas sobreposições

// PC: mín ≤ máxif(C1) // PC1: v < mín r = mín;else if(C2) // PC2: máx < v r = máx;else // PC3: mín ≤ v e v ≤ máx r = v;

Page 50: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação50

Instrução de selecção (VI)

Escolhendo as condições

// PC: mín ≤ máxif(v < mín) // PC1: v < mín r = mín;else if(máx < v) // PC2: máx < v r = máx;else // PC3: mín ≤ v e v ≤ máx r = v;

Page 51: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação51

valorMaisProximoDentroDe()

/** ... */ double valorMaisPróximoDentroDe(double const v, double const mín, double const máx){ assert(mín <= máx);

double r;

if(v < min) r = mín; else if(máx < v) r = máx; else r = v;

assert(v < mín and r = mín or máx < v and r = máx or mín <= v and v <= máx and r = v);

return r;}

Page 52: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação52

valorMaisProximoDentroDe()

/** ... */ double valorMaisPróximoDentroDe(double const v, double const mín, double const máx){ assert(mín <= máx);

if(v < min) return mín; else if(máx < v) return máx; else return v;}

Page 53: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação53

valorMaisProximoDentroDe()

/** ... */ double valorMaisPróximoDentroDe(double const v, double const mín, double const máx){ assert(mín <= máx);

if(v < min) return mín; if(máx < v) return máx; return v;}

Page 54: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação54

Metodologia de desenvolvimento de instruções de selecção Especificar bem problema: escrever PC e CO Ver bem CO: será necessária instrução de selecção?

Bom indício é existência de "ous" na CO Se for:

Ver CO e identificar n instruções (ou sequências de instruções) que permitam atingir CO

Determinar pré-condição mais fraca de cada instrução Guarda de cada instrução é condição mais fraca que,

dada a pré-condição global, garante verificação da sua pré-condição

Fundamental que guardas cubram todos os casos! Se não acontecer, voltar atrás e tentar encontrar mais instruções para casos em falta

Page 55: Aula 6 Instruções de selecção e instruções condicionais.

2003/2004Introdução à Programação55

Aula 6: Sumário

Instrução de selecção if else e instrução condicional if: Sintaxe Transformação entre tipos de instrução de selecção Exemplos

Asserções Conceitos Dedução de asserções: directa e inversa Caso da instrução de atribuição

Guardas de instruções de selecção Metodologia de desenvolvimento de instruções de selecção:

importância de partir dos objectivos Simplificação de instruções de selecção Operação ? : Importância do cálculo curto-circuitado dos operadores lógicos