Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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