begin process at 2012 05 27 13:51:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > BIBLIOTHEQUE FONCTIONNELLE : OPÉRATIONS, COMPOSITION D'OBJETS FONCTIONS

BIBLIOTHEQUE FONCTIONNELLE : OPÉRATIONS, COMPOSITION D'OBJETS FONCTIONS


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :fonctions, objets, fonctionnel, opérateur, templates Niveau :Initié Date de création :22/12/2010 Date de mise à jour :23/12/2010 20:47:15 Vu / téléchargé :2 803 / 85

Auteur : ordiman85

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


 Description

Extension de la STL (http://www.cplusplus.com/reference/std/functional /) avec mes conventions de nommage, cette petite bibliothèque permet la définition de fonctions sous forme de classe.

Il peut être pratique de pouvoir définir des fonctions "objets", c'est-à-dire des objets dont l'opérateur '()' est défini, et qui possède des attributs et des méthodes comme tout objet. Comme cela vous pouvez définir des méthodes "setAccuracy" ou "setPrecision", "setCoefficients", "setKnotVector", etc. Utilisée sans abus, elle peut vous donner un code plus concis à l'utilisation des fonctions définies à partir de ces templates.

Cette bibliothèque inclus les opérateurs + - * / et % (composition à ne pas confondre avec le modulo classique), permettant de pouvoir appeler les fonctions sous la forme (f + g)(x) par exemple.

Source

  • #include "Function.h"
  • #include "Integral.h"
  • #include <iostream>
  • /* Exemple d'utilisation des fonctions sous forme d'objet */
  • /* Définition des fonctions de type R -> R */
  • typedef std::unary_function<double, double> RealFunction;
  • /* Une simple fonction x² */
  • class SquareFunction : public RealFunction
  • {
  • public:
  • double operator () ( double x ) const { return x*x; }
  • };
  • /* Une fonction polynôme */
  • class PolynomFunction : public RealFunction
  • {
  • public:
  • PolynomFunction( double * coeffs, int degree ) : _coeffs( coeffs ), _degree( degree ) {}
  • double operator () ( double x ) const
  • {
  • double y = 0.0, xn = 1.0;
  • int i;
  • for ( i = _degree; i >= 0; i-- )
  • {
  • y += _coeffs[ i ] * xn;
  • xn *= x;
  • }
  • return y;
  • }
  • protected:
  • double * _coeffs;
  • int _degree;
  • };
  • /* Une classe vecteur (qui n'est pas une fonction) */
  • class Vector3
  • {
  • public:
  • Vector3( double x, double y, double z ) : _x( x ), _y( y ), _z( z ) {}
  • double length() const { return sqrt( _x * _x + _y * _y + _z * _z ); }
  • private:
  • double _x, _y, _z;
  • };
  • /* Une classe hélice */
  • class Helix3 : public std::unary_function<double, Vector3>
  • {
  • public:
  • Vector3 operator () ( double t ) const { return Vector3( cos( t ), sin( t ), t ); }
  • // Vecteur tangent
  • Vector3 derivative( double t ) const { return Vector3( -sin( t ), cos( t ), 1. ); }
  • };
  • int main(int argc, char **argv)
  • {
  • using std::cout;
  • using std::endl;
  • // x²
  • double coeffs1[] = { 1, 0, 0 };
  • PolynomFunction polynom1( coeffs1, 2 );
  • // 2x + 1
  • double coeffs2[] = { 2, 1 };
  • PolynomFunction polynom2( coeffs2, 1 );
  • // L'opérateur '%' est défini comme l'opérateur de composition.
  • // Ceci revient à calculer (2x + 1)²
  • cout << "Calcul de (2x + 1)² avec x = 3 : " << ( polynom1 % polynom2 )( 3. ) << endl;
  • // Utilisation de la méthode adaptive de l'intégration de Simpson.
  • SimpsonIntegral<PolynomFunction> integral( polynom1 );
  • cout << "Intégrale de x² sur [0,1] : " << integral( 0., 1. ) << endl;
  • // Utilisation d'un adaptateur pour les intégrales de fonctions plus complexes.
  • cout << "Intégrale de x² + 2x + 1 sur [0,1] : " << simpson_integral( polynom1 + polynom2 )( 0., 1. ) << endl;
  • // Composition avec appel de la méthode &Vector3::length :
  • //
  • // std::mem_fun_ref( &Vector3::length ) crée un objet fonction pointant sur la méthode Vector3::length.
  • //
  • // Helix3 : R -> R^3
  • // Vector3::length : R^3 -> R
  • // h : R -> R
  • //
  • // avec h(x) = Vector3::length( Helix3( x ) )
  • cout << "Distance de l'hélice à l'origine à t = pi : " << ( std::mem_fun_ref( &Vector3::length ) % Helix3() )( M_PI ) << endl;
  • // Calcul de la longueur parcourue sur une courbe :
  • //
  • // Pour composer des fonctions, nous devons s'assurer qu'elles sont unaires.
  • // Dans le cas contraire, nous devons fixer un des arguments.
  • // std::bind1st( f( x, y ), c ) est équivalent à g( y ) = f( c, y ) avec x = c fixé.
  • //
  • // Helix3::derivative est considérée comme une fonction binaire (accepte '*this' et un réel t).
  • //
  • // Ici nous calculons l'intégrale de la norme du vecteur tangent de la courbe.
  • cout << "Longueur parcourue sur une hélice pour t dans [0,pi] : " <<
  • simpson_integral(
  • std::mem_fun_ref( &Vector3::length ) % std::bind1st( std::mem_fun_ref( &Helix3::derivative ), Helix3() )
  • ) ( 0., M_PI ) << endl;
  • return 0;
  • }
#include "Function.h"
#include "Integral.h"
#include <iostream>

/* Exemple d'utilisation des fonctions sous forme d'objet */

/* Définition des fonctions de type R -> R */
typedef std::unary_function<double, double> RealFunction;

/* Une simple fonction x² */
class SquareFunction : public RealFunction
{
public:
	double operator () ( double x ) const { return x*x; }
};

/* Une fonction polynôme */
class PolynomFunction : public RealFunction
{
public:
	PolynomFunction( double * coeffs, int degree ) : _coeffs( coeffs ), _degree( degree ) {}
	double operator () ( double x ) const
	{
		double y = 0.0, xn = 1.0;
		int i;

		for ( i = _degree; i >= 0; i-- )
		{
			y += _coeffs[ i ] * xn;
			xn *= x;
		}
		return y;
	}
protected:
	double * _coeffs;
	int _degree;
};

/* Une classe vecteur (qui n'est pas une fonction) */
class Vector3
{
public:
	Vector3( double x, double y, double z ) : _x( x ), _y( y ), _z( z ) {}
	double length() const { return sqrt( _x * _x + _y * _y + _z * _z ); }
private:
	double _x, _y, _z;
};

/* Une classe hélice */
class Helix3 : public std::unary_function<double, Vector3>
{
public:
	Vector3 operator () ( double t ) const { return Vector3( cos( t ), sin( t ), t ); }
	// Vecteur tangent
	Vector3 derivative( double t ) const { return Vector3( -sin( t ), cos( t ), 1. ); }
};


int main(int argc, char **argv)
{
	using std::cout;
	using std::endl;

	// x²
	double coeffs1[] = { 1, 0, 0 };
	PolynomFunction polynom1( coeffs1, 2 );

	// 2x + 1
	double coeffs2[] = { 2, 1 };
	PolynomFunction polynom2( coeffs2, 1 );

	// L'opérateur '%' est défini comme l'opérateur de composition.
	// Ceci revient à calculer (2x + 1)²
	cout << "Calcul de (2x + 1)² avec x = 3 : " << ( polynom1 % polynom2 )( 3. ) << endl;

	// Utilisation de la méthode adaptive de l'intégration de Simpson.
	SimpsonIntegral<PolynomFunction> integral( polynom1 );
	cout << "Intégrale de x² sur [0,1] : " << integral( 0., 1. ) << endl;

	// Utilisation d'un adaptateur pour les intégrales de fonctions plus complexes.
	cout << "Intégrale de x² + 2x + 1 sur [0,1] : " << simpson_integral( polynom1 + polynom2 )( 0., 1. ) << endl;

	// Composition avec appel de la méthode &Vector3::length :
	//
	// std::mem_fun_ref( &Vector3::length ) crée un objet fonction pointant sur la méthode Vector3::length.
	//
	// Helix3 : R -> R^3
	// Vector3::length : R^3 -> R
	// h : R -> R
	//
	// avec h(x) = Vector3::length( Helix3( x ) )
	cout << "Distance de l'hélice à l'origine à t = pi : " << ( std::mem_fun_ref( &Vector3::length ) % Helix3() )( M_PI ) << endl;

	// Calcul de la longueur parcourue sur une courbe :
	//
	// Pour composer des fonctions, nous devons s'assurer qu'elles sont unaires.
	// Dans le cas contraire, nous devons fixer un des arguments.
	// std::bind1st( f( x, y ), c ) est équivalent à g( y ) = f( c, y ) avec x = c fixé.
	//
	// Helix3::derivative est considérée comme une fonction binaire (accepte '*this' et un réel t).
	//
	// Ici nous calculons l'intégrale de la norme du vecteur tangent de la courbe.
	cout << "Longueur parcourue sur une hélice pour t dans [0,pi] : " <<
		simpson_integral(
			std::mem_fun_ref( &Vector3::length ) % std::bind1st( std::mem_fun_ref( &Helix3::derivative ), Helix3() )
		) ( 0., M_PI ) << endl;
	return 0;
}

 Conclusion

Sur le même modèle il est tout à fait possible de définir les opérateurs && || etc. pour étendre cette librairie. Ou bien définir les opérateurs (fonction + réel)(x), (fonction * réel)(x), (en n'oubliant pas la commutativité).

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 décembre 2010 20:47:15 :
/1/ Choix de se baser sur la STL au lieu de réécrire les mêmes structures de base (unary_function par ex.). /2/ Ajout d'autres exemples. /3/ Suppression de using namespace. /4/ Correction 'librairie' -> 'bibliothèque'.

 Sources du même auteur

Source avec Zip Source avec une capture COURBES NURBS 3D DANS OPENSCENEGRAPH
Source avec Zip LIBRAIRIE JSON C++
Source avec Zip Source avec une capture [WIN32] EASY WAVE MIXER
Source avec Zip Source avec une capture [C++] HASH FINDER - CALCULATEUR DE HASH
Source avec Zip Source avec une capture CONTROLEUR DE VOLUME SONORE EN C [ API WINDOWS ]

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [C++] CLASSE DE GESTION DE FONCTIONS par pop70
Source avec Zip EVALUATEUR D'EXPRESSION AVEC VARIABLES INDEXÉES par DragonRapide
Source avec Zip Source avec une capture BOITE A OUTILS MATHÉMATIQUES POUR L'ALGÈBRE LINÉAIRE ET L'... par BOLLOTD
Source avec une capture [C] BALLES REBONDISSANTES EN SDL par smartties
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70

Commentaires et avis

Commentaire de CptPingu le 23/12/2010 15:07:33 administrateur CS

C'est propre, commenté en Doxygen, et le code est élégant. C'est du bon travail.

Quelques petites remarques:
- Library se traduit par bibliothèque et non librairie (bookstore en anglais). Ça pique un peu aux yeux, c'est dommage.
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Essaie de séparer le code de sa définition, avec des .hxx. Néanmoins, comme ton code est concis, je comprends que tu n'es pas fait la séparation. J'aurais sûrement fait pareil.

C'est rare d'avoir du code intéressant, et celui-ci en fait partie.

Commentaire de ordiman85 le 23/12/2010 20:58:19

Merci pour ces remarques. Et merci pour le conseil du "using namespace", désormais je ne serai plus un abuseur de cette atrocité ! Etant très attaché à la propreté du code, si tu as d'autres conseils, je suis preneur !

"Essaie de séparer le code de sa définition"
Je suppose que tu parles de séparer les déclarations et l'implémentation, malheureusement je n'ai pas trouvé de solution, puisque mes structures sont des templates.

PS : je viens de modifier la source, avec pas mal de modifs dont le mot 'bibliothèque' ;)

Commentaire de CptPingu le 23/12/2010 21:28:40 administrateur CS 10/10

Je parlais de faire des .hxx, regarde mes sources, j'utilise ce genre de procédé (donc .cc, .hh et .hxx ou .cpp, .hpp, .hxx).
Dans ton cas, vu que la plupart des classes sont très concises, ce n'est pas nécessaire (je l'aurais peut être fait juste pour "SimpsonIntegral", mais c'est franchement pour pinailler :p).

(10 pour la propreté, c'est cette qualité là qui doit être montré à des débutants).

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

AIDE: CHERCHE TUTORIEL SUR LES FONCTIONS GRAPHIQUES [ par Mmuller57 ] je CHERCHE un TUTORIEL sur LES FONCTIONS GRAPHIQUES en C++(tracer une ligne, un cercle, un carrée, un rectangle, un polygone et le tout en C++ !). Je liste de fonctions [ par niconico ] quelqu'un aurait-il l'adresse d'un site ou je pourrait trouver la liste des fonctions en C++; ou au moins celles relatives a la creation, modification problèmes liens entre fichiers C et C++ dans un projet Visual C++ 6.0 [ par nico ] J'ai récupéré un projet contenant des fichiers écrits en C. Le fichier "principal" de ce projet également écrit en C fait appel à des fonctions se tro codes C++ pour TAPI et MAPI [ par Francky ] Bonjour,Je recherches des codes sources C++ pour les les fonctions TAPI (téléphone) et fonctions MAPI (mails).Merci d'avance. Tutorial sur les templates [ par mikez ] Est-ce que quelqu'un connait un bon tutorial sur la prog des templates? Comment utiliser InternetOpen(...), CloseHandle(...) et autres fonctions se rapportant au Web ? [ par Tiot Seb ] Salut amis programmeurs sous Visual C++!J'ai besoin, pour un projet de stage, de pouvoir, ouvrir et fermer Internet Explorer. En fait, je dois créer u classes ou juste fonctions ? [ par madVinz ] Salut!Comment choisir entre faire des classes ou juste des fonctions ???merci, @+ <bios.h>aidez moi aussi pour les fonctions geaphiques sous dev c++ 4.0 [ par riderpro ] Voila il me faut &lt;bios.h&gt; pour dev c++ 4.0 sinon je ne peux pas faire mes progs pleas entrz en contact pour coopération Tableau de correspondance des fonctions c++ et de leur fichier #include [ par guguy ] BonjourJ'aimerais savoir s'il serait possible de trouver un tableau de correspondance entre les fonctions c++ et leur fichier #include (ex : cout -&gt Un troisième défi en C ou C++ [ par ShArK ] Un cambrioleur entre par effraction dans une maison et désire emporter quelques-uns des objets de valeur qui s'y trouvent. Il n'est capable que de por


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales