Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EVALUATION D'EXPRESSION MATHÉMATIQUE SIMPLE


Information sur la source

Description

Evaluation d'expression mathématique simple :
    - les 4 opérateurs sont gérés, ainsi que le - unaire
    - les paranthèses ne sont pas gérer
    - l'expession fait au plus 200 caractères (mais ça peut se changer)
    - seul des entiers tenant sur maximum 32bits sont gérés

Le programme n'a pas beaucoup d'intérêt en soit, mais l'algorithme peut en avoir.
Ex d'expression :   -2*-4+3-14565/5+4*3  etc ....
 

Source

  • #include <iostream>
  • #include <cstring>
  • using namespace std;
  • void chang_opmu (char*); // Change les signes - unaire par un 'n' pour ne pas les confondres avec les - binaire (de soustraction)
  • int eval (char*); // Evalue l'expression passée en paramètre
  • int str_to_int (char*); // Convertie un nombre sous forme chaînée, en type int ( "123"(str) -> 123(int) )
  • int main() {
  • char expr[201];
  • cin >> expr;
  • chang_opmu(expr);
  • cout << eval(expr);
  • return 0;
  • }
  • void chang_opmu (char* str) {
  • if (str[0] == '-') str[0]='n';
  • for (int i=1; i<255; i++)
  • if ( (str[i] == '-') && (!isdigit(str[i-1])) ) str[i]='n';
  • }
  • int eval (char *str) {
  • char* p=NULL;
  • int total = 0;
  • char *a=strrchr(str, '+'), *b=strrchr(str, '-'), *c=strrchr(str, '*'), *d=strrchr(str, '/'); // Pour éviter d'appeller plusieurs fois les mêmes fonctions
  • if (a || b) {
  • p = (a>b)?a:b;
  • if (*p=='+') {
  • *p = '\0';
  • total = eval(str);
  • total += eval(++p);
  • }
  • else if (*p=='-') {
  • *p = '\0';
  • total = eval(str);
  • total -= eval(++p);
  • }
  • return total;
  • }
  • else if (c || d) {
  • p = (c>d)?c:d;
  • if (*p=='*') {
  • *p = '\0';
  • total = eval(str);
  • total *= eval(++p);
  • }
  • else if (*p=='/') {
  • *p = '\0';
  • total = eval(str);
  • total /= eval(++p);
  • }
  • return total;
  • }
  • else return str_to_int(str);
  • }
  • int str_to_int (char* str) {
  • int total=0;
  • int i = (str[0]=='n')?1:0;
  • while (('0' <= str[i]) && (str[i] <= '9')) {
  • total *= 10;
  • total += (int(str[i]) -48);
  • i++;
  • }
  • if (str[0]=='n') return -total;
  • else return total;
  • }
#include <iostream>
#include <cstring>

using namespace std;

void chang_opmu (char*); // Change les signes - unaire par un 'n' pour ne pas les confondres avec les - binaire (de soustraction)
int eval (char*); // Evalue l'expression passée en paramètre
int str_to_int (char*); // Convertie un nombre sous forme chaînée, en type int ( "123"(str) -> 123(int) )

int main() {
	char expr[201];
	cin >> expr;
	chang_opmu(expr);
	cout << eval(expr);
	
	return 0;
}

void chang_opmu (char* str) {
	if (str[0] == '-') str[0]='n';
	for (int i=1; i<255; i++)
		if ( (str[i] == '-') && (!isdigit(str[i-1])) ) str[i]='n';
}

int eval (char *str) {
	char* p=NULL;
	int total = 0;
	char *a=strrchr(str, '+'), *b=strrchr(str, '-'), *c=strrchr(str, '*'), *d=strrchr(str, '/'); // Pour éviter d'appeller plusieurs fois les mêmes fonctions
	if (a || b) {
		p = (a>b)?a:b;
		if (*p=='+') {
			*p = '\0';
			total = eval(str);
			total += eval(++p);
		}
		else if (*p=='-') {
			*p = '\0';
			total = eval(str);
			total -= eval(++p);
		}
		return total;
	}
	else if (c || d) {
		p = (c>d)?c:d;
		if (*p=='*') {
			*p = '\0';
			total = eval(str);
			total *= eval(++p);
		}
		else if (*p=='/') {
			*p = '\0';
			total = eval(str);
			total /= eval(++p);
		}
		return total;
	}
	else return str_to_int(str);
}

int str_to_int (char* str) {
	int total=0;
	int i = (str[0]=='n')?1:0;
	while (('0' <= str[i]) && (str[i] <= '9')) {
		total *= 10;
		total += (int(str[i]) -48);
		i++;
	}
	if (str[0]=='n') return -total;
	else return total;
}

Commentaires et avis

signaler à un administrateur
Commentaire de amezghal le 03/03/2006 12:09:58

c'est bien ,bon courage

signaler à un administrateur
Commentaire de Gulius le 03/03/2006 14:20:36

Un peu succint comme commentaire, mais merchi beaucoup.
A implémenter maintenant la gestion des paranthèses, et des autres opérateurs arithmétique.

signaler à un administrateur
Commentaire de JCDjcd le 04/03/2006 11:20:10

les divisions par zéro ... il faut engeuler l'utilisateur !

signaler à un administrateur
Commentaire de Gulius le 04/03/2006 11:24:48

Certes certes ....
Je suis partis du principe que l'expression rentrée était valide, ce qui n'est pas toujours le cas. Fodrai que je fasse ça.

Merci pour la remarque.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

expression mathematique sous forme d'arbre binaire [ par Milhouse57 ] Je recherche un code qui transformerait une expression mathematique (donnée par l'utilisateur sous forme de chaine de charactere) en un arbre binaire Expression Arithmetique [ par salihou ] Bonjour.tout d'abors merci de lire cet S.O.S.Voila je voudrais ecrire un algorithme puis faire sa traduction en C.Cet algorithme à pour but une evalua Algorithme de permutation [ par momsse ] Salut à tous, Presque tout est dans le titre, je n'arrive pas à comprendre cette algorthme en regardant les sources suivantes (qui fonctionnent parfa algorithme en C pour Pic [ par kou251 ] bonjour le monde mon probleme que je dois trouver un algorithme que peut detecter quand qu'on tourne un bouton d'un encodeur optique merci d'avance d'algorithme évolutionnaire [ par rafik077 ] bonjour, j'ai un projet sur létude comparative d'algorithme évolutionnaire(algorithme génétique).j'ai besoin de code c++ de méthodes drmoga et méthode Brute force Chiffre [ par Dewi78 ] Bonjour, Je cherche désespérément un algorithme ou alors un façons de procédé pour créer une sorte d'algorithme brute force qui trouverait toutes les algorithme évolutinnaire [ par rafik077 ] j'ai un problème  de programmer en c++ l'approche cone separation,et d'utilisation la bibliothèque "mpi.h"merci d'avance algorithme de la methode de jacob en c builder [ par mimouu ] salam svp je voudrais votre aide en ce qui concerne l'algorithe de la methode de jacob en c  builder merci a tous le monde


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 1,794 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.