Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1381 connectés 

  FORUM HardWare.fr
  Programmation
  C

  la fonction unary_exp();

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

la fonction unary_exp();

n°1096524
nvictor
Posté le 25-05-2005 à 13:45:42  profilanswer
 

Bonjour à tous,  
J'évolue en C avec "the C book"
Voilà le programme qui me calle, enfin il s'agit de la fonction unray_exp.
Ce que je ne comprend pas c pourkoi la ligne val = primary(); se trouve dans le switch?
Car toutes les autres fonctions, mult_expr et expr ont mis cette ligne (où on obtient un caractère) en dehors du switch.
 
voilà le code:

Code :
  1. /*
  2. * Recursive descent parser for simple C expressions.
  3. * Very little error checking.
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. int expr(void);
  8. int mul_exp(void);
  9. int unary_exp(void);
  10. int primary(void);
  11. main(){
  12.       int val;
  13.       for(;;){
  14.               printf("expression: " );
  15.               val = expr();
  16.               if(getchar() != '\n'){
  17.                       printf("error\n" );
  18.                       while(getchar() != '\n')
  19.                               ; /* NULL */
  20.               } else{
  21.                       printf("result is %d\n", val);
  22.               }
  23.       }
  24.       system("PAUSE" );
  25.       exit(EXIT_SUCCESS);
  26. }
  27. int
  28. expr(void){
  29.       int val, ch_in;
  30.       val = mul_exp();
  31.       for(;;){
  32.               switch(ch_in = getchar()){
  33.               default:
  34.                       ungetc(ch_in,stdin);
  35.                       return(val);
  36.               case '+':
  37.                       val = val + mul_exp();
  38.                       break;
  39.               case '-':
  40.                       val = val - mul_exp();
  41.                       break;
  42.               }
  43.       }
  44. }
  45. int
  46. mul_exp(void){
  47.       int val, ch_in;
  48.       val = unary_exp();
  49.       for(;;){
  50.               switch(ch_in = getchar()){
  51.               default:
  52.                       ungetc(ch_in, stdin);
  53.                       return(val);
  54.               case '*':
  55.                       val = val * unary_exp();
  56.                       break;
  57.               case '/':
  58.                       val = val / unary_exp();
  59.                       break;
  60.               case '%':
  61.                       val = val % unary_exp();
  62.                       break;
  63.               }
  64.       }
  65. }
  66. int
  67. unary_exp(void){
  68.       int val, ch_in;
  69.      
  70.       switch(ch_in = getchar()){
  71.       default:
  72.               ungetc(ch_in, stdin);
  73.               val = primary();
  74.               break;
  75.       case '+':
  76.               val = unary_exp();
  77.               break;
  78.       case '-':
  79.               val = -unary_exp();
  80.               break;
  81.       }
  82.       return(val);
  83. }
  84. int
  85. primary(void){
  86.       int val, ch_in;
  87.       ch_in = getchar();
  88.       if(ch_in >= '0' && ch_in <= '9'){
  89.               val = ch_in - '0';
  90.               goto out;
  91.       }
  92.       if(ch_in == '('){
  93.               val = expr();
  94.               getchar();      /* skip closing ')' */
  95.               goto out;
  96.       }
  97.       printf("error: primary read %d\n", ch_in);
  98.       exit(EXIT_FAILURE);
  99. out:
  100.       return(val);
  101. }


 
Une remarque cependant en le placant hors du switch le programme fonctionne mal.
Merci d'avance votre aide, surtout à Emmanuel :)

mood
Publicité
Posté le 25-05-2005 à 13:45:42  profilanswer
 

n°1096582
Taz
bisounours-codeur
Posté le 25-05-2005 à 14:12:09  profilanswer
 

je passe là ... si encore tu disais quel est le problème et où est-il ...
 
et surtout, ne t'amuse pas à faire un CTRL+Z
le type de retour de main est int
if(ch_in >= '0' && ch_in <= '9') -> isdigit(ch_in)

n°1096755
Tarabiscot​e
Posté le 25-05-2005 à 15:14:48  profilanswer
 

Regarde bien, chaque fonction appelle la fonction suivante avant et pendant le switch, sauf la fonction unary_exp qui appelle uniquement dans le switch.
 
Pourquoi ? Tout simplement car les fonctions précédentes servent à gérer des opérations binaires (ayant quelque chose à gauche et à droite de l'opérateur) alors que unary_exp gère une opération unaire (uniquement à droite de l'opérateur).

n°1097274
nvictor
Posté le 25-05-2005 à 21:03:37  profilanswer
 

Merci je comprends


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  la fonction unary_exp();

 

Sujets relatifs
[résolu] fonction (mail) - bizarrerieNews avec la fonction include
[ASP] Probleme pour un appel à une fonction asp sous htmlUtilisation de la fonction CopyFile en vbs
Comment optimiser la taille des pages web en fonction de la resolutionProblème avec la fonction mail sur un site
fonction de comparaison[RESOLU]Fonction mail () problème d'envoi en HTML mais nickel en texte
Fonction pour la couleur RVB (RGB)Explication à propos de la fonction Run en vbs
Plus de sujets relatifs à : la fonction unary_exp();


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR