begin process at 2012 05 27 14:07:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > UNE CALCULATRICE TRAITANT LES CARACTÈRES....

UNE CALCULATRICE TRAITANT LES CARACTÈRES....


 Information sur la source

 Description

C'est une calculatrice que j'ai récuperer de chez wrox, un livre nommé visual c++, de monsieur Horton Ivor, et je m'en suis servit pour traiter des opération mathématique simple. La fonction traite les parenthèses, ça aide ^^.
Je n'ai pas touché au char... je ne les ai pas traduit en TCHAR, mais elle fonctionne quand meme. ;)


Source

  • // maDLL.cpp : définit les fonctions exportées pour l'application DLL.
  • //
  • #include "stdafx.h"
  • // Programme créant une calculatrice
  • //#include <iostream> // Pour le flot entré sortie
  • #include <cstdlib> // Pour la fonction exit()
  • #include <cctype> // Pour la fonction isdigit()
  • using namespace std;
  • const int MAX = 255;
  • void eatspace(char * str);
  • double expr(char* str); // fonction évaluant une expression arithmétique
  • double term(char* str, int& index); // Fonction extrayant la valeur d'un terme
  • double number(char* str, int& index); // fonction reconnaissant un nombre dans une chaine
  • char* extract(char* str, int& index); // Fonction extrayant une sous-chaine entre parenthèse
  • extern "C" __declspec(dllexport) double __stdcall calcul(char* buffer)
  • {
  • // char* buffer = {0}; //Zone de stockage de l'expression
  • //strcpy_s(buffer,sizeof(texte),texte);
  • for(;;)
  • {
  • eatspace(buffer);
  • if(!buffer[0])
  • return 0;
  • return expr(buffer);
  • }
  • }
  • char* extract(char* str, int& index)
  • {
  • char buffer[MAX]; // Espace temporaire pour une sous chaine
  • char* pstr = 0; // Pointeur désignant la nouvelle chaine à retourner
  • int numL = 0; // Nombre de parenthèse gauche
  • int bufindex = index; // Enregistre la valeur de début de l'index
  • do
  • {
  • buffer[index - bufindex] = *(str + index);
  • switch(buffer[index - bufindex])
  • {
  • case ')':
  • if(numL == 0)
  • {
  • buffer[index - bufindex] = '\0'; // Remplacd ')' par '\0'
  • ++index;
  • pstr = new char[index - bufindex];
  • if(!pstr)
  • {
  • //cout << "Erreur d'allocation de mémoire,"
  • // << " programme terminé.";
  • exit(1);
  • }
  • strcpy_s(pstr,sizeof(buffer), buffer); // Copy la sous chaine dans la nouvelle mémoire..
  • return pstr;
  • }
  • else
  • numL--;
  • break;
  • case '(': numL ++;break; // Augmente le nombre de ( à égaliser
  • }
  • } while(*(str + index++) != '\0'); // Boucle - ne pas dépasser la fin de la chaine
  • exit(1);
  • return pstr;
  • }
  • void eatspace(char * str)
  • {// cout << "\nentrée de eatspace\n";
  • int j = 0; // index source de la chaine
  • int i = 0; // index cible de la chaine
  • while((*(str + i) = *(str + j++)) != '\0')
  • if(*(str + i) != ' ')
  • i++;
  • // cout << "\nsorti de eatspace\n";
  • return;
  • }
  • //fonction reconnaissant un nombre dans une chaine
  • // ou une expression entre parenthèse
  • double number(char* str, int& index)
  • {
  • double value = 0.0; // Stock la valeur résultante
  • //cout << "\nentrée de number\n";
  • if(*(str + index) == '(') // Début des parenthèse
  • {
  • char* psubstr = 0; // Pointeur de sous chaine
  • psubstr = extract(str, ++index); // Extrait la sous-chaine entre parenthèse
  • value = expr(psubstr); // Extrait la valeur de la sous chaine
  • delete[] psubstr; // Nettoie le tas
  • return value;
  • }
  • // Récupération de la partie entière du nombre
  • while(isdigit(*(str + index))) //
  • value = 10 * value + (*(str + index++) - 48);
  • if((*(str + index) != '.')&&(*(str + index) != ','))
  • return value;
  • double factor = 1.0;
  • // Récupération de la partie décimal du nombre
  • while(isdigit(*(str + (++index))))
  • {
  • factor *= 0.1;
  • value = value + (*(str +index) - 48)*factor;
  • }
  • return value;
  • }
  • // Fonction extrayant la valeur d'un terme
  • double term(char* str, int& index)
  • { //cout << "\nentré dans term\n";
  • double value = 0.0; // Cumul du résultat
  • value = number(str, index); //Extrai du 1er nombre du term
  • // Itération tant que l'opérateur n'est pas aproprié
  • while((*(str + index) == '*') || (*(str + index) == '/'))
  • {
  • if(*(str + index) == '*')
  • value *= number(str, ++index);
  • if(*(str + index) == '/')
  • value /= number(str, ++index);
  • }
  • //cout << "\nsortie dans term\n";
  • return value;
  • }
  • //fonction évaluant une expression arithmétique
  • double expr(char* str)
  • { //cout << "\nentré dans expr\n";
  • double value = 0.0; // Stocke le résultat ici
  • int index = 0; // Suit l'emplacement du caractère courant
  • value = term(str, index); // Extrait le premier terme
  • for(;;) // boucle infini
  • {
  • switch(*(str + index++)) // choisie l'opération à partir du caractère courant
  • {
  • case '\0': return value;
  • case '+' : value += term(str, index); break;//
  • case '-' : value -= term(str, index); break;//
  • default :
  • exit(1);
  • }
  • }
  • // cout << "\nsorti de expression\n";
  • }
