已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
需求分析问题描述通过模拟一个简单的计算器来进行+、-、*、/、%、(乘方)等运算,从键盘上输入一算术表达式,计算出表达式的值。具体要求1. 输入中缀表达式,例如:2*(3+4);2. 包含的运算符只能有+ 、- 、* 、/ 、(、 )、;3. 输出的形式:表达式+运算结果,例如2*(3+4)=14;注:1. 输入为空时进行提示。2. 自动屏蔽错误符号。概要设计各模块说明栈模块函数:pOperatorS push(pOperatorS s, char c);功能:将操作符压栈函数:pOperandS push(pOperandS s, float f);功能:将操作数压栈函数:pOperatorS pop(pOperatorS s);功能:将操作符出栈函数:pOperandS pop(pOperandS s);功能:将操作数出栈优先级比较模块函数:int getPosition(char opor,char * testOptr);功能:返回操作符在操作符容器中的位置函数:char precede(char optrA, char optrB):功能:比较两个操作符的优先级(通过查表实现)运算模块函数:float eValuateExpression(char * myExpression);功能:计算表达式的值函数:float operate(float a, unsigned char theta, float b);功能:求a operator b的值详细设计栈模块/操作符栈typedef struct operatorStackchar c; struct operatorStack * next; operatorS, * pOperatorS; /操作数栈typedef struct operandfloat f; struct operand * next; operandS, * pOperandS; /将操作符压栈pOperatorS push(pOperatorS s, char c) /operatorS类型的指针push,返回ppOperatorS p = (pOperatorS)malloc(sizeof(operatorS);p-c = c; p-next = s; return p; /将操作数压栈pOperandS push(pOperandS s, float f) /operandS类型的指针push,返回ppOperandS p = (pOperandS)malloc(sizeof(operandS);p-f = f; p-next =s; return p; /将操作符出栈pOperatorS pop(pOperatorS s) /operatorS类型的指针poppOperatorS q = s;s = s-next; free(q); return s; /将操作数出栈pOperandS pop(pOperandS s) /operandS类型的指针poppOperandS q = s;s = s-next; free(q); return s; 优先级比较模块/ 操作符优先级表 unsigned char prior88 = / + - * / ( ) # /*+*/, /*(*/,=, , , /*#*/, ,=, ;/返回操作符在操作符容器中的位置int getPosition(char optr,char * testOptr) for(int i = 0; i operatorSetSIZE; i+)if (optr = testOptri)return i;/比较两个操作符的优先级(通过查表实现)char precede(char optrA, char optrB) return priorgetPosition(optrA, operatorSet)getPosition(optrB, operatorSet); 运算模块# define operatorSetSIZE 8char operatorSetoperatorSetSIZE = +, -, *, /, (, ), #, ;/求a operator b的值float operate(float a, unsigned char theta, float b) switch(theta)case +: return a + b; case -: return a - b; case *: return a * b; case /: return a / b; case : return pow(a, b); default : return 0; Status in(char Test,char *TestOp)int find = false; for (int i = 0; i c != #)/表达式为空且操作符栈顶为#结束循环/连续数字输入模块if (!in(*c, operatorSet) Dr0 = *c; strcat(tempdata, Dr); c+; if (in(*c, operatorSet) data = atof(tempdata); opnd = push(opnd, data);/数字输入完毕入操作数栈 strcpy(tempdata,0); /清空 else /是操作符,与操作符栈顶比较优先级switch (precede(optr-c, *c)case :/退栈并将运算结果入栈 theta = optr-c;optr = pop(optr);b = opnd-f;opnd = pop(opnd);a=opnd-f;opnd = pop(opnd);opnd = push(opnd, operate(a, theta, b); break; /switch/if /while return opnd-f; /eValuateExpressionmain函数模块int main(void) printf(*n);printf(*本计算器提供加、减、乘、除、乘方运算,支持括号*n);printf(*n);printf(*关闭窗口直接退出*n);printf(*n);char s128;while (1)puts(n请输入表达式:); gets(s);if (strlen(s) = 0)printf(输入为空n);continue;puts(该表达式的值为:); printf(%sb=%gn,s,eValuateExpression(s);return 0;测试结果加减乘除乘方括号的测试非法字符的自动屏蔽源代码# include # include # include # include # define true 1 # define false 0 typedef int Status;# define operatorSetSIZE 8 / 操作符优先级表 unsigned char prior88 = / + - * / ( ) # /*+*/, /*(*/,=, , , /*#*/, ,=, ; /操作符容器char operatorSetoperatorSetSIZE = +, -, *, /, (, ), #, ;/操作符栈typedef struct operatorStackchar c; struct operatorStack * next; operatorS, * pOperatorS; /操作数栈typedef struct operandfloat f; struct operand * next; operandS, * pOperandS; /将操作符压栈pOperatorS push(pOperatorS s, char c) /operatorS类型的指针push,返回ppOperatorS p = (pOperatorS)malloc(sizeof(operatorS);p-c = c; p-next = s; return p; /将操作数压栈pOperandS push(pOperandS s, float f) /operandS类型的指针push,返回ppOperandS p = (pOperandS)malloc(sizeof(operandS);p-f = f; p-next =s; return p; /将操作符出栈pOperatorS pop(pOperatorS s) /operatorS类型的指针poppOperatorS q = s;s = s-next; free(q); return s; /将操作数出栈pOperandS pop(pOperandS s) /operandS类型的指针poppOperandS q = s;s = s-next; free(q); return s; /求a operator b的值float operate(float a, unsigned char theta, float b) switch(theta)case +: return a + b; case -: return a - b; case *: return a * b; case /: return a / b; case : return pow(a, b); default : return 0; Status in(char Test,char *TestOp)int find = false; for (int i = 0; i operatorSetSIZE; i+)if(Test = TestOpi)find = true; return find; /返回操作符在操作符容器中的位置int getPosition(char optr,char * testOptr) for(int i = 0; i c != #)/表达式为空且操作符栈顶为#结束循环/连续数字输入模块if (!in(*c, operatorSet) Dr0 = *c; strcat(tempdata, Dr); c+; if (in(*c, operatorSet) data = atof(tempdata); opnd = push(opnd, data);/数字输入完毕入操作数栈 strcpy(tempdata,0); /清空 else /是操作符,与操作符栈顶比较优先级switch (precede(optr-c, *c)case :/退栈并将运算结果入栈 theta = optr-c;optr = pop(optr);b = opnd-f;opnd = pop(opnd);a=opnd-f;opnd = pop(opnd);opnd = push(opnd, operate(a, theta, b); break; /switch/if /while return opnd-f; /eValuateExpression int main(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024公司单位向个人租车合同
- 2024博士聘任协议书
- 2024保全担保合同
- 2024厂房股权转让合同范本
- 2024医院技术合作协议
- 材料范文之阳光少年事迹材料
- 残疾人工疗站
- 堆焊的技术技巧及工艺方法
- 五谷杂粮购销合同协议书范本
- 景区联合运营合作协议
- 2024年广西桂物机电集团限公司第三次招聘21人公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- 心肌梗死后室间隔穿孔的治疗策略与时机
- MOOC 线性代数-浙江大学 中国大学慕课答案
- MOOC 随机过程-华东师范大学 中国大学慕课答案
- 《文创产品包装设计》课件-2.2 任务一:文创产品包装设计发展的人性化
- MOOC 犯罪现象:原因与对策-郑州大学 中国大学慕课答案
- 劳务外包服务 投标方案(技术方案)
- 部编版四年级语文下册第一单元整体作业设计
- (2024年)建筑工地新员工进场安全教育培训资料
- 2024-2030年中国电梯检验检测行业市场发展现状及投资方向研究报告
- 云南省部分地州县2022-2023学年七年级下学期期末考试数学试卷(含答案)
评论
0/150
提交评论