begin process at 2012 02 07 08:19:30
  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

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :expression, mathematique, algorithme Niveau :Débutant Date de création :28/02/2006 Vu :11 197

Auteur : Gulius

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

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

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture ÉVALUATEUR D'EXPRESSIONS BOOLÉENNES (BEE) par macsou01
Source avec Zip Source avec une capture RÉSOLUTION SUDOKU (9X9) PAR BACKTRACKING RÉCURSIF INTELLIGEN... par Gallien69
Source avec Zip Source avec une capture EVALUATEUR_EXPRESSION_ARITHMETIQUE par Donald180v
Source avec Zip Source avec une capture ANALYSEUR LEXICAL par Donald180v

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 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 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 help me please !!! [ par NYHC ] Slt à tous ceux qui liront mon message, voici donc le pblm:il me faudrait un prog en c qui afficherait la table de vérité d'une expression booléenne à Algorithme de placement [ par oberown ] Je cherche des noms d'algorithmes ou des idées, pour résoudre ce genre de problème.On a trois jours, et chaque jours 2 personnes peut se présenter. On Pb d'affichage avec des listes doublement chianées [ par Orezza ] Bonjour a tous,voila je dois faire un petit analyseur syntaxique, en ce moment j'en suis au prémice de mon code et j'ai dejà un Big problem d'affichag faire un algorithme de débutant [ par momo_1 ] Aider moi à faire un algo pour calculer le barycentre d'un cercle : le centre en gros. Qu'est ce qu'un algorithme ? [ par spyke16 ] Bonjour,je voudrais savoir ce qu'est qu'un algorithme précisemment ?MerciSPYKE Algorithme A* [ par tsanti ] Quelqu'un aurai l'Algorithme A* ?Ca m'éconnomiserai du Doliprane. DIRECT_SANTI_3DX9 recherche d'un code ou de l'algorithme [ par mohamedbzeouich ] je veux un programme ecrit en c qui peut generer des vaariable aléatoire suivant la loi normale (gaussienne) fonctions mathematique [ par fox66 ] bonjour,je suis debutant en C je dois ecrire un prog "verif" qui verifie les etapes suivantes:par exemple on a S = (ac) + (bc) + (a(a'+cd))1-le nbr de


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,451 sec (3)

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