J'ai pas arriver à comprendre ce programme

rezguimedamine Messages postés 1 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 26 juin 2007 - 26 juin 2007 à 21:04
 Utilisateur anonyme - 29 juin 2007 à 16:06
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

2 réponses

lenanttais44 Messages postés 34 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 7 février 2008
29 juin 2007 à 11:02
C'est quoi que tu comprend pas?
0
Utilisateur anonyme
29 juin 2007 à 16:06
-_-'

MaLaDeDeDe 97one 
0
Rejoignez-nous