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

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

Modularização: funções e procedimentos (continuação)

Apresentações semelhantes


Apresentação em tema: "Modularização: funções e procedimentos (continuação)"— Transcrição da apresentação:

1 Modularização: funções e procedimentos (continuação)
Aula 4 Modularização: funções e procedimentos (continuação)

2 Somador de fracções #include <iostream> using namespace std;
/** … */ int mdc(int const m, int const n) { ... } void escreveFracção(int const n, int const d) int main()

3 Máximo divisor comum /** Devolve o máximo divisor comum dos inteiros positivos passados como argumento. @pre 0 < m e 0 < n. @post o valor r devolvido é o mdc de m e n. */ int mdc(int const m, int const n) { assert(0 < m); assert(0 < n); int r; if(m < n) r = m; else r = n; while(m % r != 0 or n % r != 0) --r; assert(0 < r); assert(m % r == 0); assert(n % r == 0); return r; }

4 Escreve fracção /** Escreve no ecrã uma fracção, no formato usual, que
lhe é passada na forma de dois argumentos inteiros positivos. @pre nenhuma. @post o ecrã contém n/d em que n e d são os valores de n e d em base decimal. */ void escreveFracção(int const n, int const d) { cout << n; if(d != 1) cout << ‘/’ << d; }

5 Principal: Ler fracções
cout << "Introduza duas fracções (numerador denominador): "; int n1, d1, n2, d2; cin >> n1 >> d1 >> n2 >> d2; int k = mdc(n1, d1); n1 /= k; d1 /= k; k = mdc(n2, d2); n2 /= k; d2 /= k;

6 Principal: Calcular fracção soma reduzida
int n = d2 * n1 + d1 * n2; int d = d1 * d2; k = mdc(n, d); n /= k; d /= k;

7 Principal: Escrever resultado
cout << "A soma de "; escreveFracção(n1, d1); cout << " com "; escreveFracção(n2, d2); cout << " é "; escreveFracção(n, d); cout << '.' << endl;

8 Redução de fracções // Reduz fracção: k = mdc(n, d); n /= k; d /= k;

9 Módulo reduzFracção()
/** Reduz a fracção recebida como argumento. @pre 0 < n e 0 < d. @post mdc(n, d) = 1 (e n/d representa o mesmo racional que originalmente). */ void reduzFracção(int n, int d) { assert(0 < n); assert(0 < d); int const k = mdc(n, d); n /= k; d /= k; assert(mdc(n, d) == 1); }

10 Principal: Calcular fracção soma reduzida
int n = d2 * n1 + d1 * n2; int d = d1 * d2; reduzFracção(n, d);

11 Principal: Ler fracções
cout << "Introduza duas fracções (numerador denominador): "; int n1, d1, n2, d2; cin >> n1 >> d1 >> n2 >> d2; reduzFracção(n1, d1); reduzFracção(n2, d2);

12 Principal: Ler fracções
cout << "Introduza duas fracções (numerador denominador): "; int n1, d1, n2, d2; cin >> n1 >> d1 >> n2 >> d2; reduzFracção(n1, d1); reduzFracção(n2, d2);

13 Traçado main() n1 : int ? d1 : int ?

14 Traçado main() reduzFracção() n : int n1 : int 6 6 d : int d1 : int 9
k : int {frozen} 3

15 Traçado main() reduzFracção() n : int n1 : int 2 6 d : int d1 : int 9
k : int {frozen} 3

16 Traçado main() reduzFracção() n : int n1 : int 2 6 d : int d1 : int 3
9 k : int {frozen} 3

17 Traçado main() n1 : int 6 d1 : int 9

18 Passagem por referência
Parâmetros são sinónimos de argumentos Argumentos não podem ser literais Parâmetros referências servem de entradas e de saídas

19 Módulo reduzFracção()
/** Reduz a fracção recebida como argumento. @pre 0 < n e 0 < d. @post mdc(n, d) = 1 (e n/d representa o mesmo racional que originalmente). */ void reduzFracção(int& n, int& d) { assert(0 < n); assert(0 < d); int const k = mdc(n, d); n /= k; d /= k; assert(mdc(n, d) == 1); } Parâmetro é referência!

20 Principal: Ler fracções
cout << "Introduza duas fracções (numerador denominador): "; int n1, d1, n2, d2; cin >> n1 >> d1 >> n2 >> d2; reduzFracção(n1, d1); reduzFracção(n2, d2);

21 Traçado main() n1 : int ? d1 : int ?

22 Traçado main() reduzFracção() n : int& n1 : int 6 d : int& d1 : int 9
k : int {frozen} 3

23 Traçado main() reduzFracção() n : int& n1 : int 2 d : int& d1 : int 9
k : int {frozen} 3

24 Traçado main() reduzFracção() n : int& n1 : int 2 d : int& d1 : int 3
k : int {frozen} 3

25 Traçado main() reduzFracção() n : int& n1 : int 2 d : int& d1 : int 3
k : int {frozen} 3

26 Traçado main() n1 : int 2 d1 : int 3

27 Blocos de instruções Âmbito e permanência

