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

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

Aula 7 Instrução de iteração while. 2003/2004 Introdução à Programação 2 passo [G][G] [¬G][¬G] Início da actividade Fim da actividade Actividade Transição.

Apresentações semelhantes


Apresentação em tema: "Aula 7 Instrução de iteração while. 2003/2004 Introdução à Programação 2 passo [G][G] [¬G][¬G] Início da actividade Fim da actividade Actividade Transição."— Transcrição da apresentação:

1 Aula 7 Instrução de iteração while

2 2003/2004 Introdução à Programação 2 passo [G][G] [¬G][¬G] Início da actividade Fim da actividade Actividade Transição Entroncamento Ramificação Instrução while while( G ) passo Guarda

3 2003/2004 Introdução à Programação 3 potênciaDe() double potênciaDe(double const x, int const n) { int i = 1; double potência = x; while(i <= n) { potência *= x; ++i; } return potência; }

4 2003/2004 Introdução à Programação 4 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 while(i <= n) { potência *= x; ++i; }

5 2003/2004 Introdução à Programação 5 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 3 while(i <= n) { potência *= x; ++i; }

6 2003/2004 Introdução à Programação 6 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 34.0 while(i <= n) { potência *= x; ++i; }

7 2003/2004 Introdução à Programação 7 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0 while(i <= n) { potência *= x; ++i; }

8 2003/2004 Introdução à Programação 8 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0V 2.03 while(i <= n) { potência *= x; ++i; }

9 2003/2004 Introdução à Programação 9 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0V 2.038.0 while(i <= n) { potência *= x; ++i; }

10 2003/2004 Introdução à Programação 10 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0V 2.0338.0 while(i <= n) { potência *= x; ++i; }

11 2003/2004 Introdução à Programação 11 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0V 2.0338.0V 2.03 while(i <= n) { potência *= x; ++i; }

12 2003/2004 Introdução à Programação 12 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0V 2.0338.0V 2.0316.0 while(i <= n) { potência *= x; ++i; }

13 2003/2004 Introdução à Programação 13 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0V 2.0338.0V 2.03416.0 while(i <= n) { potência *= x; ++i; }

14 2003/2004 Introdução à Programação 14 potênciaDe(2.0, 3) xnipotênciai <= n 2.031 V 324.0V 2.0338.0V 2.03416.0F Errado! A guarda i n está errada.

15 2003/2004 Introdução à Programação 15 potênciaDe() double potênciaDe(double const x, int const n) { int i = 1; double potência = x; while(i < n) { potência *= x; ++i; } return potência; }

16 2003/2004 Introdução à Programação 16 potênciaDe(5.0, 0) xnipotênciai < n 5.001 while(i < n) { potência *= x; ++i; }

17 2003/2004 Introdução à Programação 17 potênciaDe(5.0, 0) xnipotênciai < n 5.001 F Errado! A inicialização está errada.

18 2003/2004 Introdução à Programação 18 potênciaDe() double potênciaDe(double const x, int const n) { int i = 0; double potência = 1.0; while(i < n) { potência *= x; ++i; } return potência; }

19 2003/2004 Introdução à Programação 19 Estrutura de um ciclo inic (inicialização) while( G ) passo Normalmente passo é { acção prog (progresso) } prog [G][G] [¬G][¬G] inic acção

20 2003/2004 Introdução à Programação 20 potênciaDe() E se alguém invoca potênciaDe(2.0, -1) ? potênciaDe() devolve erradamente 1.0 Porquê? Pré-condição; ou Implementação

21 2003/2004 Introdução à Programação 21 potênciaDe() /** Devolve a potência n de x. @pre 0 n. @post potênciaDe = x n. */ double potênciaDe(double const x, int const n) { int i = 0; double potência = 1.0; while(i < n) { potência *= x; ++i; } return potência; }

22 2003/2004 Introdução à Programação 22 potênciaDe() /** Devolve a potência n de x. @pre 0 n. @post potênciaDe = x n. */ double potênciaDe(double const x, int const n) { int i = 0; double potência = 1.0; while(i != n) { potência *= x; ++i; } return potência; }

23 2003/2004 Introdução à Programação 23 potênciaDe() /** Devolve a potência n de x. @pre 0 n. @post potênciaDe = x n. */ double potênciaDe(double const x, int const n) { assert(0 <= n); int i = 0; double potência = 1.0; while(i != n) { potência *= x; ++i; } return potência; }

