Calculatrice en C

a20syl92 Messages postés 2 Date d'inscription mercredi 5 novembre 2003 Statut Membre Dernière intervention 2 décembre 2003 - 2 déc. 2003 à 18:28
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 4 déc. 2003 à 18:20
20syl[mailto:sylnet@netcourrier.com sylnet@netcourrier.com]

Bonjour

Voilà mon programme
Mais comment faire pour gérer les erreurs ?

exemple:

*6+5+9 = erreur

1++2 = erreur

3+3/ = erreur

prog:
---------------------------------
#include <ctype.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

#define MAXPILE 256

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

char *t;
int error = 0;

void usage(const 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;
}

double eval(char *line);

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-1]='\0';
printf("\n%s = %g",expression,eval(expression));
i=0;
}
}
fclose(fichier);
}
}

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

TPILE Pile[MAXPILE];

double scan_sum();

double scan_factor()
{
double result;
int n;

if ((*t=='.' && isdigit(*(t+1))) || isdigit(*t)) /* c'est un nombre */
{
sscanf(t,"%lf%n",&result,&n);
t+=n;
}
else if(*t=='-') /* il faut trouver l'opposé */
{
t++;
result = -scan_factor();
}
else if(*t=='(') /* début de parenthèses */
{
t++;
result = scan_sum();
if (*t!=')')
{
printf("erreur parenthese non fermee\n");
error = 1;
}
else t++;
}
return result;
}

/*double scan_power()
{
double result = scan_factor();
if (*t=='^')
{
t++;result pow(result,scan_factor()); /* result result^scan_factor()
}
return result;
}*/

double scan_prod()
{
double result = scan_factor();
while(1)
{
if (*t == '*')
{
t++;result *scan_factor(); /* result result * scan_power() */
}
else if (*t == '/')
{
t++;result /scan_factor(); /* result result / scan_power() */
}
else break;
}
return result;
}

double scan_sum()
{
double result = scan_prod();
while (1){
if (*t == '+')
{
t++;result +scan_prod(); /* result result + scan_prod() */
}
else if (*t == '-')
{
t++;result -scan_prod(); /* result result - scan_prod() */
}
else break;
}
return result;
}

double eval(char *line)
{
t = line;
return scan_sum();
}

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

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("\n%s = %g\n\n",argv[2],eval(argv[2]));

if ((argc >= 2) && (type_param(argv[1])==TYPE_FICHIER))
{
for(i=1;i<argc;i++)
ouvrir(argv[i]);
//eval(argv[i]);
printf("\n");
}
}
-------------------------------

Toutes aides ou solutions seront les bienvenues
Merci d'avance

20syl

1 réponse

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
4 déc. 2003 à 18:20
Salut,
C'est lorsque tu parse ta ligne de commande que tu peux t'apercevoir que la syntaxe est incorrecte et donc afficher un msg d'erreur.
Par exemple apres un '+', tu peux avoir un nombre, une parenthese, etc... mais aucune autre opération, donc si en parsant tu trouve autre chose qu'un nombre ou des parentheses apres un + tu affiches un message d'erreur.
Sur ce site il y a deja des sources qui traitent de l'analyse d'expressions mathématiques.
0
Rejoignez-nous