28 Bloco de instruções Bloco de instruções (ou instrução composta):
Conjunto de instruções agrupadas Funcionam como uma só instrução { // Instruções: ... }

29 Exemplo int const j = 1; int main() { // Bloco 1. int i = 2;
if(0 < i) { // Bloco 2. int j = i; int const i = 3; cout << i << j << endl; }

30 Tipos de instâncias (para já)
Instâncias locais Definidas dentro de rotinas Pertencem ao contexto do bloco de instruções onde foram definidas Instâncias globais Definidas fora das rotinas Pertencem ao contexto global Dentro do mesmo contexto não podem ser definidas duas instâncias com o mesmo nome

31 Definições erradas int const j = 1; int j = 11; // erro! int main() {
int i = 2; int i = 22; // erro! if(0 < i) int j = i; int const i = 3; int const i = 33; // erro! cout << i << ' ' << j << endl; }

32 Âmbito e permanência (I)
Zona de programa na qual o nome da instância é visível Instância global Visível desde definição até fim do ficheiro Instância local Visível desde definição até fim do seu bloco, incluindo blocos embutidos

33 Linhas de visibilidade
int const j = 1; int main() { // Bloco 1. int i = 2; if(0 < i) { // Bloco 2. int j = i; int const i = 3; cout << i << j << endl; }

34 Ocultação int const j = 1; int main() { // Bloco 1. int i = 2;
if(0 < i) { // Bloco 2. int j = i; int const i = 3; cout << i << j << endl; } Ocultações

35 Âmbito e permanência (II)
Período de tempo durante o qual a instância existe Instâncias globais Do princípio ao fim do programa: estáticas Instâncias locais Desde a execução da definição até saída do bloco: automáticas Diz-se que as instâncias são construídas e destruídas

36 Principal: Ler fracções
cout << "Introduza duas fracções (numerador denominador): "; int n1, d1, n2, d2; cin >> n1 >> d1 >> n2 >> d2; reduzFracção(n1, d1); reduzFracção(n2, d2); int k = mdc(n1, d1);

37 Construção e destruição
main() n1 : int ? d1 : int ? k : int ?

38 Construção e destruição
main() mdc() n1 : int 6 m : int {frozen} 6 d1 : int 9 n : int {frozen} 9 k : int ? r : int ?

39 Construção e destruição
main() mdc() n1 : int 6 m : int {frozen} 6 d1 : int 9 n : int {frozen} 9 k : int ? r : int 6

40 Construção e destruição
main() mdc() n1 : int 6 m : int {frozen} 6 d1 : int 9 n : int {frozen} 9 k : int ? r : int 5

41 Construção e destruição
main() mdc() n1 : int 6 m : int {frozen} 6 d1 : int 9 n : int {frozen} 9 k : int ? r : int 4

42 Construção e destruição
main() mdc() n1 : int 6 m : int {frozen} 6 d1 : int 9 n : int {frozen} 9 k : int ? r : int 3

43 Construção e destruição
main() n1 : int 6 d1 : int 9 k : int 3

44 Variáveis globais Vantagens Desvantagens Não há!!!!!
Rotinas sem significado evidente Alterar nomes das variáveis implica alterar todo o programa Reaproveitamento de código mais difícil

45 Constantes globais Muito úteis! #include <iostream>
using namespace std; double const π = ; double perímetroDeCircunferênciaCom(double const raio) { return 2.0 * π * raio; } int main() cout << "Insira o raio: "; double raio; cin >> raio; cout << "Perímetro: “ << perímetroDeCircunferênciaCom(raio) << endl; cout << “Área: “ << π * raio * raio << endl;

46 Constantes globais Muito úteis! #include <iostream>
using namespace std; Double const pi = ; double perímetroDeCircunferênciaCom(double const raio) { return 2.0 * pi * raio; } int main() cout << "Insira o raio: "; double raio; cin >> raio; cout << "Perímetro: “ << perímetroDeCircunferênciaCom(raio) << endl; cout << “Área: “ << pi * raio * raio << endl;

47 Declarações Declaração Definição #include <iostream>
using namespace std; int main() {     void escreveFracção(int n, int d); void reduzFracção(int& n, int& d); ... } void escreveFracção(int const n, int const d) void reduzFracção(int& n, int& d)     int mdc(int m, int n); int mdc(int const m, int const n) Declaração Definição

48 Nomes Instâncias Instâncias booleanas Procedimentos Funções
Substantivo ou frase substantiva: aquilo que é guardado Instâncias booleanas Afirmação que pode ser verdadeira ou falsa Procedimentos Acção (verbo) no imperativo e complementos Funções Substantivo ou frase substantiva: aquilo que é devolvido Funções booleanas ou predicados

49 Nomes Instâncias Instâncias booleanas Procedimentos Funções
Esta instância guarda … Instâncias booleanas Esta instância indica se … Procedimentos Este procedimento … Funções Esta função devolve … Funções booleanas ou predicados Esta função devolve um valor que indica se …

50 Grafismo Instâncias Rotinas Separar palavras com _
Não separar palavras Iniciar palavras excepto primeira com maiúsculas

51 Exemplos int número_de_alunos = 20; bool hoje_há_aulas = true;
void escreveFracção(int const numerador, int const denominador) double quadradoDe(double const valor) bool sãoIguais(char const a, char const b)

52 Tamanho das rotinas Ideal Normal Em casos extremos Nunca mais!
1 a 3 linhas Normal até 10 linhas Em casos extremos até 60 linhas Nunca mais!

53 Aula 4: Sumário Passagem de argumentos por valor e referência.
Blocos de instruções. Blocos embutidos. Instâncias locais e globais: âmbito, permanência e ocultação. Regra da definição única. Perigos das variáveis globais. Uso de constantes globais. Parâmetros como instâncias locais. Declaração vs. definição. Noções sobre nomes de instâncias, funções e procedimentos. Comprimento típico de rotinas.


Carregar ppt "Modularização: funções e procedimentos (continuação)"

Apresentações semelhantes


Anúncios Google