Pb de conversion de chaine de caractéres

cs_Thanatos Messages postés 12 Date d'inscription vendredi 11 janvier 2002 Statut Membre Dernière intervention 21 novembre 2008 - 1 févr. 2002 à 11:02
cs_Thanatos Messages postés 12 Date d'inscription vendredi 11 janvier 2002 Statut Membre Dernière intervention 21 novembre 2008 - 4 févr. 2002 à 12:28
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

Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006
1 févr. 2002 à 11:21
tu veut une methode compliquer qui marche a tout les couts ou une methode simple ?
0
cs_idk Messages postés 16 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 29 juillet 2004
1 févr. 2002 à 17:32
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
0
Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006
1 févr. 2002 à 21:48
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 !
0
cs_Thanatos Messages postés 12 Date d'inscription vendredi 11 janvier 2002 Statut Membre Dernière intervention 21 novembre 2008
4 févr. 2002 à 12:28
merci bcp pour tes 2 méthodes.
0
Rejoignez-nous