#1 Le 18/04/2007, à 00:38
- kakaboubou
fonctions sprintf et scanf dans calcultrice avec priorités
Salut je débute en programmation C et j'ai trouver le code ci-dessous sur http://www.cppfrance.com
qui gère les priorites dans une expression de type 27*(2-5)+5
seulement voila. il y'a des trucs que je ne comprend pas trop dedans
exemple : sprintf(expression[i-1], %f, res);
ou encore sscanf(expression[0], "%f3, &res);
Je sais printf sert à afficher et scanf à saisir mais dans ces cas ci je n'y comprend pas grand chose
est-ce qu'on peut pas utiliser autre chose sans altérer le resultat final(quelque chose de plus simple)
Merci de bien vouloir m'aider.
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
int verification(char *chaine);
float lecteur(char *chaine);
int main(void)
{
int i, j;
char chaine[256]={0};
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;
}
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;
}
}
/*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<2; indentation++ )
{
for ( i=0; expression[i+1][0]!='\0'; i++ )
{
switch (indentation)
{
/*Multiplications/Divisions*/
case 0:
{
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 1:
{
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;
}
}
}
}
/*Si le resultat n'est pas un nombre,
c'est que c'est une parenthèse facultative non prise en compte*/
for ( i=0; expression[0][i]!='\0'; i++ )
if ( ( expression[0][i]<'0' || expression[0][i]>'9' ) &&
expression[0][i]!='.' && expression[i][0]!='-' && expression[i][0]!='+' )
return res=lecteur(expression[0]);
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*/
else 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;
}
/*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;
}
Hors ligne