实验二实验报告.docx_第1页
实验二实验报告.docx_第2页
实验二实验报告.docx_第3页
实验二实验报告.docx_第4页
实验二实验报告.docx_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论