[C] Calculatrice avancée

Fermé
fabienfabien - 6 août 2009 à 15:04
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 6 août 2009 à 16:36
Bonjour à tous!

Je suis actuellement en train de me lancer dans le dévellopement d'une calculatrice "évoluée", bon elle fait rien de spécial mais en fait j'ai recherché pas mal d'aide sur le net sur les calculatrices et je tombait à chaque fois sur une calculatrice toute simple du genre 4 + 5 = 9
En revanche, je souhaiterais pouvoir dévelloper une calculatrice permettant de calculer des expressions un peux plus complexe du genre: (4+2/2)*5

Mon problème:
J'ai un algorithme mais je n'arrive pas à le mettre en oeuvre
Je vous le propose et si vous pouviez me dire ce que vous en pensez, ou voir me donner des conseils ou dire que c'est de la daube je suis preneur :p

Algo:

création de 3 tableaux pour stocker parenthèses, signe, et valeure:
Code :


int elem_simples[500];
int nombres[500];
int operateur[500];


création de 4 variables désignant les caractères de la chaine:
Code :


int parenthese_ouvrante = 0;
int parenthese_fermante = 1;
int operateur = 2;
int nb = 3;


Ce qui nous donnerait:

( 2 + 3 ) * 5

elem_simples=>parenthese_ouvrante,nb,operateur,nb,parenthese_fermante,operateur,nb
nombres =>0,2,0,3,0,0,5
operateurs=>0,0,'+',0,0,'*',0



Le soucis maintenant est d'implémenter cet algorithme qui de plus permet juste de détecter de quoi est constituée l'expression donnée (qui sera donnée dans une chaine ASCII).

J'ai une esquisse de code, mais qui ne reprend pas cet algorithme:

Code :


#include <stdio.h>
#include <stdlib.h>

int numbers[10] = {0,1,2,3,4,5,6,7,8,9};

int main(void)
{
int elem_simples[500];
int nb_elem_simples;
int nombres[500];
int i;
char operateurs[500];

char parenthese_ouvrante, parenthese_fermante,operateur;
int nb;
char expression[128];
gets(expression);

parenthese_ouvrante = strchr(expression,'(');

parenthese_fermante = strchr(expression,')');

if(parenthese_ouvrante != NULL)
{
printf("Parenthese_ouvrante ");

for(i=0;i<10;i++)
{
nb = strchr(expression,numbers[i]);
if( nb != NULL)
{
printf("Chiffre ");

}
}
if(parenthese_fermante != NULL)
{
printf("Parenthese fermante ");

}
}


return 0;
}



Avec ce code, j'obtient un résultat du genre:

Code :


Parenthèse ouvrante Chiffre operateur Chiffre Parenthese fermante


pour une expression du type (5+2)


Bien sûr mes tableaux implémentés dans mon code ne servent à rien mais j'avais la flemme de les enlever car je ne trouve pas comment implémenter mon algorithme, si toutefois il est correct.

Merci d'avoir eu la patience de me lire
Bonne journée et si vous avez des conseils n'hésitez pas

Fabien
A voir également:

2 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 août 2009 à 15:54
salut.
Pour ma calculette, j'ai fait un truc assez similaire. Sauf pour les parenthèses. à mon avis, les parenthèses, c'est le plus dure à traiter.
Ce que j'ai fait :
laisons de coté les parenthèses pour l'instant.
j'ai deux tableaux : un stokant les valeurs un autre les opérateurs (donc un de taille N+1 l'autre de taille N)
car un calcul, c'est une alternance de valeur et d'opérateurs. Une fois ces deux tableaux obtenue, il suffit de faire les opérations par ordre de priorité (^, /, *, -, +) et de diminuer la taille du tableau à chaque fois.
Les parenthèses sont traité comme des valeur, c'est à dire que récursivement, j'évalu le groupe de parenthèse avant d'affecter la valeur au tableau.
0
Professeur Herbin
6 août 2009 à 16:10
> c'est le plus dure
> laisons
> stokant
> etc...

Les gosses d'aujourd'hui, ils ne savent plus aligner 3 mots de français à la suite.
C'est affligeant.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 août 2009 à 16:36
J'avoue avoir eu un peu de laisser aller dans ce message. Mais il y a largement pis que moi sur ce forum. Si tu dois mettre un mot à chaque fois, le nombre de messages présents sur le forum risque d'être multiplié par deux (ou presque).
Ensuite, le verbe stocker est présent dans certains dictionnaires, avec cette orthographe là.
Et pour finir, à pas loin de 30 ans, on ne peut pas dire que je soit un "gosse".
Mais c'est toujours aussi facile d'emmerder les gens sous sa couverture d'anonymat.
0