je n'ai pas compris ce programme qui réalise une calculatrice :#include <stdio.h><?xml:namespace prefix
o ns "urn:schemas-microsoft-com:office:office" /??>
#include <string.h>
#include <math.h>
#include <ctype.h>
float lecteur(char *chaine)
{
int i, j, k, indentation;
float res;
char expression[256][256]={{0}}, membre[256];
/*Découpage de l'expression en nombres, opérateurs et fonctions*/
for ( i=0, j=0, k=0; chaine[i]!='\0'; i++ )
{
if (!j)
{
for ( j=0; membre[j]!='\0'; j++ )
membre[j]='\0';
j=0;
}
membre[j]=chaine[i];
j++;
/*Fin d'un nombre*/
if ( chaine[i]>='0' && chaine[i]<='9' )
{
if ( ( chaine[i+1]<'0' || chaine[i+1]>'9' ) && chaine[i+1]!='.' )
{
strcpy(expression[k], membre);
k++;
j=0;
}
}
/*Fin d'une fonction*/
else if ( chaine[i]>='A' && chaine[i]<='Z' )
{
if ( chaine[i+1]<'A' || chaine[i+1]>'Z' )
{
strcpy(expression[k], membre);
k++;
j=0;
}
}
/*Opérateur*/
else if ( chaine[i]=='^' || chaine[i]=='*' || chaine[i]=='/' ||
chaine[i]=='+' || chaine[i]=='-' )
{
strcpy(expression[k], membre);
k++;
j=0;
}
/*Parenthèses*/
else if ( chaine[i]=='(' )
{
indentation=0;
i++;
for ( j=0; chaine[i]!=')' || indentation!=0; j++, i++ )
{
membre[j]=chaine[i];
if ( chaine[i]=='(' )
indentation++;
else if ( chaine[i]==')' )
indentation--;
}
strcpy(expression[k], membre);
k++;
j=0;
}
}
/*Priorités*/
for ( indentation=0; indentation<4; indentation++ )
{
for ( i=0; expression[i+1][0]!='\0'; i++ )
{
switch (indentation)
{
/*Fonctions*/
case 0:
{
if ( strcmp(expression[i], "SIN")==0 )
{
res=sin(lecteur(expression[i+1])*M_PI/180);
sprintf(expression[i], "%f", res);
/*Décalage*/
for ( j=i+1; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+1]);
}
else if ( strcmp(expression[i], "COS")==0 )
{
res=cos(lecteur(expression[i+1])*M_PI/180);
sprintf(expression[i], "%f", res);
for ( j=i+1; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+1]);
}
else if ( strcmp(expression[i], "TAN")==0 )
{
res=tan(lecteur(expression[i+1])*M_PI/180);
sprintf(expression[i], "%f", res);
for ( j=i+1; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+1]);
}
else if ( strcmp(expression[i], "SQRT")==0 )
{
res=sqrt(lecteur(expression[i+1]));
sprintf(expression[i], "%f", res);
for ( j=i+1; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+1]);
}
break;
}
/*Puissances*/
case 1:
{
if ( strcmp(expression[i], "^")==0 )
{
res=pow(lecteur(expression[i-1]), lecteur(expression[i+1]));
sprintf(expression[i-1], "%f", res);
for ( j=i; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+2]);
i--;
}
break;
}
/*Multiplications/Divisions*/
case 2:
{
if ( strcmp(expression[i], "*")==0 )
{
res=lecteur(expression[i-1])*lecteur(expression[i+1]);
sprintf(expression[i-1], "%f", res);
for ( j=i; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+2]);
i--;
}
else if ( strcmp(expression[i], "/")==0 )
{
if ( lecteur(expression[i+1])!=0 )
res=lecteur(expression[i-1])/lecteur(expression[i+1]);
else
printf(" Erreur : division par zero.\n");
sprintf(expression[i-1], "%f", res);
for ( j=i; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+2]);
i--;
}
break;
}
/*Additions/Soustractions*/
case 3:
{
if ( strcmp(expression[i], "+")==0 )
{
if (!i) /*Plus unaire*/
{
res=lecteur(expression[i+1]);
sprintf(expression[i], "%f", res);
for ( j=i; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+1]);
}
else /*Plus binaire*/
{
res=lecteur(expression[i-1])+lecteur(expression[i+1]);
sprintf(expression[i-1], "%f", res);
for ( j=i; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+2]);
}
i--;
}
else if ( strcmp(expression[i], "-")==0 )
{
if (!i) /*Moins unaire*/
{
res=-lecteur(expression[i+1]);
sprintf(expression[i], "%f", res);
for ( j=1; j<expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+1]);
}
else /*Moins binaire*/
{
res=lecteur(expression[i-1])-lecteur(expression[i+1]);
sprintf(expression[i-1], "%f", res);
for ( j=i; expression[j][0]!='\0'; j++ )
strcpy(expression[j], expression[j+2]);
}
i--;
}
break;
}
}
}
}
sscanf(expression[0], "%f", &res);
return res;
}
int verification(char *chaine)
{
int i, indentation;
for ( i=0; chaine[i]!='\0'; i++ )
{
/*Si un opérateur binaire comporte un opérande invalide*/
if ( chaine[i]=='*' || chaine[i]=='/' || chaine[i]=='^' )
{
if ( i==0 || chaine[i+1]=='\0' || chaine[i+1]==')' )
return 0;
}
/*Si un opérateur unaire comporte un opérande invalide*/
else if ( chaine[i]=='+' || chaine[i]=='-' )
{
if ( chaine[i+1]=='\0' || chaine[i+1]==')' )
return 0;
}
/*S'il n'y a pas d'opérateur entre deux membres*/
else if ( chaine[i]>='0' && chaine[i]<='9' && chaine[i+1]=='(' )
return 0;
/*Si deux parenthèses sont vides*/
else if ( chaine[i]=='(' && chaine[i+1]==')' )
return 0;
/*Si deux opérateurs se suivent*/
if ( chaine[i]=='^' || chaine[i]=='*' || chaine[i]=='/' || chaine[i]=='+' || chaine[i]=='-' )
{
if ( chaine[i+1]=='^' || chaine[i+1]=='*' || chaine[i+1]=='/' || chaine[i+1]=='+' || chaine[i+1]=='-' )
return 0;
}
else if ( chaine[i]>='A' && chaine[i]<='Z' )
{
if ( ( chaine[i]=='S' && chaine[i+1]=='I' && chaine[i+2]=='N' && chaine[i+3]=='(' ) ||
( chaine[i]=='C' && chaine[i+1]=='O' && chaine[i+2]=='S' && chaine[i+3]=='(' ) ||
( chaine[i]=='T' && chaine[i+1]=='A' && chaine[i+2]=='N' && chaine[i+3]=='(' ) )
i+=3;
else if ( chaine[i]=='S' && chaine[i+1]=='Q' && chaine[i+2]=='R' &&
chaine[i+3]=='T' && chaine[i+4]=='(' )
i+=4;
/*Si la fonction étudiée est inconnue*/
else
return 0;
}
/*Si le caractère est inconnu.*/
else if ( ( chaine[i]<'0' || chaine[i]>'9' ) && chaine[i]!='(' && chaine[i]!=')' && chaine[i]!='.' )
return 0;
}
for ( i=0, indentation=0; chaine[i]!='\0'; i++ )
{
if ( chaine[i]=='(' )
indentation++;
else if ( chaine[i]==')' )
indentation--;
}
if ( indentation!=0 )
return 0;
return 1;
}
int main(void)
{
int i, j;
char chaine[256]={0};
char ver;
char lect;
verification(&ver);
lecteur(&lect);
printf("\n [Calculatrice]");
while (1)
{
printf("\n\n Entrez l'expression a evaluer :\n ");
gets(chaine);
/*Destruction des espaces et mise en majuscules*/
for ( i=0; chaine[i+1]!='\0'; i++ )
{
chaine[i]=toupper(chaine[i]);
if ( chaine[i]==' ' )
{
for ( j=i; chaine[j]!='\0'; j++ )
chaine[j]=chaine[j+1];
i--;
}
}
if (verification(chaine))
printf(" %f", lecteur(chaine));
else
printf(" L'expression est invalide.");
}
return 0;
}
merçi
Afficher la suite