C语言简单计算器(基于栈和逆波兰表达式)这几天忙着开学的事宜,一直没时间刷提,就把今天刚做好的课程设计——简易计算器贴在这给大家参考!(计算小数时要用0减正数并用括号括起来,这一点不足以后再改进)
1 #include <stdio.h>
2 #include <windows.h>
3 #include <conio.h>
4 #include <math.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #define N 200
8
9 void trans(char str[],char exp[])//这是求解的关键,将算术表达式转换成逆波兰表达式。
10 {
11 struct
12 {
13 char data[N];
14 int top; //栈顶指针
15 }op; //在这设立一个字符栈,用于存放字符!
16
17 char ch;
18 int i=0, t=0;
19 op.top = -1;
20 ch = str[i];
21 i++;
22
23 while(ch != '\0')//判断字符是数字的进入后缀表达式数组exp[N],字符进入字符栈中
24 {
25 switch(ch)
26 {
27 case '(':
28 op.top++;
29 op.data[op.top] = ch;
30 break;
31 case ')':
32 while(op.data[op.top] != '(')
33 {
34 exp[t] = op.data[op.top];
35 op.top--;
36 t++;
37 }
38 op.top--;
39 break;
40 case '+':
41 case '-':
42 while(op.top!=-1 && op.data[op.top]!='(')
43 {
44 exp[t] = op.data[op.top];
45 t++;
46 op.top--;
47 }
48 op.top++;
49 op.data[op.top] = ch;
50 break;
51 case '*':
52 while (op.data[op.top]!='(' && op.data[op.top]=='/')
53 {
54 exp[t] = op.data[op.top];
55 op.top--;
56 t++;
57 }
58 op.top++;
59 op.data[op.top] = ch;
60 break;
61 case '/':
62 while (op.data[op.top]!='(' && op.data[op.top]=='*')
63 {
64 exp[t] = op.data[op.top];
65 op.top--;
66 t++;
67 }
68 op.top++;
69 op.data[op.top] = ch;
70 break;
71 case '^':
72 while (op.data[op.top]!='(' && op.data[op.top]=='^')
73 {
74 exp[t] = op.data[op.top];
75 op.top--;
76 t++;
77 }
78 op.top++;
79 op.data[op.top] = ch;
80 break;
81
82 case ' ': break;
83 default:
84 while((ch>='0' && ch<='9') || (ch == '.'))
85 {
86 exp[t] = ch;
87 t++;
88 ch = str[i];
89 i++;
90 }
91 i--;
92 exp[t] = '#';
93 t++;
94 }
95 ch = str[i];
96 i++;
97 }
98 while(op.top!=-1 && op.data[op.top]!='(')
99 {
100 exp[t] = op.data[op.top];
101 t++;
102 op.top--;
103 }
104 exp[t] = '\0';
105 }
106
107 float compvalue(char exp[]) //对后缀表达式进行求解,计算。
108 {
109 struct
110 {
111 float data[N];
112 int top; //栈顶指针
113 }st; //设立一个数值栈,将数组中的数值推入栈中
114
115 char ch;
116 int t = 0;
117 float d, n,sum;
118 st.top = -1;
119 ch = exp[t];
120 t++;
121
122 while(ch !='\0')//对数值和字符进行运算
123 {
124 switch(ch)
125 {
126 case '+': st.data[st.top-1] = st.data[st.top-1] + st.data[st.top];
127 st.top--;break;
128 case '-': st.data[st.top-1] = st.data[st.top-1] - st.data[st.top];
129 st.top--;break;
130 case '*': st.data[st.top-1] = st.data[st.top-1]*st.data[st.top];
131 st.top--;break;
132 case '^': st.data[st.top-1] = pow(st.data[st.top-1],st.data[st.top]);
133 st.top--;break;
134 case '/':
135 if (st.data[st.top] != 0)
136 st.data[st.top-1] = st.data[st.top-1]/st.data[st.top];
137 else
138 {
139 printf("\n\t除零错误\n");
140 exit(0);
141 }
142 st.top--;break;
143 default :
144 d = 0.0;
145 if(ch>='0' && ch<='9')
146 {
147 while (ch>='0' && ch<='9')
148 {
149 d = d*10 + (ch - '0');
150 ch = exp[t];
151 t++;
152 }
153 }
154 st.top++;
155 sum = 0.0;
156 if (ch == '.')
157 {
158 ch = exp[t];t++;
159 n = 0.1;
160 while (ch>='0' && ch<='9')
161 {
162 sum = sum + (ch-'0')*n;
163 n = n*0.1;
164 ch = exp[t];
165 t++;
166 }
167 }
168 st.data[st.top] = d + sum;
169 }
170 ch = exp[t];
171 t++;
172 }
173 return st.data[st.top];
174 }
175
176 int main()
177 {
178 char str[N], exps[N];
179
180 system("cls"); //清屏功能
181 system("color 12"); //控制屏幕的颜色,不同的数字代表不同的颜色
182 printf("********************************************************************************\n");
183 printf("* *\n");
184 printf("* 简 易 计 算 器 *\n");
185 printf("* *\n");
186 printf("* 2010 级 信息工程学院 *\n");
187 printf("* 软件一班 汪涛 *\n");
188 printf("********************************************************************************\n");
189
190 printf(" \n");
191 printf(" \n");
192 printf(" \n");
193 printf(" 1 2 3 + - \n");
194 printf(" \n");
195 printf(" 4 5 6 * / \n");
196 printf(" \n");
197 printf(" 7 8 9 = \x1b \n");
198 printf(" \n");
199 printf(" 0 . ( ) End \n");
200 printf(" \n");
201
202 printf("输入运算表达式只包括 + - * / ( ) ^ .:\n");
203 printf("若结束计算请输入0\n\n");
204 printf("表达式:");
205 while(gets(str))
206 {
207 if(str[0]=='0' && strlen(str)==1) break;
208 printf("\n");
209 trans(str,exps);
210 printf("后缀表达式:%s\n",exps);
211 printf("\n");
212 printf("计算结果: %g\n\n\n", compvalue(exps));
213 printf("**********************************感谢您的使用!******************************\n");
214 }
215 return 0;
216 }