Evaluation d'expression mathématique simple

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 055 fois - Téléchargée 29 fois

Contenu du snippet

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 / Exemple :


#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; }

A voir également

Ajouter un commentaire

Commentaires

amezghal
Messages postés
385
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
1 -
c'est bien ,bon courage
Gulius
Messages postés
19
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
10 mars 2006
-
Un peu succint comme commentaire, mais merchi beaucoup.
A implémenter maintenant la gestion des paranthèses, et des autres opérateurs arithmétique.
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2 -
les divisions par zéro ... il faut engeuler l'utilisateur !
Gulius
Messages postés
19
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
10 mars 2006
-
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.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.