begin process at 2010 02 10 10:27:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > EVALUATION D'EXPRESSION MATHÉMATIQUE SIMPLE

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



 Sources du même auteur

CALCUL DU PGCD DE 2 NBRES PAR SOUSTRACTION (AVEC LES CALCULE...
CALCULER DELTA D'UNE ÉQUATION DU SECOND DÉGRÉ AINSI QUE SES ...

 Sources de la même categorie

Source avec Zip OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec une capture OPÉRATIONS SUR MATRICES C++ par Minilogus
[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROGRAMME QUI CALCUL LE PPCM ET LE PGCD par AnoSantino
EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj

 Sources en rapport avec celle ci

EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj
Source avec Zip Source avec une capture RESOLUTION DE SYSTEME LINEAIRE PAR LA METHODE DU GRADIENT CO... par zangul
Source avec Zip ALGO : RESOLUTION "LE COMPTE EST BON" AVEC DES ARBRES BINAIR... par panini21
Source avec une capture CALCUL DE L'ENVELOPPE CONVEXE D'UN NUAGE DE POINTS DANS UN P... par Lucky92
Source avec Zip COMBSORT ALGORITHME DE TRI SIMPLE RAPIDE NON-RECURSIF par xtremejames183

Commentaires et avis

Commentaire de amezghal le 03/03/2006 12:09:58

c'est bien ,bon courage

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.

Commentaire de JCDjcd le 04/03/2006 11:20:10

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

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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,796 sec (3)

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