quinta-feira, 15 de janeiro de 2009

Gabarito de Função em linguagem c estruturada

Estudando mais profundamente a linguagem de programação C++ acabei chegando a conclusão que ela possui tantos recursos excelentes para facilitar a programação, que no fim acabam atrapalhando, muito se discute que C++ é mais eficiente que a lingaugem de programação JAVA que é multiplataforma, mas estudando bem a estrutura de sistemas e o fato de ser multiplataforma acabei chegando a conclusão que se desejo fazer algo realmente eficiente o farei em c estruturando e usando muito os ponteiros, os recursos adicionais podem ser implementados de outra maneira na linguagem c, através de ponteiros para funções, diretivas de programação e uso de macrofunções. A diferença é que se bem implementado em c, fica muito mais eficiente, sem mencionar o aspecto na previsibilidade que o coloca ainda como uma das linguagens preferidas para o desenvolvimento de sistemas operacionais, como por exemplo o unix, linux, bsd's e por ai vai ...!

Um dos aspectos que mosto que é possível fazer com a linguagem c estruturada, é o uso de gabaritos de funções
Logo abaixo menciono como fazer um gabarito de funções utilizando-se de macrofunções.
No exemplo que colocarei logo mais, a função retornará o maior valor entre três números passados para a função
Utilizando macrofunções basta colocar a mesma condição de maioridade e retornar o maior valor, fiz isso aos pares, devido a definição de comparação se dar aos pares e para ficar mais claro.
Abaixo mostro o código com as linhas:

#define MAIOR2(x, y) ( (y>x)? (y): (x))
#define MAIOR3(x, y, z) ( (MAIOR2(x, y)>MAIOR2(x, z))? (MAIOR2(x, y)): (MAIOR2(x, z)))

Realizando a mesma tarefa que o gabarito de função:
template< class T>
T maximo1( T x, T y, T z)
{
T max = x;
if( y > max )
max = y;
if( z > max )
max = z;
return max;
}

Claro que o fato de possuir sintaxe específica, torna o código em c++ mais legível, entretanto se o motivo de se desenvolver em c++ for a eficiência é bom pensar em desenvolver em c, pois é mais eficiente e previsível

Fiz o código para testar a veracidade que é possível fazer gabaritos de função com macrofunções em três arquivos: são eles respectivamente:
- maximo.cpp
- novomain1.cpp
- maximo.h
Abaixo o código inteiro que fiz para testar:




//Este exemplo apresenta o uso de gabaritos de função em C++.
//Autor: Danilo Matias
//E-mail: danilomatias19@gmail.com


template
< class T>

T maximo1( T x, T y, T z)
{

T max = x;

if
( y > max )
max = y;

if
( z > max )
max = z;

return
max;
}





#line 48
/*
* File: novomain1.cpp
* Author: danilomatias192gmail.com
*
* Created on 15 de Janeiro de 2009, 16:00
*/


#include <stdlib.h>
#include "maximo.cpp"
#include "maximo.h"
#include <c++/4.1.2/iostream>

#include <c++/4.1.2/cstdlib>

/*
*
*/



using
std :: cout;

using
std :: cin;
using
std :: endl;


void
a1();
void
a2();
int
main(int argc, char** argv) {

a1();
a2();
return
(EXIT_SUCCESS);
}

void
a2()
{


int
a=5,b=3,c=8;
float
x=5.002,y=3.005,z=5.0001;

char
s1,s2,s3;
cout <<"Os tres numeros inteiros sao "<< a <<" " << b <<" " << c ;

cout <<"\nO maior numero inteiro eh: " <<MAIOR3(a, b, c)<<endl;

//cout <<"\n\nEntre com 3 numeros reais: ";
//cin >>x >>y >>z;
cout <<"Os tres numeros reais sao "<< x <<" " << y <<" " << z<<endl;

cout <<"\nO maior numero float eh: " <<MAIOR3(x, y, z);
cout <<"\n\nEntre com 3 caracteres: ";

cin >>s1 >>s2 >>s3;
cout <<"\nO maior caracter eh: " <<MAIOR3(s1, s2, s3) <<endl;

}


void
a1()
{

int
a=5,b=3,c=8;

float
x=5.002,y=3.005,z=5.0001;
char
s1,s2,s3;

cout <<"Os tres numeros inteiros sao "<< a <<" " << b <<" " << c ;

cout <<"\nO maior numero inteiro eh: " <<maximo1(a,b,c)<<endl;
//cout <<"\n\nEntre com 3 numeros reais: ";
//cin >>x >>y >>z;

cout <<"Os tres numeros reais sao "<< x <<" " << y <<" " << z<<endl;

cout <<"\nO maior numero float eh: " <<maximo1(x,y,z);
cout <<"\n\nEntre com 3 caracteres: ";

cin >>s1 >>s2 >>s3;
cout <<"\nO maior caracter eh: " <<maximo1(s1,s2,s3) <<endl;

//main1trrx();
}


#line 20
/*
* File: maximo.h
* Author: danilomatias
*
* Created on 15 de Janeiro de 2009, 16:47
*/


#ifndef _MAXIMO_H
#define _MAXIMO_H

#ifdef __cplusplus
extern "C" {/* apenas para indicar explicitamente ao compilador que a linguagem a ser compilada é a c e não a c++*/

#endif

#define MAIOR2(x, y) ( (y>x)? (y): (x))
#define MAIOR3(x, y, z) ( (MAIOR2(x, y)>MAIOR2(x, z))? (MAIOR2(x, y)): (MAIOR2(x, z)))


#ifdef __cplusplus
}
#endif

#endif /* _MAXIMO_H */









Um link que indico é:


http://poghouse.blogspot.com/2010/04/templates-em-c.html"











Bem Espero que ajude ...!
Lembre-se pra fazer o gabarito de função pensa-se na operação coloca ela lá e o q ela deve retornar ...!

Até a próxima!