Aula 5 Sobrecarga de nomes de rotinas Rotinas
Aula 5 Sobrecarga de nomes de rotinas Rotinas recursivas Invocação de rotinas Introdução à Programação 2003/2004
Sobrecarga de nomes de rotinas ¢ Quadrado de um inteiro (int): int quadrado. De(int const valor) { return valor * valor; } ¢ Quadrado de um valor de vírgula flutuante (double): double quadrado. De(double const valor) { return valor * valor; } ¢ Quadrado de um inteiro (long): long quadrado. De(long const valor) { return valor * valor; } 2 Introdução à Programação 2003/2004
Assinatura de uma rotina ¢ Assinatura de uma rotina: l l ¢ 3 Nome Lista dos tipos dos parâmetros Não pode existir mais do que uma rotina com a mesma assinatura Introdução à Programação 2003/2004
quadrado. De(): assinaturas e invocações ¢ Assinaturas l l l ¢ Invocações l l l 4 quadrado. De, int quadrado. De, double quadrado. De, long cout << quadrado. De(10) << endl; // int cout << quadrado. De(10. 0) << endl; // double cout << quadrado. De(10 L) << endl; // long Introdução à Programação 2003/2004
soma. De() int soma. De() { return 0; } int soma. De(int const a) { return a; } int soma. De(int const a, int const b) { return a + b; } int soma. De(int const a, int const b, int const c) { return a + b + c; } 5 Introdução à Programação 2003/2004
soma. De(): assinaturas e invocações ¢ Assinaturas: l l ¢ Invocações: l l 6 soma. De, int, int cout << << soma. De() << endl; soma. De(1, 2) << endl; soma. De(3, 2, 1) << endl; Introdução à Programação 2003/2004
soma. De(): parâmetros com argumentos por omissão int soma. De(int int { return a + } 7 const a = 0, const b = 0, const c = 0) b + c; Introdução à Programação 2003/2004
Factorial ¢ n! = n n - 1 . . . 1 se 0 < n n! = 1 se n = 0 n ¢ n! = ∏ i i=1 ¢ 8 n! = (P i : 1 ≤ i ≤ n : i ) Introdução à Programação 2003/2004
Factorial de forma recorrente ¢ n! =. . . (n - 1)!. . . ¢ ¢ 4! = 4 3 2 1 = 4 (3 2 1) 4! = 4 3! ¢ n! = n (n - 1)! ¢ Esta definição é válida sempre? E se n for 0? l 9 0! = 0 (-1)! = 0 ? ? ? ? Introdução à Programação 2003/2004
Definição do factorial ¢ Matematicamente de forma recorrente n! = n (n - 1)! se 0 < n n! = 1 se n = 0 ¢ Em C++ ? factorial. De( ? ) { ? } 10 Introdução à Programação 2003/2004
factorial. De() /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post factorial. De = n!. */ ? factorial. De( ? ) { assert( ? ); ? } 11 Introdução à Programação 2003/2004
factorial. De() /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post factorial. De = n!. */ int factorial. De(int const n) { assert(0 <= n); ? } 12 Introdução à Programação 2003/2004
factorial. De() /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post factorial. De = n!. */ int factorial. De(int const n) { assert(0 <= n); if(n == 0) return 1; else return ? ; } 13 Introdução à Programação 2003/2004
factorial. De() /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post factorial. De = n!. */ int factorial. De(int const n) { assert(0 <= n); if(n == 0) return 1; else return n * factorial. De(n - 1); } 14 Introdução à Programação 2003/2004
Recursividade ¢ Rotina recursiva l l 15 Corpo invoca a própria rotina Corpo invoca rotinas que invocam a rotina Introdução à Programação 2003/2004
factorial. De(): Traçado #include <iostream> factorial. De() using namespace std; /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post factorial. De = n!. */ int factorial. De(int const n) { assert(0 <= n); if(n == 0) return 1; else return n * factorial. De(n - 1); n: int {frozen} 3 main() } int main() { cout << factorial. De(3) << endl; } 16 Introdução à Programação 2003/2004
Pilha ¢ Estrutura onde se acumulam coisas de baixo para cima ¢ Acesso directo ao topo ¢ Computador usa pilha para arrumar a casa durante invocação de rotinas 17 Introdução à Programação Topo da pilha 2003/2004
soma. De(): Traçado #include <iostream> using namespace std; int soma. De(int const a, int const b) { return a + b; } int main() { 2 a: int 1 soma(1, 2) cout << b: int << endl; : int 3 } 18 Introdução à Programação 2003/2004
factorial. De(): Traçado #include <iostream> using namespace std; /** Devolve o factorial do inteiro não negativo passado como argumento. @pre 0 ≤ n. @post factorial. De = n!. */ int factorial. De(int const n) { assert(0 <= n); if(n == 0 or n == 1) return 1; else factorial. De(n – 1) return n * ; // 1 // 2 // 3 A // 3 B } int main() { factorial. De(3) cout << << endl; // 4 A // 4 B } 19 Introdução à Programação 2003/2004
Traçado n: int 1 Topo da pilha Valor devolvido : int 1 O mesmo que {frozen} retorno a 3 B n: int 2 2 2 retorno a 3 B n: int n: int 3 3 3 6 retorno a 4 B retorno a 4 B 20 Introdução à Programação : int 2 2003/2004
A reter… ¢ Pilha l l Estrutura organizada de baixo para cima Acesso directo ao topo ¢ Computador usa pilha para arrumar a casa durante invocação de rotinas Pilha termina sempre como começou ¢ Recursividade introduz ineficiências ¢ l Trabalhos de arrumação da casa usando pilha • Memória usada • Velocidade de execução 21 Introdução à Programação 2003/2004
Aula 5: Sumário ¢ Sobrecarga de nomes de rotinas: l l ¢ Rotinas recursivas: l l l ¢ Problemas Garantia de terminação Aplicações Mecanismo de invocação de rotinas: l l l 22 Noção de assinatura Utilizações Pilha Instâncias locais, parâmetros e valor devolvido Porque, e como, funcionam as rotinas recursivas Introdução à Programação 2003/2004
- Slides: 22