// maDLL.cpp : définit les fonctions exportées pour l'application DLL.
//

#include "stdafx.h"

// Programme créant une calculatrice
//#include <iostream>						// Pour le flot entré sortie
#include <cstdlib>						// Pour la fonction exit()
#include <cctype>						// Pour la fonction isdigit()
using namespace std;

const int MAX = 255;

void eatspace(char * str);
double expr(char* str);					// fonction évaluant une expression arithmétique
double term(char* str, int& index);		// Fonction extrayant la valeur d'un terme
double number(char* str, int& index);	// fonction reconnaissant un nombre dans une chaine
char* extract(char* str, int& index);	// Fonction extrayant une sous-chaine entre parenthèse

extern "C" __declspec(dllexport) double __stdcall calcul(char* buffer)
{
//	char* buffer = {0};		//Zone de stockage de l'expression
	//strcpy_s(buffer,sizeof(texte),texte);
	for(;;)
	{
		eatspace(buffer);
		if(!buffer[0])
			return 0;
		return expr(buffer);
	}
}

char* extract(char* str, int& index)
{
	char buffer[MAX];							//	 Espace temporaire pour une sous chaine
	char* pstr = 0;								//	Pointeur désignant la nouvelle chaine à retourner
	int numL = 0;								//	Nombre de parenthèse gauche
	int bufindex = index;						// Enregistre la valeur de début de l'index
	do
	{
		buffer[index - bufindex] = *(str + index);
		switch(buffer[index - bufindex])
		{
			case ')':
				if(numL == 0)
				{
					buffer[index - bufindex] = '\0'; // Remplacd ')' par '\0'
					++index;
					pstr = new char[index - bufindex];
					if(!pstr)
					{
						//cout << "Erreur d'allocation de mémoire,"
						//	 << " programme terminé.";
						exit(1);
					}
					strcpy_s(pstr,sizeof(buffer), buffer);		// Copy la sous chaine dans la nouvelle mémoire..
					return pstr;
				}		
				else
					numL--;	
				break;
			
			case '(': numL ++;break;			// Augmente le nombre de ( à égaliser
		}
	} while(*(str + index++) != '\0');			// Boucle - ne pas dépasser la fin de la chaine

	exit(1);
	return pstr;
}

void eatspace(char * str)
{//	cout << "\nentrée de eatspace\n";

	int j = 0;		// index source de la chaine
	int i = 0;		// index cible de la chaine
	

	while((*(str + i) = *(str + j++)) != '\0')
		
		if(*(str + i) != ' ')
			i++;
//	cout << "\nsorti de eatspace\n";

	return;
}
	

//fonction reconnaissant un nombre dans une chaine
// ou une expression entre parenthèse
double number(char* str, int& index)
{
	double value = 0.0;									// Stock la valeur résultante
	//cout << "\nentrée de number\n";
	if(*(str + index) == '(')							// Début des parenthèse
	{
		char* psubstr = 0;					// Pointeur de sous chaine
		psubstr = extract(str, ++index);	// Extrait la sous-chaine entre parenthèse
		value = expr(psubstr);				// Extrait la valeur de la sous chaine
		delete[] psubstr;					// Nettoie le tas
		return value;
	}
	// Récupération de la partie entière du nombre
	while(isdigit(*(str + index)))	// 
		value = 10 * value + (*(str + index++) - 48);

	if((*(str + index) != '.')&&(*(str + index) != ','))
		return value;

	double factor = 1.0;
	
	// Récupération de la partie décimal du nombre
	while(isdigit(*(str + (++index))))
	{
		factor *= 0.1;
		value = value + (*(str +index) - 48)*factor;
	}
	
	return value;

}

