A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Aula 6 Instruções de selecção e instruções condicionais."— Transcrição da apresentação:

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

2 2003/2004 Introdução à Programação 2 Instrução de selecção if( G ) instrução1; else instrução2; instrução1instrução2 [G][G][¬G][¬G] Início da actividade Fim da actividade Guarda Actividade Transição Entroncamento Ramificação

3 2003/2004 Introdução à Programação 3 Instrução de selecção: Exemplo int x; cin >> x; if(x < 0) x = 0; else x = 1; cout << x << endl; 13 1 x : int 1 ? 13

4 2003/2004 Introdução à Programação 4 Instrução condicional if( G ) instrução1; instrução1 [G][G] [¬G][¬G]

5 2003/2004 Introdução à Programação 5 Instrução condicional: Exemplo int x; cin >> x; if(x < 0) x = 0; cout << x << endl; 13 x : int 13 x : int ?

6 2003/2004 Introdução à Programação 6 Instrução condicional if( G ) instrução1; é o mesmo que if( G ) instrução1; else ; // Instrução nula instrução1 [G][G] [¬G][¬G]

7 2003/2004 Introdução à Programação 7 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…

8 2003/2004 Introdução à Programação 8 absolutoDe() /** Devolve o valor absoluto do ?. */ int absolutoDe(int const valor) {... } O que faz Como funciona Como se usa

9 2003/2004 Introdução à Programação 9 absolutoDe() : pré-condição /** Devolve o valor absoluto do ?. */ int absolutoDe(int const valor) {... }

10 2003/2004 Introdução à Programação 10 absolutoDe() : condição-objectivo /** Devolve o valor absoluto do 0 absolutoDe. */ int absolutoDe(int const valor) {... } É suficiente? Não há relação entre o valor devolvido e valor !

11 2003/2004 Introdução à Programação 11 absolutoDe() : condição-objectivo /** Devolve o valor absoluto do 0 absolutoDe. */ int absolutoDe(int const valor) { return 5; } Errado! Mas,... A condição objectivo verifica-se!

12 2003/2004 Introdução à Programação 12 absolutoDe() : condição-objectivo /** Devolve o valor absoluto do 0 absolutoDe e ( absolutoDe = valor ou absolutoDe = - valor ). */ int absolutoDe(int const valor) {... }

13 2003/2004 Introdução à Programação 13 absolutoDe() /** Devolve o valor absoluto do 0 absolutoDe e ( absolutoDe = valor ou absolutoDe = - valor ). */ int absolutoDe(int const valor) { int absoluto;... return absoluto; }

14 2003/2004 Introdução à Programação 14 absolutoDe() /** Devolve o valor absoluto do 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

15 2003/2004 Introdução à Programação 15 absolutoDe() /** Devolve o valor absoluto do 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.

16 2003/2004 Introdução à Programação 16 absolutoDe() Instruções que resolvem o problema: absoluto = valor; absoluto = -valor;

17 2003/2004 Introdução à Programação 17 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?

18 2003/2004 Introdução à Programação 18 Dedução de asserções (II) double x, y;... y = x * x; // 2 < y

19 2003/2004 Introdução à Programação 19 Dedução de asserções (III) double x, y;... // ? y = x * x; // 2 < y

20 2003/2004 Introdução à Programação 20 Dedução de asserções (IV) double x, y;... // PC: ? y = x * x; // CO: 2 < y

21 2003/2004 Introdução à Programação 21 Dedução de asserções (IV) double x, y;... // PC: 100 < x y = x * x; // CO: 2 < y Demasiado forte! Muito restritiva. Conjunto de valores possíveis podia ser maior!

22 2003/2004 Introdução à Programação 22 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

23 2003/2004 Introdução à Programação 23 Partindo da condição objectivo Solução do problema é mais simples 2. Programação é actividade dirigida pelos objectivos

24 2003/2004 Introdução à Programação 24 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

25 2003/2004 Introdução à Programação 25 Dedução da PC mais fraca: exemplo 1 double x, y;... // PC: ? y = x * x; // CO: 2 < y

26 2003/2004 Introdução à Programação 26 Dedução da PC mais fraca: exemplo 1 double x, y;... // PC: 2 < x 2, ou seja, x < -2 ½ ou 2 ½ < x y = x * x; // CO: 2 < y

27 2003/2004 Introdução à Programação 27 Dedução da PC mais fraca: exemplo 2 // PC: ? ++x; // CO: x 0 é equivalente a // PC: ? x = x + 1; // CO: x 0

28 2003/2004 Introdução à Programação 28 Dedução da PC mais fraca: exemplo 2 // PC: x + 1 0, ou seja, x -1 x = x + 1; // CO: x 0

29 2003/2004 Introdução à Programação 29 Dedução da PC mais fraca: exemplo 3 // PC: ? x = x * x - 2; // CO: 0 x

30 2003/2004 Introdução à Programação 30 Dedução da PC mais fraca: exemplo 3 // PC: 0 x 2 - 2, ou seja, 2 x 2, ou seja, // PC: x -2 ½ ou 2 ½ x x = x * x - 2; // CO: 0 x

31 2003/2004 Introdução à Programação 31 absolutoDe() // PC 1 : ? absoluto = -valor; // 0 absoluto e // ( absoluto = valor ou absoluto = - valor ) e // PC 2 : ? absoluto = valor; // 0 absoluto e // ( absoluto = valor ou absoluto = - valor )

32 2003/2004 Introdução à Programação 32 absolutoDe() : PC 1 // PC 1 : 0 - valor e // (- valor = valor ou - valor = - valor ), ou seja, // PC 1 : valor 0 e (- valor = valor ou V), ou seja, // PC 1 : valor 0 e V, ou seja, // PC 1 : valor 0 absoluto = -valor; // 0 absoluto e // ( absoluto = valor ou absoluto = - valor )

33 2003/2004 Introdução à Programação 33 absolutoDe() : PC 2 // PC 2 : 0 valor e // ( valor = valor ou valor = - valor ), ou seja, // PC 2 : 0 valor e (V ou valor = - valor ), ou seja, // PC 2 : 0 valor e V, ou seja, // PC 2 : 0 valor absoluto = valor; // 0 absoluto e // ( absoluto = valor ou absoluto = - valor )

34 2003/2004 Introdução à Programação 34 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 de 0 valor

35 2003/2004 Introdução à Programação 35 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

36 2003/2004 Introdução à Programação 36 absolutoDe() /** Devolve o valor absoluto do 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; }

37 2003/2004 Introdução à Programação 37 absolutoDe() /** Devolve o valor absoluto do 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; }

38 2003/2004 Introdução à Programação 38 absolutoDe() /** Devolve o valor absoluto do 0 absolutoDe e ( absolutoDe = valor ou absolutoDe = - valor ). */ int absolutoDe(int const valor) { return valor <= 0 ? –valor : valor; }

