Pb de conversion de chaine de caractéres

Signaler
Messages postés
12
Date d'inscription
vendredi 11 janvier 2002
Statut
Membre
Dernière intervention
21 novembre 2008
-
Messages postés
12
Date d'inscription
vendredi 11 janvier 2002
Statut
Membre
Dernière intervention
21 novembre 2008
-
Bonjour,

Je désirerais faire un programme sur les fonctions logiques de base : un utilisateur rentre une fonction logique et le programme lui sort la table de vérité. Comment faire pour convertir une chîne de caractéres en une fonction logique c'est à dire la chaine "a+b" devient le nombre a+b .
Merchi

4 réponses

Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006

tu veut une methode compliquer qui marche a tout les couts ou une methode simple ?
Messages postés
16
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
29 juillet 2004

Je suis egalement en train de la faire pour un editeur d'equation! Mauis j'ai u, pote qui a fait la fonction! Trop simple sa fonction a utilisé! Plus dur a comprendre!
Ecris lui :blustuff@wanadoo.fr
Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006

bon alors voila deja 2 methode, mais j'en ai aussi une qui permet de faire par exemple : " 5 + 8 * 2 -6+5 -3" mais elle ne gere pas les priorité d'operation !
attention les codes sources sont assez big :)
methode simple :

#include <stdio.h>

#define ADDITION 1
#define SOUSTRACTION 2
#define MULTIPLICATION 3
#define DIVISION 4

bool EstChiffre(const char &c);
bool Extraire(int &a,int &b,unsigned char &type,const char *src);
bool Extraire2(int &a,int &b,unsigned char &type,const char *src);
int typecar(char c);
int ouep(int pos,char c);

char etat[] = {0,0,0,0,
1,2,0,0,
3,2,4,0,
3,0,4,0,
5,6,0,0,
5,6,0,0,
7,6,7,7,
0,0,0,0
};

void main(){
int a,b;
unsigned char type;
char *calcul = "54+89";
printf("Calcul de : %s\n",calcul);
if(!Extraire(a,b,type,calcul)){
printf("Erreur dans les donnees !\n");
return;
};
printf("Extraction des donnees, a=%d, b=%d\n",a,b);
switch(type){
case ADDITION:
printf("addition ... %d + %d = %d\n",a,b,a+b);
break;
case SOUSTRACTION:
printf("soustraction ... %d - %d = %d\n",a,b,a-b);
break;
case MULTIPLICATION:
printf("multiplication ... %d * %d = %d\n",a,b,a*b);
break;
case DIVISION:
if(b == 0){
printf("division par zero\n");
break;
}
printf("division ... %d / %d = %d\n",a,b,a/b);
break;
}
}

bool Extraire(int &a,int &b,unsigned char &type,const char *src){
int i=0;
a = 0;
b = 0;
type = 0;
if(!EstChiffre(src[i])) return false;
while(EstChiffre(src[i]))
a = a*10 + (src[i++]-'0');

switch(src[i++]){
case '+':
type = ADDITION;
break;
case '-':
type = SOUSTRACTION;
break;
case '*':
type = MULTIPLICATION;
break;
case '/':
type = DIVISION;
break;
default:
return false;
}

if(!EstChiffre(src[i])) return false;
while(EstChiffre(src[i]))
b = b*10 + (src[i++]-'0');

return true;
}

bool EstChiffre(const char &c){
if((c<'0')||(c>'9')) return false;
return true;
}

methode complexe :

si tu veux qu'on puisse mettre plein d'espace il faut utilisé la methode complexe :

alors pour la methode complexe en fait je vais utilisé un automate qui va analysé la chaine
de caractere.

il faut deja que l'on divise notre chaine en plusieur partie imaginons la chaine suivante :
( les '_' representent les espaces)
"__75_+___63"
il est composé de 6 partie :
partie 1 : "__" les espaces devant
partie 2 : "75"
partie 3 : "_" l'espace avant l'operateur
partie 4 : "+" l'operateur
partie 5 : "___" l'espace aprés l'operateur
partie 6 : "63"
ce qui fait 6 etats + l'etat de fin (7) et l'etat d'erreur (0)

et en fait on va decomposé ça en un tableau :
les lignes indique les etats et les colones corresponde à un type de caractere
(espace - chiffre - operateur - autre)
0 : 0 - 0 - 0 - 0 // cet etat c'est la partie erreur
1 : 1 - 2 - 0 - 0
2 : 3 - 2 - 4 - 0
3 : 3 - 0 - 4 - 0
4 : 5 - 6 - 0 - 0
5 : 5 - 6 - 0 - 0
6 : 7 - 6 - 7 - 7
7 : 0 - 0 - 0 - 0 // cet etat sert a indiquer a l'automate la fin du traitement
donc en fait les numeros dans le tableau indique le prochain etat en fonction du caractere
et de l'etat actuel

code :

#include <stdio.h>

#define ADDITION 1
#define SOUSTRACTION 2
#define MULTIPLICATION 3
#define DIVISION 4

bool EstChiffre(const char &c);
bool Extraire(int &a,int &b,unsigned char &type,const char *src);
int typecar(char c);
int ouep(int pos,char c);

char etat[] = {0,0,0,0,
1,2,0,0,
3,2,4,0,
3,0,4,0,
5,6,0,0,
5,6,0,0,
7,6,7,7,
0,0,0,0
};

void main(){
int a,b;
unsigned char type;
char *calcul = " 54 + 89";
printf("Calcul de : %s\n",calcul);
if(!Extraire(a,b,type,calcul)){
printf("Erreur dans les donnees !\n");
return;
};
printf("Extraction des donnees, a=%d, b=%d\n",a,b);
switch(type){
case ADDITION:
printf("addition ... %d + %d = %d\n",a,b,a+b);
break;
case SOUSTRACTION:
printf("soustraction ... %d - %d = %d\n",a,b,a-b);
break;
case MULTIPLICATION:
printf("multiplication ... %d * %d = %d\n",a,b,a*b);
break;
case DIVISION:
if(b == 0){
printf("division par zero\n");
break;
}
printf("division ... %d / %d = %d\n",a,b,a/b);
break;
}
}

bool EstChiffre(const char &c){
if((c<'0')||(c>'9')) return false;
return true;
}

bool Extraire(int &a,int &b,unsigned char &type,const char *src){
int pos = 1;
a = 0;
b = 0;
type = 0;
char c;
while(pos != 0){
c = *src++;
pos = ouep(pos,c);
switch(pos){
case 2:
a = a*10 + (c-'0');
break;
case 4:
if(c=='+') type = ADDITION;
if(c=='-') type = SOUSTRACTION;
if(c=='*') type = MULTIPLICATION;
if(c=='/') type = DIVISION;
break;
case 6:
b = b*10 + (c-'0');
break;
case 7:
return true;
case 0:
return false;
}
}
return false;
}

int ouep(int pos,char c){
return etat[typecar(c)+pos*4];
}

int typecar(char c){
if(c==' ') return 0;
if(EstChiffre(c)) return 1;
if((c=='+')||(c=='-')||(c=='*')||(c=='/')) return 2;
return 3;
}

voila j'espere que c'est ce que tu veux.
si tu veux une source qui permet de faire "a + b + c + d + e ..." tu le dit et je la met aussi !
Messages postés
12
Date d'inscription
vendredi 11 janvier 2002
Statut
Membre
Dernière intervention
21 novembre 2008

merci bcp pour tes 2 méthodes.