Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que...
Transcript of Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que...
![Page 1: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/1.jpg)
Aula 3
Modularização: funções e procedimentos
![Page 2: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/2.jpg)
Modularizar
Arte de identificar claramente que módulos devem existir num sistema
SistemaModular
Sistema Integrado
![Page 3: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/3.jpg)
Vantagens da modularização
Facilita detecção de erros: Simples identificar módulo responsável Reduz tempo gasto na identificação
Permite testar módulos individualmente: Reduz complexidade do teste Permite testar antes de completado o sistema
Permite fazer manutenção do sistema módulo a módulo: Reduz probabilidade de haver consequências imprevistas
Permite desenvolvimento independente dos módulos: Simplifica trabalho em equipa
Permite reutilização dos módulos desenvolvidos
![Page 4: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/4.jpg)
Boa modularização
Módulos têm função única e bem definida
Módulos são coesos
Componentes internos com fortes ligações entre si
Existem poucas ligações entre os componentes internos?
Talvez se deva dividir o módulo…
Ligações entre módulos mínimas:
Existem muitas ligações entre os módulos? Talvez
devam formar um único módulo…
![Page 5: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/5.jpg)
Abstracção
In this connection it might be worthwhile to point out thatthe purpose of abstraction is not to be vague, but to createa new semantic level in which one can be absolutely precise.
Edsger W. Dijkstra, “The Humble Programmer”,Communications of the ACM, 15(10), 1972.
![Page 6: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/6.jpg)
Abstracção
Utilização de sistema olhando apenas para o
seu funcionamento externo
Limita quantidade de informação com que lidar Maior produtividade
Menor taxa de erros
![Page 7: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/7.jpg)
Encapsulamento
Única parte visível é a interface
Mecanismo interno dos módulos encerrado
numa cápsula (caixa preta)
Protege consumidor dos seus erros
Facilita abstracção
![Page 8: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/8.jpg)
Papeis do programador
Programador assume papeis distintos: Produtor
• Desenvolve mecanismo do módulo• Preocupa-se com:
• o que faz• como se usa• como funciona
Consumidor• Integra cada módulo em sistema complexo• Preocupa-se com:
• o que faz• como se usa• como funcionacomo funciona
![Page 9: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/9.jpg)
Contrato
Entre produtor e consumidor
Indica como se usa
Produtor garante resultados…
…se consumidor respeitar condições de
utilização
![Page 10: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/10.jpg)
Módulos em C++
Rotinas Funções
Conjunto de instruções, com interface bem
definida, que efectua um dado cálculo
Procedimentos
Conjunto de instruções, com interface bem
definida, que faz qualquer coisa
![Page 11: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/11.jpg)
Resolução de problemas
![Page 12: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/12.jpg)
Abordagem descendente(top down)
Análise global do problema Identificação de sub-problemas Resolução independentemente de cada
sub-problema usando a mesma abordagem Problemas e sub-problemas correspondem a rotinas
Vantagens Diminuição da informação a processar pelo programador
em cada instante Redução da complexidade dos problemas até à
trivialidade
![Page 13: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/13.jpg)
Problema
Escrever programa para somar duas fracções positivas fornecidas pelo utilizador e mostrar resultado no ecrã na forma de uma fracção irredutível
6/9 + 7/3 = 3/1
![Page 14: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/14.jpg)
Sub-problemas
1. Ler fracções
2. Calcular fracção soma reduzida
3. Escrever resultado
![Page 15: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/15.jpg)
Em C++
#include <iostream> using namespace std;
int main() { // Ler fracções: ... // Calcular fracção soma reduzida: ... // Escrever resultado: ...}
![Page 16: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/16.jpg)
Ler fracções
// Ler fracções:
cout << "Introduza duas fracções (numerador denominador): "; int n1, d1, n2, d2; cin >> n1 >> d1 >> n2 >> d2;
![Page 17: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/17.jpg)
Escrever resultado
// Escrever resultado:
cout << "A soma de "; escreveFracção(n1, d1); cout << " com "; escreveFracção(n2, d2); cout << " é "; escreveFracção(?, ?); cout << '.' << endl;
![Page 18: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/18.jpg)
Calcular fracção soma reduzida
// Calcular fracção soma reduzida
int n;int d;
![Page 19: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/19.jpg)
Calcular fracção soma reduzida
// Calcular fracção soma reduzida
int n = d2 * n1 + d1 * n2;int d = d1 * d2;
![Page 20: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/20.jpg)
Calcular fracção soma reduzida
// Calcular fracção soma reduzida
int n = d2 * n1 + d1 * n2;int d = d1 * d2;int k = mdc(n, d);n /= k;d /= k;
![Page 21: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/21.jpg)
Ler fracções
// 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; int k = mdc(n2, d2); n2 /= k; d2 /= k;
![Page 22: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/22.jpg)
Ler fracções
// 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; int k = mdc(n2, d2); n2 /= k; d2 /= k;
![Page 23: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/23.jpg)
Calcular fracção soma reduzida
// Calcular fracção soma reduzida
int n = d2 * n1 + d1 * n2;int d = d1 * d2;int k = mdc(n, d);n /= k;d /= k;
![Page 24: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/24.jpg)
Máximo divisor comum (I)
int m; // Inicializadasint n; // automagicamente!
int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;
m : int
n : int
k : int
![Page 25: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/25.jpg)
Máximo divisor comum (II)
int const m; // Inicializadasint const n; // automagicamente!
int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;
m : int {frozen}
n : int {frozen}
k : int
![Page 26: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/26.jpg)
Máximo divisor comum (III)
{ int const m; // Inicializadas int const n; // automagicamente!
int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;}
Encapsular código numa caixa
![Page 27: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/27.jpg)
Máximo divisor comum (IV)
mdc{ int const m; // Inicializadas int const n; // automagicamente!
int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;}
Nome do módulo
![Page 28: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/28.jpg)
Máximo divisor comum (V)
mdc(int const m, int const n){ int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;}
Parâmetros: variáveis ou constantes especiais de entrada
![Page 29: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/29.jpg)
Máximo divisor comum (VI)
mdc(int const m, int const n){ int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;
return r;}
Retorno e devolução: regressa ao ponto onde foi invocada e devolve valor guardado em r
![Page 30: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/30.jpg)
Máximo divisor comum (VII)
int mdc(int const m, int const n){ int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;
return r;}
Devolução de valor com tipo int
![Page 31: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/31.jpg)
Máximo divisor comum (VIII)
/** 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){ int r;
if(m < n) r = m; else r = n;
while(m % r != 0 or n % r != 0) --r;
return r;}
Cabeçalho: como se usa
Corpo: como funciona
Documentação: o que faz
![Page 32: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/32.jpg)
Máximo divisor comum (IX)
/** 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;}
Instruções de asserção (afirmação)
![Page 33: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/33.jpg)
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){}
Um procedimento não devolve nada: faz qualquer coisa
![Page 34: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/34.jpg)
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 << ‘/’ << d;}
![Page 35: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/35.jpg)
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() { ...}
![Page 36: Aula 3 Modularização: funções e procedimentos. Modularizar Arte de identificar claramente que módulos devem existir num sistema Sistema Modular Sistema.](https://reader035.fdocumentos.tips/reader035/viewer/2022062512/552fc11a497959413d8c96a5/html5/thumbnails/36.jpg)
Aula 3: Sumário
Modularização, abstracção e encapsulamento. Rotinas como unidades atómicas de modularização. Abordagem descendente. Sintaxe da definição de rotinas: cabeçalho vs. corpo. Interface e implementação. Contratos: pré-condições e condições objectivo. Instruções de asserção e programação por contrato. Parâmetros e argumentos. Instrução return. Retorno e devolução. Procedimentos: não há devolução (tipo de devolução void). Invocação de rotinas.