39 2003/2004 Introdução à Programação 39 valorMaisProximoDentroDe() double valorMaisPróximoDentroDe(double const v, double const mín, double const máx) { double r;... return r; }

40 2003/2004 Introdução à Programação 40 valorMaisProximoDentroDe() /** Devolve o valor de v limitado ao intervalo mín ( 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; }

41 2003/2004 Introdução à Programação 41 valorMaisProximoDentroDe() Instruções que resolvem o problema: r = mín; r = máx; r = v;

42 2003/2004 Introdução à Programação 42 r = mín; // PC 1 : ( 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: // PC 1 : ( v < mín e V) ou ( máx < v e mín = máx ) ou // ( v máx e mín = v ) // PC 1 : v < mín ou ( máx < v e mín = máx ) ou // ( v máx e mín = v ) mín v e min = v

43 2003/2004 Introdução à Programação 43 r = máx; // PC 2 : ( 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: // PC 2 : ( v < mín e máx = mín ) ou ( máx < v e V) ou // ( mín v e máx = v ) // PC 2 : ( v < mín e máx = mín ) ou máx < v ou // ( mín v e máx = v ) v máx e máx = v

44 2003/2004 Introdução à Programação 44 r = v; // PC 3 : ( 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: // PC 3 : F ou F ou ( mín v e v máx ) ou seja // PC 3 : mín v e v máx

45 2003/2004 Introdução à Programação 45 Instrução de selecção (I) // PC: mín máx if( C 1 ) // PC 1 : 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( C 2 ) // PC 2 : ( v < mín e máx = mín ) ou máx < v ou ( mín v e máx = v ) r = máx; else // PC 3 : mín v e v máx r = v;

46 2003/2004 Introdução à Programação 46 Instrução de selecção (II) Sabendo que min máx // PC: mín máx if( C 1 ) // PC 1 : 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( C 2 ) // PC 2 : ( 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 // PC 3 : mín v e v máx r = v;

47 2003/2004 Introdução à Programação 47 Instrução de selecção (III) // PC: mín máx if( C 1 ) // PC 1 : v mín ou ( máx < v e mín = máx ) r = mín; else if( C 2 ) // PC 2 : ( v < mín e máx = mín ) ou máx v r = máx; else // PC 3 : mín v e v máx r = v; Diferente de 0 valor Sobreposições!

48 2003/2004 Introdução à Programação 48 Instrução de selecção (IV) Eliminando as sobreposições // PC: mín máx if( C 1 ) // PC 1 : v mín r = mín; else if( C 2 ) // PC 2 : máx v r = máx; else // PC 3 : mín v e v máx r = v;

49 2003/2004 Introdução à Programação 49 Instrução de selecção (V) Eliminando ainda mais algumas sobreposições // PC: mín máx if( C 1 ) // PC 1 : v < mín r = mín; else if( C 2 ) // PC 2 : máx < v r = máx; else // PC 3 : mín v e v máx r = v;

50 2003/2004 Introdução à Programação 50 Instrução de selecção (VI) Escolhendo as condições // PC: mín máx if(v < mín) // PC 1 : v < mín r = mín; else if( máx < v ) // PC 2 : máx < v r = máx; else // PC 3 : mín v e v máx r = v;

51 2003/2004 Introdução à Programação 51 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; }

52 2003/2004 Introdução à Programação 52 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; }

53 2003/2004 Introdução à Programação 53 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; }

54 2003/2004 Introdução à Programação 54 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

55 2003/2004 Introdução à Programação 55 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


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

Apresentações semelhantes


Anúncios Google