aula 7 instrução de iteração while. 2003/2004 introdução à programação 2 passo [g][g]...
TRANSCRIPT
![Page 1: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/1.jpg)
Aula 7
Instrução de iteração while
![Page 2: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/2.jpg)
2003/2004Introdução à Programação2
passo
[G]
[¬G]
Início da actividade
Fim da actividade
Actividade
Transição
Entroncamento
Ramificação
Instrução while
while(G) passo
GuardaGuarda
![Page 3: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/3.jpg)
2003/2004Introdução à Programação3
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;}
![Page 4: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/4.jpg)
2003/2004Introdução à Programação4
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0
while(i <= n) { potência *= x; ++i;}
![Page 5: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/5.jpg)
2003/2004Introdução à Programação5
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3
while(i <= n) { potência *= x; ++i;}
![Page 6: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/6.jpg)
2003/2004Introdução à Programação6
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 4.0
while(i <= n) { potência *= x; ++i;}
![Page 7: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/7.jpg)
2003/2004Introdução à Programação7
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0
while(i <= n) { potência *= x; ++i;}
![Page 8: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/8.jpg)
2003/2004Introdução à Programação8
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0 V
2.0 3
while(i <= n) { potência *= x; ++i;}
![Page 9: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/9.jpg)
2003/2004Introdução à Programação9
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0 V
2.0 3 8.0
while(i <= n) { potência *= x; ++i;}
![Page 10: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/10.jpg)
2003/2004Introdução à Programação10
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0 V
2.0 3 3 8.0
while(i <= n) { potência *= x; ++i;}
![Page 11: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/11.jpg)
2003/2004Introdução à Programação11
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0 V
2.0 3 3 8.0 V
2.0 3
while(i <= n) { potência *= x; ++i;}
![Page 12: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/12.jpg)
2003/2004Introdução à Programação12
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0 V
2.0 3 3 8.0 V
2.0 3 16.0
while(i <= n) { potência *= x; ++i;}
![Page 13: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/13.jpg)
2003/2004Introdução à Programação13
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0 V
2.0 3 3 8.0 V
2.0 3 4 16.0
while(i <= n) { potência *= x; ++i;}
![Page 14: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/14.jpg)
2003/2004Introdução à Programação14
potênciaDe(2.0, 3)
x n i potência i <= n
2.0 3 1 2.0 V
2.0 3 2 4.0 V
2.0 3 3 8.0 V
2.0 3 4 16.0 F
Errado!
A guarda i ≤ n está errada.
![Page 15: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/15.jpg)
2003/2004Introdução à Programação15
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;}
![Page 16: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/16.jpg)
2003/2004Introdução à Programação16
potênciaDe(5.0, 0)
x n i potência i < n
5.0 0 1 5.0
while(i < n) { potência *= x; ++i;}
![Page 17: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/17.jpg)
2003/2004Introdução à Programação17
potênciaDe(5.0, 0)
x n i potência i < n
5.0 0 1 5.0 F
Errado!
A inicialização está errada.
![Page 18: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/18.jpg)
2003/2004Introdução à Programação18
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;}
![Page 19: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/19.jpg)
2003/2004Introdução à Programação19
Estrutura de um ciclo
inic (inicialização)
while(G) passo
Normalmente passo é
{ acção
prog (progresso)
} prog
[G]
[¬G]
inic
acção
![Page 20: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/20.jpg)
2003/2004Introdução à Programação20
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
![Page 21: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/21.jpg)
2003/2004Introdução à Programação21
potênciaDe()
/** Devolve a potência n de x. @pre 0 ≤ n. @post potênciaDe = xn. */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;}
![Page 22: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/22.jpg)
2003/2004Introdução à Programação22
potênciaDe()
/** Devolve a potência n de x. @pre 0 ≤ n. @post potênciaDe = xn. */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;}
![Page 23: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/23.jpg)
2003/2004Introdução à Programação23
potênciaDe()
/** Devolve a potência n de x. @pre 0 ≤ n. @post potênciaDe = xn. */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;}
![Page 24: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/24.jpg)
2003/2004Introdução à Programação24
A reter...
Programação com cinto, liga e suspensórios
Escrever sempre a especificação da rotina
Demonstrar que os ciclos estão correctos
![Page 25: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/25.jpg)
2003/2004Introdução à Programação25
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;}
![Page 26: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/26.jpg)
2003/2004Introdução à Programação26
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 = xi}
{0 ≤ n 0 < i ≤ n potência = xi}
{0 ≤ n i = n potência = xn}
1
2
3
4
5
![Page 27: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/27.jpg)
2003/2004Introdução à Programação27
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 = xi.
![Page 28: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/28.jpg)
2003/2004Introdução à Programação28
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
![Page 29: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/29.jpg)
2003/2004Introdução à Programação29
init estabelece veracidade de CI
init:
int i = 0; double potência = 1.0;
CI: 0 ≤ i ≤ n potência = xi.
0 ≤ 0 ≤ n 1.0 = x0.
0 ≤ n 1.0 = 1.0.
V V V
Dada a PC, 0 ≤ n, é V.
![Page 30: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/30.jpg)
2003/2004Introdução à Programação30
CI G seguida de passo CI: demonstração directa
while(i != n) { // CI G: 0 ≤ i ≤ n potência = xi i ≠ n // CI G: 0 ≤ i < n potência = xi
potência *= x; // 0 ≤ i < n potência = xi x // 0 ≤ i < n potência = xi + 1
++i; // 0 ≤ (i - 1) < n potência = x(i - 1) + 1
// 1 ≤ i < n + 1 potência = xi
// // CI : 0 ≤ i ≤ n potência = xi
}
![Page 31: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/31.jpg)
2003/2004Introdução à Programação31
CI G seguida de passo CI: demonstração inversa
while(i != n) { // CI G: 0 ≤ i ≤ n potência = xi i ≠ n // CI G: 0 ≤ i < n potência = xi
// 0 ≤ i + 1 ≤ n potência x = xi + 1
// -1 ≤ i ≤ n - 1 potência x = xi + 1
// -1 ≤ i < n potência x = xi + 1
potência *= x; // 0 ≤ i + 1 ≤ n potência = xi + 1
++i; // CI: 0 ≤ i ≤ n potência = xi
}
Implica
![Page 32: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/32.jpg)
2003/2004Introdução à Programação32
CI ¬G CO
CI: 0 ≤ i ≤ n potência = xi.G: i ≠ n.
CI ¬G: 0 ≤ i ≤ n potência = xi i = nCI ¬G: 0 ≤ n ≤ n potência = xn i = nCI ¬G: 0 ≤ n potência = xn i = n
CO: potência = xn
![Page 33: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/33.jpg)
2003/2004Introdução à Programação33
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
![Page 34: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/34.jpg)
2003/2004Introdução à Programação34
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
![Page 35: 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](https://reader030.vdocuments.mx/reader030/viewer/2022013100/552fc11a497959413d8c96aa/html5/thumbnails/35.jpg)
2003/2004Introdução à Programação35
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