Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouBrian Mendosa Alterado mais de 10 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.