begin process at 2010 03 16 08:51:43
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

j'ai pas arriver à comprendre ce programme


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

j'ai pas arriver à comprendre ce programme

mardi 26 juin 2007 à 21:04:09 | j'ai pas arriver à comprendre ce programme

rezguimedamine

je n'ai pas compris ce programme qui réalise une calculatrice :

#include <stdio.h>

#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

vendredi 29 juin 2007 à 11:02:48 | Re : j'ai pas arriver à comprendre ce programme

lenanttais44

C'est quoi que tu comprend pas?
vendredi 29 juin 2007 à 16:06:11 | Re : j'ai pas arriver à comprendre ce programme

maladedede

Membre Club
-_-'

1/1MaLaDeDeDe 97one1/1 



Cette discussion est classée dans : chaine, lecteur, expression, for, res


Répondre à ce message

Sujets en rapport avec ce message

boucle avec for,petite question! [ par chris5874 ] bonjour à tous,j'aimerai savoir si dans une boucle for(initialisation;condition;expression),bref,une boucle normale,j'aimerai savoir si la condition e Lecteur vidéo [ par mogwai93 ] BonjourJ'ai regardé le code de Racpp :http://www.cppfrance.com/codes/LECTEUR-CLIPS-VIDEO_33111.aspxsauf qu'il ne fonctionne que pour MediaPlayer >= 8( Ecrire un fichier directement en hexadécimal [ par AlphaScorpius ] Bonjour,Après m'être récemment interrogé sur la manière dont l'on pouvait créer un fichier bitmap, et avoir étudié leur structure hexadécimale, j'en s Probleme de chaine [ par jb212121 ] Bonjour à tous,Je suis en train de faire un petit programme en c et je souhaiterai utilisé un pointeur de caractere mais dev cpp me sort cette erreur encadre un texte en c/c++ [ par lil_adriano ] Slt tout le monde je debute en C/C++ je voudrai faire cadre  pour un mot mais j'y arrive pas.j'ai essayer de faire un mais on peu pas faire un mot cor calcule pondéeé en c [ par alix46 ] Bonjour, je bloque sur un programme( en c) qui demande les notes obtenues dans un cours ( /20), le stocker dans un vecteur. dans un autres vecteurs l operateur [ par Alagha ] Salut tt le monde,       En fait je suis entrain de programmer en C++ pour faire une classe CChaine qui gère les caractere..... je veux surcharger l'o Suppression de caractères (extension) dans une chaine C++ [ par klitzounet ] Bonjour J'ai un code C++ qui fonctionne parfaitement (j'ai travaillé longtemps à partir d'une source -> je suis plutôt débutant, pour réussir à l'adap problème avec l'initialision d'un tableau [ par khen ] Bonjour,voila j'ai un petite problème avec l'initialisation de mon tableau , je vous explique le problèmeon a un tableau de 3 dimension appelé tab et


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales