计算器的设计与实现 编译原理实验报告
时间:2025-02-27
时间:2025-02-27
中北大学软件学院
实 验 报 告
专 业 课程名称 学 号 姓 名
辅导教师 张 静 成绩
6、算法优先分析表及语法分析程序 //算法优先分析表
//计算器的设计与实现源代码.cpp#include<stdio.h> #include<stdlib.h> #define MaxSize 99 void translate(char str[],char exp[]) { struct { char data[MaxSize]; int top; }op; char ch; int i = 0,t = 0; op.top = -1; ch = str[i]; i++; while(ch != '\0') { switch(ch) { case '(': op.top++;op.data[op.top]=ch; break; case ')': while(op.data[op.top] != '(') { exp[t]=op.data[op.top]; op.top--; t++; } op.top--; break; case '+': case '-': while(op.top != -1&&op.data[op.top] != '(')
{ exp[t] = op.data[op.top]; op.top--; t++; } op.top++; op.data[op.top] = ch; break; case '*': case '/': while(op.data[op.top] == '/'||op.data[op.top] == '*') { exp[t] = op.data[op.top]; op.top--; t++; } op.top++; op.data[op.top] = ch; break; case ' ': break; default: while(ch >= '0'&&ch <= '9') { exp[t] = ch;t++; ch = str[i];i++; } i--; exp[t] = ' '; t++; } ch = str[i]; i++; } while(op.top != -1) { exp[t] = op.data[op.top]; t++; op.top--; } exp[t] = '\0'; }
float cal_value(char exp[]) { struct { float data[MaxSize]; int top; }st; float d; char ch; int t = 0; st.top = -1; ch = exp[t]; t++; while(ch != '\0') { switch(ch) { case '+': st.data[st.top-1] = st.data[st.top-1]+st.data[st.top]; st.top--; break; case '-': st.data[st.top-1] = st.data[st.top-1]-st.data[st.top]; st.top--; break; case '*': st.data[st.top-1] = st.data[st.top-1]*st.data[st.top]; st.top--; break; case '/': if(st.data[st.top] != 0) st.data[st.top-1]=st.data[st.top-1]/st.data[st.top]; else { printf("\n 提示:error"); exit(1); } st.top--; break; default: d=0; while(ch >= '0'&&ch <= '9') { d = 10*d+ch-'0';
ch = exp[t]; t++; } st.top++; st.data[st.top] = d; } ch = exp[t]; t++; } return st.data[st.top]; }
int main() { char ch; while(1) { char str[MaxSize],exp[MaxSize]; printf(">>输入一个表达式:\n"); gets(str); printf(">>原表达式:%s\n",str); translate(str,exp); printf(">>逆波兰式:%s\n",exp); printf(">>计算结果:%g\n\n",cal_value(exp)); printf(">>是否进行下一个运算(Y/N)?:"); scanf("%c",&ch); if(ch=='Y' || ch=='y') { gets(str); } else { break; } } //syst
em("pause"); return 0; }
7、测试及结果1、加减法运算
2、乘除法运算
3、带‘(’‘)’运算
4、四则运算
5、容错处理
8、心得本次课程设计是实现一个简易的计算器,这次课程设计采用逆波兰式的知 识,这可以很好的表示简单算术表达式,其优点在于易于计算机处理表达式。 本次设计使我进一步端正了我的学习态度,学会了实事求是,对自己要严格要 求。我觉得动手做设计之前,头脑里必须清楚该怎么做,这一点是很重要的。 就目前来说,我的动手能力虽然差一点,但我想,通过我的不懈努力,在这方 面,我总会得到提高。在此次的课程设计中我最大的体会就是进一步认识到了 理论联系实践的重要性。总而言之,此次课程设计让我学到了好多平时在课堂 上学不到的东西,增加了我的知识运用能力,增强我的实际操作能力。我相信 经过实践后的学习我可以将编译原理这门课程掌握的更好。
…… 此处隐藏:378字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:钢结构第三版课件第4章
下一篇:A国际物流经营管理目标计划书