IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème pile - parenthésage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par défaut Problème pile - parenthésage
    Salut. Je suis en première année d'école d'ingénieur et en cours on me demande d'évaluer une expression complètement paranthésée grâce aux piles.
    Par exemple (4*(5-2)). On utilise deux piles, une pour les nombres et une autre pour les opérandes.
    1. Lorsque l'on rencontre une paranthèse ouvrante, on l'ignore.
    2. Lorsque l'on rencontre une valeur numérique, on l'empile dans la pile de réels.
    3. Lorsque l'on rencontre un opérateur, on l'empile dans la pile de caractères.
    4. Lorsqu'on rencontre une paranthèse fermante, on dépile un opérateur, on dépile deux valeurs numérique, on effectue le calcul et on empile le nouveau résultat dans la pile de réel.
    5. Une fois toute l'expression parcourue, le résultat se trouve au sommet de la pile.
    Pouvez vous me dire ce qui cloche, parce que sur le papier, mon code à l'air de marcher et ça fait plusieur jour que je m'acharne dessus.
    Merci beaucoup d'avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<locale.h>
     
    void main()
    {
    	char tabc[4];
    	float tabi[4];
    	int i,j,k;
    	char expression[20];
    	printf("Programme-TP3 LAMOUROUX Damien (C) 3iL-A1\n");
    	printf("-----------------------------------------\n\n");
    	printf("Exemple: (4.5 + (-5 * 9.2))\n");
    	printf("Entrez votre expression completement parenthesee:");	
    	scanf("%s",&expression);
    	fflush(stdin);
    	i=0;
    	j=0;
    	k=0;
     
    //-----------------------Parcours de la chaine et génération des piles-----------------
    	do
    	{		
    			do
    			{
    				if((expression[i]=='0')||(expression[i]=='1')||(expression[i]=='2')||(expression[i]=='3')||(expression[i]=='4')||(expression[i]=='5')||(expression[i]=='6')||(expression[i]=='7')||(expression[i]=='8')||(expression[i]=='9'))
    				{
    					tabi[j]=(expression[i]-'0');
    					j++;
    				}
    				else if(expression[i]=='+')
    				{
    					tabc[k]=expression[i];
    					k++;
    				}
    				else if(expression[i]=='-')
    				{
    					tabc[k]=expression[i];
    					k++;
    				}
    				else if(expression[i]=='*')
    				{
    					tabc[k]=expression[i];
    					k++;
    				}
    				else if(expression[i]=='/')
    				{
    					tabc[k]=expression[i];
    					k++;
    				}
     
    				i++;
     
    			}while(expression[i]!=')');
     
     
    //-------------------------------Calcul----------------------------------------
     
     
    			if(tabc[i-1]='+')
    			{
    				tabi[i-2]=tabi[i-2]+tabi[i-1];
    				k=k-1;;
    				j=j-2;
    			}
    			else if(tabc[i-1]='-')
    			{
    				tabi[i-2]=tabi[i-2]-tabi[i-1];
    				k=k-1;;
    				j=j-2;
    			}
    			else if(tabc[i-1]='*')
    			{
    				tabi[i-2]=tabi[i-2]*tabi[i-1];
    				k=k-1;;
    				j=j-2;
    			}
    			else if(tabc[i-1]='/')
    			{
    				tabi[i-2]=tabi[i-2]/tabi[i-1];
    				k=k-1;;
    				j=j-2;
    			}
    			printf("%f\n",tabi[j]);
    	}while(expression[i]!='\0');
     
     
     
    //---------------------------------Affichage du résultat--------------------------
    	printf("Le resultat est:%f",tabi[j]);
     
    }

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par rohim55
    Salut. Je suis en première année d'école d'ingénieur et en cours on me demande d'évaluer une expression complètement paranthésée grâce aux piles.
    Par exemple (4*(5-2)). On utilise deux piles, une pour les nombres et une autre pour les opérandes.
    1. Lorsque l'on rencontre une paranthèse ouvrante, on l'ignore.
    2. Lorsque l'on rencontre une valeur numérique, on l'empile dans la pile de réels.
    3. Lorsque l'on rencontre un opérateur, on l'empile dans la pile de caractères.
    4. Lorsqu'on rencontre une paranthèse fermante, on dépile un opérateur, on dépile deux valeurs numérique, on effectue le calcul et on empile le nouveau résultat dans la pile de réel.
    5. Une fois toute l'expression parcourue, le résultat se trouve au sommet de la pile.
    Exercice classique.

    Pouvez vous me dire ce qui cloche, parce que sur le papier, mon code à l'air de marcher et ça fait plusieur jour que je m'acharne dessus.
    Merci beaucoup d'avance.
    Régle déjà ces warnings et je pense que tu seras mieux parti :

    pile.c:7: warning: return type of 'main' is not 'int'
    pile.c: In function 'main':
    pile.c:16: warning: format '%s' expects type 'char *', but argument 2 has type 'char (*)[19u]'
    pile.c:61: warning: suggest parentheses around assignment used as truth value
    pile.c:67: warning: suggest parentheses around assignment used as truth value
    pile.c:73: warning: suggest parentheses around assignment used as truth value
    pile.c:79: warning: suggest parentheses around assignment used as truth value
    Jc

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    En regardant d'un oeil en vitesse, je vois:

    1. La forme de main n'est pas standard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void) 
    /* ou */
    int main(int argc, char *argv[])
     
    /*mais main doit renvoyer un int */
    2.fflush(stdin); n'est pas valide. On ne peut utiliser la fonction fftush pour purger le flux stdin.
    3. Il est recommandé d'utiliser fgets à la place de scanf, scanf étant réservé aux experts dont je ne fais pas partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(expression, 20, stdin); /* à la place de scanf("%s", &expression);
    4. En plus scanf("%s", &expression) n'est pas une syntaxe correcte. Sous cette forme, scanf n'est pas adaptée à la capture d'une ligne entrée par l'utilisateur. Cela n'engage que moi, mais n'utilise pas scanf mais fgets (voir ci-dessus).

    Pour le reste de ton code, je vais essayer de m'y plonger.

    Mujigkalement

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Salut
    Ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			if((expression[i]=='0')||(expression[i]=='1')||(expression[i]=='2')||(expression[i]=='3')||(expression[i]=='4')||(expression[i]=='5')||(expression[i]=='6')||(expression[i]=='7')||(expression[i]=='8')||(expression[i]=='9'))
    peut avantageusement être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isdigit(expression[i]))
    isdigit est déclaré dans ctype.h.
    Autre conseil, utilise des fonctions aux noms "parlant", (style empiler_nombre, empiler_operande, calculer) ton code sera beaucoup plus lisible et proche du pseudo algo que tu as peut-être écrit.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    Tu t'emmêles pas mal les pinceaux avec les indices i, j et k.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (tabc[k-1] == '+')  /* et non if (tabc[i-1]='+') */
    {
        tabi[j-2] = tabi[j-2] + tabi[j-1]; /* et non tabi[i-2]=tabi[i-2]+tabi[i-1]; */
        k=k-1;;
        j=j-1;   /* et non j=j-2; */
    }
    else if (tabc[k-1] == '-') /* et non if (tabc[i-1]='-') */
    {
        tabi[j-2] = tabi[j-2] - tabi[j-1]; /* et non tabi[i-2]=tabi[i-2]-tabi[i-1]; */
        k=k-1;;
        j=j-1; /* et non j = j-2; */
     }
    /* etc. */
    De plus, si l'utilisateur entre l'expression 3+5 qui n'a pas de parenthèses, tu ne sors jamais de la boucle intérieure.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Dans ta boucle intérieure, tu empiles dans tabc les opérateurs '+', '-', '*' et '/'. Par contre tu n'empiles dans tabi que des entiers entre 0 et 9 compris. Par contre si l'utilisateur entre un décimal comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Entrez votre expression completement parenthesee: (4.5 + 2)
    ton programme est dans les choux!!!

    La partie acquisition de l'expression est presque OK...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<locale.h>
     
    int main(void)
    {
    	char tabc[4] = {'\0'};
    	float tabi[4] = {0};
    	int i,j,k;
    	char expression[30];
     
    	/* Usage*/
    	printf("Programme-TP3 LAMOUROUX Damien (C) 3iL-A1\n");
    	printf("-----------------------------------------\n\n");
    	printf("Exemple: (4.5 + (-5 * 9.2))\n");
     
    	printf("Entrez votre expression completement parenthesee: ");
    	fflush(stdout); /* Vide le tampon de la sortie standard */
    	fgets(expression, 30, stdin);
     
            i= j = k = 0;
     
            /* ... */
            return EXIT_SUCCESS;
    }
    A mon avis la conception du reste du code est à revoir afin de gérer correctement les décimaux et les nombres négatifs. Attention également à la longueur des tableaux tabc et tabi. Dans ton programme, tu empiles tant que tu ne rencontres pas le caractèpre ')'. Si j'entre l'expression (1+2+3+4+5+6), qui est coreectement parenthésée, je dépasse la capacité des tableaux tabc et tabi.

    Le mieux est de reprendre le problème avec un crayon et un papier et de voir quelles sont les situations (essaie d'être le plus exhaustif possible) que devra gérer ton code. Ensuite écrit l'algorithme en pseudocode, et l'implémentation en C te semblera évidente à quelques détails prêts pour lesquels nous sommes là pour t'aider.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47
  2. Etat de la pile sous Linux et Windows
    Par Bibouda dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 16/02/2003, 01h28
  3. La mémoire en Pmode et en Rmode - la pile
    Par le mage tophinus dans le forum Assembleur
    Réponses: 15
    Dernier message: 16/02/2003, 01h00
  4. [TASM] Déclarer le segment de pile
    Par cipher dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 01/10/2002, 03h58
  5. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo