begin process at 2008 05 22 22:02:40
1 177 987 membres
633 nouveaux aujourd'hui
13 991 membres club

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

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS