Buscar

Programação Modular


Continue navegando


Prévia do material em texto

PROGRAMAÇÃO MODULAR
Objetivos: 
A programação modular é uma técnica de programação que tem por objetivo simplificar o desenvolvimento de programas através de sua divisão em “partes”.
	Cada uma dessas “partes” pode ser mais facilmente entendida, programada, testada e modificada, pois o problema que está sendo resolvido é menor.
Um algoritmo não modular
	Em um algoritmo que não utiliza os conceitos de programação modular, é importante destacar:
“Partes” de programa são escritas mais de uma vez.
O algoritmo, está dentro das “normas” estabelecidas pela programação estruturada.
Exemplo: um algoritmo que lê um vetor unidimensional de 10 elementos e, em seguida, lê vários vetores de 10 elementos cada. Para cada vetor lido, mostra cada elemento que possui conteúdo idêntico ao do elemento que está na mesma posição no 1º, vetor. O fim dos vetores é indicado por um vetor no qual a soma dos seus três primeiros elementos é igual a 30.
INICIO
	vez ( 1;
	ENQUANTO (vez <= 10)
 	 INICIO
		LEIA primeiro[vez]
 		Vez ( vez + 1
 FIM_ENQUANTO
	vez ( 1;
	ENQUANTO (vez <= 10)
 	 INICIO
		LEIA outro{vez]
 		Vez ( vez + 1
 FIM_ENQUANTO
	Soma ( outro[1] + outro[2] + outro[3]
	ENQUANTO(soma <> 10)
	 INICIO
		vez ( 1;
		ENQUANTO (vez <= 10)
 	 INICIO
			LEIA outro{vez]
 			Vez ( vez + 1
 	 FIM_ENQUANTO
 FIM_ENQUANTO
	
 FIM_ENQUANTO
FIM
Escrevendo Várias Funções no mesmo Programa
Você pode escrever quantas funções quiser em um programa, e qualquer função pode chamar uma outra. Em C++, não é permitido definir uma função dentro de outra função.
Por exemplo, vamos fazer um programa que imprima o texto e a moldura centralizados nas linhas do vídeo.
A saída então, tem o seguinte layout:
**********************
 * FELIZ ANIVERSARIO * 
**********************
#include <cstdlib>
#include <iostream>
using namespace std;
void linha(int n); //prototipo
void espacos(int n);
int main(int argc, char *argv[])
{
 cout << '\n';
 espacos(30);
 linha(21);
 cout << endl;
 espacos(30);
 cout << "* FELIZ ANIVERSARIO *" << endl;
 espacos(30);
 linha(21);
 cout << '\n' << endl;
 
 system("PAUSE");
 return EXIT_SUCCESS;
}
//funcao linha()
//Desenha uma linha de asteriscos na tela
void linha (int n)
{
 for (int i = 0; i < n; i++)
 {
 cout << '*';
 }
}
//funcao espacos()
//Imprime espacos em branco
void espacos (int n)
{
 for (int i = 0; i < n; i++)
 {
 cout << ' ';
 }
}
Chamadas de Funções usadas como argumentos de outras Funções
Você já sabe que a chamada a uma função pode ser utilizada em uma expressão da mesma forma que usamos valores numéricos. Podemos utilizar a chamada a uma função como argumento para outra função.
O próximo exemplo calcula a soma dos quadrados de dois números fornecidos pelo usuário:
#include <cstdlib>
#include <iostream>
using namespace std;
float somasqr (float m, float n);;//prototipo
float sqr (float z); //prototipo
float soma(float m, float n);//protótipo
int main(int argc, char *argv[])
{
 float a, b;
 cout << "\nDigite dois numeros, não inteiros: ";
 cin >> a >> b;
 cout <<"\nA soma dos quadrados eh: " << somasqr(a,b);
 cout << '\n';
 cout << endl;
 
 system("PAUSE");
 return EXIT_SUCCESS;
}
//somasqr()
//Calcula a soma dos quadrados de dois umeros
float somasqr(float m, float n)
{
 return soma(sqr(m), sqr(n));
}
//sqr()
//Calcula o quadrado de um numero
float sqr(float z)
{
 return z * z;
}
//soma()
//Calcula a soma de dois números
float soma (float m, float n)
{
 return m + n;
}
O Operador Unário de Referência
	Com o operador de referência podemos montar novos tipos de dados chamados de referências. Referência é um outro nome para uma variável já existente. As instruções: 
int n;
int& A = n;
informam que A é um outro nome para n. Toda operação em qualquer um dos nomes tem o mesmo resultado. A referência não é uma cópia da variável a que se refere, é a mesma variável sob nomes diferentes. As instruções:
int n;
int& A = n;
n = 5;
cout << A;
A = 8;
cout << n
Imprimem 5 e 8.
O operador unário &, quando usado na criação de referências, faz parte do tipo
int&	é um tipo de dado.
Toda referência deve obrigatoriamente ser inicializada.
int n; 
int& A; //Errado
int& A = n; //Correto
Passagem por Referência
	Um dos usos de referências é na passagem de argumentos para funções. Os exemplos vistos até o momento passam argumentos por valor. Quando argumentos são passados por valor, a função chamada cria variáveis e copia nelas o valor dos argumentos passados. Dessa forma, a função não tem acesso às variáveis originais da função que chamou; portanto, ela não poderá efetuar qualquer modificação nelas.
	A principal vantagem da passagem por referência é a de que a função pode acessar as variáveis da função que chamou. Esse mecanismo possibilita que uma função retorne mais de um valor para a função que chama. Os valores a ser retornados são colocados em referências de variáveis da função chamadora. 
	O próximo exemplo, mostra o uso simples de referência como argumento de uma função.
//Mostra a passagem de argumentos por referência
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
void reajusta20(float& p, float& r);//prototipo
int main(int argc, char *argv[])
{
 float preco, valReajustado;
 do
 {
 
 cout <<"\nInsira o preco atual ou 0 para terminar: ";
 cin >> preco;
 reajusta20(preco,valReajustado);
 cout << setprecision(2) 
 << setiosflags(ios::showpoint);
 cout << "\nPreco novo = " << setw(4) << preco << endl;
 cout << "\nAumento = " << setw(4) <<valReajustado << endl; 
 }while (preco != 0.0);
 
 system("PAUSE");
 return EXIT_SUCCESS;
}
//reajusta20()
//Reajusta o preco em 20%
void reajusta20(float& p, float& r)
{
 r = p * 0.2;
 p = p * 1.2;
} 
O programa solicita que o usuário insira o preço atual de uma mercadoria, modifica o preço para um valor reajustado em 20% e calcula o valor do aumento.
Observe que a função reajusta20() poderia encontrar o novo preço e o valor do reajuste sem usar referências, mas como essas informações seriam passadas para main()? Pelo comando return só é possível retornar um valor, mas não dois. 
Funções que recebem argumentos por referência, utilizam o operador & somente na definição do tipo do argumento. 
Observe que a chamada a uma função que recebe uma referência é idêntica à chamada às funções em que os argumentos são passados por valor. 
A declaração
				float& p, float& r
indica que p e r são outros nomes para as variáveis passadas como argumentos pela função que chama. Em outras palavras, quando usamos p e r, na realidade usamos preco e valReajustado de main(); 
Referências não existem em linguagem C, apenas em C++. Em linguagem C passamos argumentos por referência usando ponteiros.