Calculatrice en C

a20syl92 Messages postés 2 Date d'inscription mercredi 5 novembre 2003 Statut Membre Dernière intervention 2 décembre 2003 - 25 nov. 2003 à 17:40
aminesoft1 Messages postés 9 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 16 juin 2008 - 16 juin 2008 à 01:20
20syl[mailto:sylnet@netcourrier.com sylnet@netcourrier.com]

Bonjour,

J'aimerais réaliser, en langage C, un logiciel capable d'évaluer des expressions arithmétiques, en respectant les priorités habituelles (en fait une calculatrice).
Le programme devra gérer les 4 opérateurs classiques +,-,* et /, ainsi que les parenthèses.
Les expressions à évaluer peuvent être passées en paramètre à l'application gràce à l'option -e.
Sinon, elles sont lues dans le ou les fichiers passés en paramètre.

exemple1:

supposons que l'application réalisée se nomme calculatrice
si on tape la commande:

calculatrice -e 1+2+3

on obtient:

1+2+3=6

exemple2:

si on veut obtenir le résultat d'expression contenu dans un fichier appelé fic1:

fic1:
-------------
1+2+3
6+5
3*2
-------------

fic2:
-------------
9*9
-------------

si on tape la commande:

calculatrice fic1

on obtient:

1+2+3=6
6+5=11
3*2=6

si on tape la commande:

calculatrice fic1 fic2

on obtient:

1+2+3=6
6+5=11
3*2=6
9*9=81

Voici ce que j'ai commencé à faire:

----------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>

#define MAXPILE 256

#define V_VALEUR 1 /* Valeur numérique */
#define V_OUVRE 2 /* Parenthèse ouvrante */
#define V_FERME 3 /* Parenthèse fermante */
#define V_PLUS 4 /* Symbole + */
#define V_MOINS 5 /* Symbole - */
#define V_MULTIPLIE 6 /* Symbole * */
#define V_DIVISE 7 /* Symbole / */

#define OPTION_EXPR "-e"
#define TYPE_OPTION 1
#define TYPE_FICHIER 2

void usage(char *nom)
{
fprintf(stderr, "\nUsage : %s [-e expression] [fichier...]\n\n", nom);
exit(1);
}

int type_param (char *p)
{
if (strcmp(p,OPTION_EXPR) == 0)
return TYPE_OPTION;
else
return TYPE_FICHIER;
}

void ouvrir (char *nom)
{
FILE *fichier;
char carlu;
char expression [MAXPILE];
int i=0;

//strcat(fichier,".txt");
//printf("nom du fichier : %s\n",nom);if ((fichier fopen(nom,"r")) NULL )
{
printf("\nAucun fichier du nom de : %s\n",nom);
}
else
{
while (!feof(fichier))
{
carlu=fgetc(fichier);
expression[i]=carlu;
i++;
if (carlu == '\n')
{
expression[i]='\0';
printf("%s",expression);
i=0;
}
}
fclose(fichier);
}
}

typedef struct TPILE
{
int Type;
int PosDeb, PosFin;
} TPILE;

TPILE Pile[MAXPILE];

int main(int argc, char *argv[])
{
int i=0;

if (argc == 1)
usage(argv[0]);

else

if ((argc == 2) && (type_param(argv[1])==TYPE_OPTION))
usage(argv[0]);

if ((argc == 3) && (type_param(argv[1])==TYPE_OPTION))
printf("expression à évaluer : %s\n",argv[2]);

if ((argc >= 2) && (type_param(argv[1])==TYPE_FICHIER))
{
for(i=1;i<argc;i++)
ouvrir(argv[i]);
}
}

--------------------------------------------------------------------

Toutes aides ou solutions seront les bien venues.
Je vous remercie d'avance ;)

20syl

2 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
25 nov. 2003 à 22:20
pourquoi tu fait pas

fprintf(stderr, "\nUsage : calculatrice [-e expression] [fichier...]\n\n");

au lieu de
fprintf(stderr, "\nUsage : %s [-e expression] [fichier...]\n\n", nom);

dans void usage(char *nom), d'ailleur si c'est un devoir je te conseille de mettre void usage(const char *nom)

dans le main, apres
if (argc == 1)
usage(argv[0]);
tu met un else, c'est inutile car ya un exit dans usage

dans ouvrir, tu fait
expression[i]=carlu;
i++;
ensuite
if (carlu == '\n')
{
expression[i]='\0';
pour remplacer le '\n' par '\0' tu doit faire
expression[i-1]='\0';

sinon pour le reste ya rien a dire, ta plus qu'a faire les operations!
0
aminesoft1 Messages postés 9 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 16 juin 2008
16 juin 2008 à 01:20
good
www.aminesoft.uni.cc
0
Rejoignez-nous