Publicado em Programação

Criação e Protecção de “header files” em C++

Uma forma de organizarmos o nosso programa consiste em separar as funções, classe e outros elementos em ficheiros distintos.

Seguindo a velha máxima de “dividir para conquistar”, é muito mais simples fazer uma alteração num programa correctamente sepadado num conjunto de ficheiros com conteúdos específicos, do que propriamente percorrer um ficheiro único com milhares de linhas de código.

Vou apresentar um exemplo que dados dois números inteiros calcula os resultados das operações aritméticas de adição, subtracção, multiplicação e divisão.

Este exemplo vai ser apresentado por fases, em cada uma das quais se vai introduzindo um novo aspecto.

Fase 1

Programa escrito num único ficheiro e sem recorrer à utilização de funções.
main.cpp

#include <iostream>
using namespace std;
int main(){
	int x, y;

	cout << "x = "; cin >> x;
	cout << "y = "; cin >> y;

	cout << x << " + " << y << " = " << x + y << endl;
	cout << x << " - " << y << " = " << x - y << endl;
	cout << x << " * " << y << " = " << x * y << endl;
	cout << x << " / " << y << " = " << (float)x / y << endl;
}&#91;/sourcecode&#93;

<span style="color:#3366ff;">Observações</span>
<ul>
	<li>Facilmente se identificam as linhas que contêm as operações aritméticas ( 9 a 12);</li>
	<li>A complexidade destas operações é muito baixa, pelo que devemos imaginar que perante cálculos mais elaborados o princípio do exemplo se mantém.</li>
</ul>
<strong><span style="color:#3366ff;">Fase 2</span></strong>

<strong> </strong>

Programa escrito num único ficheiro e <span style="text-decoration:underline;">recorrendo</span> à utilização de funções.
<strong><strong>main.cpp</strong></strong>

#include <iostream>
using namespace std;
int soma(int a, int b){
	return a + b;
}

int diferenca(int a, int b){
	return a - b;
}

int produto(int a, int b){
	return a * b;
}

float quociente(int a, int b){
	return ((float)a / b);
}

int main(){
	int x, y;

	cout << "x = "; cin >> x;
	cout << "y = "; cin >> y;

	cout << x << " + " << y << " = " << soma(x, y) << endl;
	cout << x << " - " << y << " = " << diferenca(x, y) << endl;
	cout << x << " * " << y << " = " << produto(x, y) << endl;
	cout << x << " / " << y << " = " << quociente(x, y) << endl;
}
&#91;/sourcecode&#93;

<span style="color:#3366ff;">Observações</span>
<ul>
	<li>Mantém-se um único ficheiro de código;</li>
	<li>Foram criadas funções para realizarem os cálculos;</li>
	<li>Como estamos a utilizar inteiros (int) foi necessário utilizar um type cast no caso da divisão, para evitar arredondamentos a inteiro.</li>
</ul>
<strong><span style="color:#3366ff;">Fase 3</span></strong>

<strong> </strong>

As funções são retiradas do <strong>main.cpp</strong> e colocadas no ficheiro <strong>aritmetica.h</strong>, a nossa header file.
<strong><strong>main.cpp</strong></strong>

#include <iostream>
#include "aritmetica.h"
using namespace std;

int main(){
	int x, y;

	cout << "x = "; cin >> x;
	cout << "y = "; cin >> y;

	cout << x << " + " << y << " = " << soma(x, y) << endl;
	cout << x << " - " << y << " = " << diferenca(x, y) << endl;
	cout << x << " * " << y << " = " << produto(x, y) << endl;
	cout << x << " / " << y << " = " << quociente(x, y) << endl;
}
&#91;/sourcecode&#93;

<strong><strong></strong></strong>

<strong><strong></strong></strong>

<strong><strong> </strong></strong>
<strong><strong><strong><strong>aritmetica.h</strong></strong></strong></strong>

int soma(int a, int b){
	return a + b;
}

int diferenca(int a, int b){
	return a - b;
}

int produto(int a, int b){
	return a * b;
}

float quociente(int a, int b){
	return ((float)a / b);
}

Observações

  • As funções passam a estar definidas num ficheiro à parte e tornam-se reutilizáveis em qualquer outro programa, bastando utilizar a directiva #include “nome_da_header_file”.
  • Quanquer alteração a uma fórmula de cálculo passa exclusivamente pela edição do ficheiro que a contém.

Fase 4

Por fim, e para evitar os erros derivados da utilização das nossas funções nas diferentes partes que formam o nosso projecto, torna-se necessário a utilização da directiva #ifndef, o que se pode fazer de forma relativamente simples.
aritmetica.h

#ifndef ARITMETICA_H
#define ARITMETICA_H
int soma(int a, int b){
	return a + b;
}

int diferenca(int a, int b){
	return a - b;
}

int produto(int a, int b){
	return a * b;
}

float quociente(int a, int b){
	return ((float)a / b);
}
#endif

Observações

  • Basta acrescentar as linhas 1, 2 e 18;
  • O nome ARITMETICA_H é escolhido por nós, e esta é mais ou menos uma norma;

Nota final

Embora este exemplo tenha sido contruído segundo o paradigma procedimental, estes conceitos são fundamentais para quem estiver a pensar em escrever e compreender alguns exemplos de programas escritos segundos os paradigmas ADT e OOP.

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s