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
| 1. #include <stdio.h>
2. #include <string.h>
3. #include <stdlib.h>
4. #include <ctype.h>
5. #include <math.h>
6.
7.
8. enum Type {Operateur, Constante, Variable};
9.
10.
11. union Info
12. {
13. double cte;
14. char *nom;
15. char op;
16. };
17.
18. struct noeud{
19. enum Type type;
20. union Info info;
21. struct noeud *gauche;
22. struct noeud *droit;
23. };
24.
25. typedef struct noeud Noeud;
26. typedef struct noeud * Expression;
27.
28.
29.
30.
31.
32. double Eval(Expression *e)
33. {
34. double r1,r2;
35.
36. if((*e)->type == Constante) return((*e)->info.cte);
37.
38. if ((*e)->type == Operateur)
39. {
40. r1=Eval(&(*e)->gauche);
41. r2=Eval(&(*e)->droit);
42. switch ((*e)->info.op)
43. {
44. case '+':return(r1+r2);
45. case '-':return(r1-r2);
46. case '*':return(r1*r2);
47. case '/':return(r1/r2);
48. }
49. }
50. /* si aucun return n'a t effectu jusqu'ici*/
51. puts("erreur (code opratoire inconnu par exemple)");
52. return(0);
53. }
54.
55.
56. double Plus (double x, double y)
57. {
58. return x+y;
59. }
60.
61. double Moins(double x, double y)
62. {
63. return x-y;
64. }
65.
66. double Mul(double x, double y)
67. {
68. return x*y;
69. }
70.
71. double Div(double x, double y)
72. {
73. return x/y;
74. }
75.
76.
77. double (*FonctionOperateur(char operateur))(double, double)
78. {
79. char ops[]={'+','-','*','/','\0'};
80. double (*fcts[])(double,double)={Plus,Moins,Mul,Div,NULL};
81. unsigned i;
82. for(i=0;fcts[i]!=NULL&&ops[i]!=operateur;++i);
83. return fcts[i];
84. } |
Partager