// Fonction extrayant la valeur d'un terme
double term(char* str, int& index)
{	//cout << "\nentré dans term\n";
	double value = 0.0;			// Cumul du résultat

	value = number(str, index);		//Extrai du 1er nombre du term

	// Itération tant que l'opérateur n'est pas aproprié
	while((*(str + index) == '*') || (*(str + index) == '/'))
	{
		if(*(str + index) == '*')
			value *= number(str, ++index);
		
		if(*(str + index) == '/')
			value /= number(str, ++index);
	}
	//cout << "\nsortie dans term\n";
	return value;
}

//fonction évaluant une expression arithmétique
double expr(char* str)
{	//cout << "\nentré dans expr\n";
	double value = 0.0;				// Stocke le résultat ici
	int index = 0;					// Suit l'emplacement du caractère courant
	value = term(str, index);		// Extrait le premier terme

	for(;;)	// boucle infini
	{
		switch(*(str + index++)) // choisie l'opération à partir du caractère courant
		{
			case '\0': return value;
			case '+' : value += term(str, index); break;//
			case '-' : value -= term(str, index); break;//
			default : 
				exit(1);
		}
	}
//	cout << "\nsorti de expression\n";		
}



 Sources du même auteur

DLL - SPLIT AVEC MULTIPLE DELIMITEUR
PIVOT DE GAUSS

 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

DLL - SPLIT AVEC MULTIPLE DELIMITEUR par Jbs106
Source avec Zip CALCULATRICE AVEC REPRESENTATION GRAPHIC par msavyo1
Source avec Zip Source avec une capture CALCULATRICE C++ AVEC GUI QT par skylin3
Source avec Zip TUTORIEL N°1 par bioopovega
Source avec Zip CALCULETTE EN C SOUS LINUX AVEC AUTOMATE SIMPLE par pch_hotline

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Calculatrice ms visual c++ [ par Fino ] Bonjour,quelqu'un aurait-il le source d'une calculatrice faite avec ms visual c++ comme la calc.exe de ms dans windows.si oui pouvez m'en envoyer un e Probleme d affichage [ par Scythale ] Lorsque j'execute ce programme voici ce que dit mon compilateur(borland C++): you have accidentely use the old dummy version of OwlMain.Je n'arrive pa calculatrice en c++ TRES URGENT!!! [ par zouz ] Il faut que je réalise une calculatrice en programmation.Le fonctionnement est comparable à une calculatrice de poche tel que nous avons l'habitude d' Une calculatrice en C++ sous windows [ par Juan-Marco ] Bonjour à tousVoila mon premier post sur ce forums Je connais bien les boucles, les variables et les structures. Je connais un peut moins les classes. calculatrice pour debutant en C [ par kwuy ] j'ai ecrit une version de ma calculatrice mais je voudrais en faire une avec ligne de commande du genre : 12 + 5 - 4 *9 etc et avoir le resultatcommen Calculatrice Win32 Borland OWL C++ 5.x [ par bobby03 ] J'ai ajouté une barre menu, mais je suis incapable d'activer mon MessageBox À propos. Ça ajoute même une erreur sur le code existant qui fonctionne tr Calculatrice Inverse Polonaise [ par vpieplu ] J'ai un probleme. Je n'arrive pas a coder la calculatrice ... Je ne sais qu'elle commande mettre dans les fonctions + - * / Sin Inv Cos C'est super UR calculatrice en C [ par a20syl92 ] 20sylsylnet@netcourrier.comBonjour,J'aimerais réaliser, en langage C, un logiciel capable d'évaluer des expressions arithmétiques, en respectant les p Calculatrice (postfixé) : pb a l'execution [ par filipuce ] Bonjourvoila g fé une petite calculatrice (+,-,*,/ avec parentheses)sous linux pas de probleme, compilation et execution.mais en retouranant sous wind Une calculatrice en C... [ par vegetalain ] bonjour.voila, je débute en C++ et c un vrai cauchemar... j'ai pris sur le net une source de calculatrice. y'a des fichier ".c" et ".h" et aussi des f


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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,562 sec (4)

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