Aula 6 Instruções de selecção e instruções condicionais.
Transcript of Aula 6 Instruções de selecção e instruções condicionais.
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
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
2003/2004Introdução à Programação4
Instrução condicional
if(G) instrução1;
instrução1
[G]
[¬G]
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
?
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]
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…
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
2003/2004Introdução à Programação9
absolutoDe(): pré-condição
/** Devolve o valor absoluto do argumento.
@pre V.
@post ?. */
int absolutoDe(int const valor){ ... }
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!
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!
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){ ...
}
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;}
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
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.
2003/2004Introdução à Programação16
absolutoDe()
Instruções que resolvem o problema:
absoluto = valor;
absoluto = -valor;
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?
2003/2004Introdução à Programação18
Dedução de asserções (II)
double x, y;
...
y = x * x;// 2 < y
2003/2004Introdução à Programação19
Dedução de asserções (III)
double x, y;
...
// ?
y = x * x;// 2 < y
2003/2004Introdução à Programação20
Dedução de asserções (IV)
double x, y;
...
// PC: ?
y = x * x;// CO: 2 < y
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!
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
2003/2004Introdução à Programação23
Partindo da condição objectivo...
1. Solução do problema é mais simples
2. Programação é actividade dirigida pelos objectivos
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
2003/2004Introdução à Programação25
Dedução da PC mais fraca:exemplo 1
double x, y;
...
// PC: ?
y = x * x;// CO: 2 < y
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
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
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
2003/2004Introdução à Programação29
Dedução da PC mais fraca:exemplo 3
// PC: ?
x = x * x - 2; // CO: 0 ≤ x
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
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)
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)
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)
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
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
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;}
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;}
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;}
2003/2004Introdução à Programação39
valorMaisProximoDentroDe()
double valorMaisPróximoDentroDe(double const v, double const mín, double const máx){ double r;
...
return r;}
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;}
2003/2004Introdução à Programação41
valorMaisProximoDentroDe()
Instruções que resolvem o problema:
r = mín;
r = máx;
r = v;
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
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
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
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;
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;
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!
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;
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;
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;
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;}
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;}
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;}
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
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