24 2003/2004 Introdução à Programação 24 A reter... Programação com cinto, liga e suspensórios Escrever sempre a especificação da rotina Demonstrar que os ciclos estão correctos

25 2003/2004 Introdução à Programação 25 potênciaDe() /**... */ double potênciaDe(double const x, int const n) { assert(0 <= n); 1 int i = 0; double potência = 1.0; 2 while(i != n) { 3 potência *= x; ++i; 4 } 5 return potência; }

26 2003/2004 Introdução à Programação 26 Asserções nas transições ++i; [ i n ] [ i = n ] int i = 0; double potência = 1.0; potência *= x; {PC: 0 n } {0 n i = 0 potência = 1} {0 n 0 i < n potência = x i } {0 n 0 < i n potência = x i } {0 n i = n potência = x n } 1 2 3 4 5

27 2003/2004 Introdução à Programação 27 Condição Invariante Condição verdadeira Depois de inicialização Antes do passo Depois do passo Depois do ciclo Condição correspondente à união dos conjuntos definidos pelas asserções 2, 3, 4 e 5 CI: 0 i n potência = x i.

28 2003/2004 Introdução à Programação 28 Correcção parcial de um ciclo 1. Descobrir condição invariante (CI) 2. Provar que init estabelece veracidade de CI 3. Provar que CI G seguida de passo CI 4. Provar que CI ¬G CO

29 2003/2004 Introdução à Programação 29 init estabelece veracidade de CI init: int i = 0; double potência = 1.0; CI: 0 i n potência = x i. 0 0 n 1.0 = x 0. 0 n 1.0 = 1.0. V V V Dada a PC, 0 n, é V.

30 2003/2004 Introdução à Programação 30 CI G seguida de passo CI: demonstração directa while(i != n) { // CI G: 0 i n potência = x i i n // CI G: 0 i < n potência = x i potência *= x; // 0 i < n potência = x i x // 0 i < n potência = x i + 1 ++i; // 0 ( i - 1) < n potência = x ( i - 1) + 1 // 1 i < n + 1 potência = x i // // CI : 0 i n potência = x i }

31 2003/2004 Introdução à Programação 31 CI G seguida de passo CI: demonstração inversa while(i != n) { // CI G: 0 i n potência = x i i n // CI G: 0 i < n potência = x i // 0 i + 1 n potência x = x i + 1 // -1 i n - 1 potência x = x i + 1 // -1 i < n potência x = x i + 1 potência *= x; // 0 i + 1 n potência = x i + 1 ++i; // CI: 0 i n potência = x i } Implica

32 2003/2004 Introdução à Programação 32 CI ¬G CO CI: 0 i n potência = x i. G: i n. CI ¬G: 0 i n potência = x i i = n CI ¬G: 0 n n potência = x n i = n CI ¬G: 0 n potência = x n i = n CO: potência = x n

33 2003/2004 Introdução à Programação 33 E o ciclo termina sempre? i começa em 0 (zero) Pré-condição: 0 n Guarda: i n Progresso: ++i Se 0 = n, 0 0 é F e o ciclo não é executado Se 0 < n, como i começa em 0 e avança de 1 em 1, n é atingido ao fim de n iterações

34 2003/2004 Introdução à Programação 34 A reter... PC das rotinas tão fraca quanto possível Bom para consumidor Complicado para produtor PC ideal: V CO das rotinas tão fortes quanto possível Bom para consumidor Complicado para produtor Guardas dos ciclos tão fracas quanto possível Violação da PC dá origem a ciclo infinito que facilita detecção de erros ao produtor CI dos ciclos tão forte quanto possível Explica funcionamento do ciclo

35 2003/2004 Introdução à Programação 35 Aula 7: Sumário Instrução while Sintaxe Semântica Exemplo de ciclos simples Inicialização, guarda, passo (acção e progresso) Condição invariante Demonstração da correcção de ciclos Importância da fraqueza das guardas


Carregar ppt "Aula 7 Instrução de iteração while. 2003/2004 Introdução à Programação 2 passo [G][G] [¬G][¬G] Início da actividade Fim da actividade Actividade Transição."

Apresentações semelhantes


Anúncios Google