begin process at 2012 02 11 23:02:16
  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( affichage des occurence dans une chaine de caractère [ par fiorellafatma ] [^^pirate]salut à tous voila je dois faire un programme qui prend une chaine de caractère et retourne le nombre d' occurence de chaque caractère comm passage de tableau à 3 dimensions en paramètre à une fonction [ par snake57 ] Bonjour à tous, J'ai un tableau à 3 dimensions que je veux afficher à partir d'une fonction. J'ai donc créé une fonction mais celle-ci affiche...n'im rectification dune code C et/ou aide sur l'algorithme [ par negets ] bonjour, besoin d'aide; j'aimerai dégager l'algorithme de ce code afin de le programmer sous matlab je connais plus rien en C et C++(je commence à lir [dos batch]Appel d'un .bat depuis un .bat dans un for [ par AXELMEDICAL ] Bonjour, J'appel un .bat à partir d'un .Bat dans une boucle for. La boucle for fonctionne correctement cependant les lignes qui suivent cette boucl pyramides [ par zell61 ] bonjour j ai un petit probleme j ai reussi a faire un code pour faire une pyramide en visual c++ que voici #include void main() { int n,j,i; printf(" gestion de commande system [ par Adict ] Bonjour. pour un projet je doit afficher le ping d'une adresse internet en C. j'utilise donc une des commandes [i][b]system(" ");[/b][/i] quand j Evaluation d'une expression char* ou string [ par tsonamir ] Je suis appelé à faire un tableur dont chaque cellule contient une formule de type string ou char*,où les seuls opérateurs trouvés sont + - * / ( ) [ Supression de chaine dans un fichier [ par Ctimi ] Bonjour à tous ! Je galère grave a rechercher une chaine de caractère dans un fichier et de la supprimer en langage C.... Mon but est d'entrer un nom


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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,577 sec (4)

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