算式计算器C语言版.docx

上传人:大张伟 文档编号:10688457 上传时间:2021-05-31 格式:DOCX 页数:30 大小:216.57KB
返回 下载 相关 举报
算式计算器C语言版.docx_第1页
第1页 / 共30页
算式计算器C语言版.docx_第2页
第2页 / 共30页
算式计算器C语言版.docx_第3页
第3页 / 共30页
算式计算器C语言版.docx_第4页
第4页 / 共30页
算式计算器C语言版.docx_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《算式计算器C语言版.docx》由会员分享,可在线阅读,更多相关《算式计算器C语言版.docx(30页珍藏版)》请在三一文库上搜索。

1、ANYANG STJTI TF: OF TKCllSOLOGY课程设计说明书课程名称:数据结构设计题目:表达式计算程序设计学 院:计算机科学与信息工程学院学生姓名:学生学号:专业班级:计算机科学与技术嵌入式 (12-1)指导教师:冯 贺2014年 6月16日课程设计任务书设计题目学生姓名表达式算式程序设计计算机科学与技术嵌入式(12-1)设计要求:1 .计算表达式手工录入,计算结果必须正确2 .支持两位以上的整数和浮点数的运算3 .运算符优先级表可在程序中直接通过代码初始化4 .能够检查表达式是否合法,对于错误的表达式要能够给出错误原因学生应完成的工作:构建栈和运算符优先级表,程序能够计算加,

2、减,乘,除和逻辑运算,并且能够运行 成功。参考文献阅读:1严蔚敏,吴伟民 编著.数据Z勾(c语言版).北京,清华大学出版社,20122严蔚敏,吴伟民 编著.数据结构题集(C语言版).北京,清华大学出版社,20073 Sartaj Sahni 编著.Data Structures,Algorithms,and Applications in C+.McGraw-Hill工作计划:1、第一周的第一天:小组布置设计题目;说明进度安排。2、第一周的第二天:小组审题,查阅资料,进行设计前的必要资料准备。3、第一周的第三天、第四天、第五天:程序编写、上机调试4、第二周的第一天至第三天:上机调试程序、结果分

3、析。5、第二周的第四天:撰写设计报告。6、第二周的第五天:设计答辩及成绩评定。任务下达日期:2014年6月 8日任务完成日期:2014年6月17日学生(签名)表达式计算程序设计摘要:按照要求构造运算符优先级表,编写优先级比较算法。利用栈结构和优先级编写表 达式计算方法。首先构建了一个数据栈,此栈用来储存浮点型数字;一个符号栈用来存 储运算符号。然后借助于两个栈和一个结构体运算。关键词:优先级表优先级比较算法栈1 .设计背景11.1 数据结构算法设计11.2 知识运用 12 .设计方案12.1 程序设计方案 12.2 模块设计方案 13 .方案实施23.1 模块代码23.2 流程图64 .测试

4、85 .总结 103.1总结103.1谢词106 .参考文献 107 .附件 111.1 设计背景1.2 数据结构算法设计1、王亚洲完成了对符号栈的编写2、王秀文完成了对数字栈的编写3、李渊完成了对符号结构题的编写和对符号结构体数组的初始化4、童世超完成了对字符数字转化为浮点型数字5、曾冰寒完成对主函数的编写1.3 知识运用学完数据结构,充分利用所学栈的知识,完成表达式程序设计2. 设计方案2.1 程序设计方案先定义一个结构体,用来存放符号和优先级和定义两个栈,一个数字栈、一个符号栈。然后借助于符号结构体和两个栈通过逻辑算法设计一个表达式计算程序2.2 模块设计方案该模块是表达式计算的核心模块

5、即计算模块。先判断接收的是不是左括号,左括号的优先级最低,如果是左括号无条件入栈;如果不是左括号则判断是不是右括号,右括号的优先级最高,遇到右括号无条件出栈运算,然后循环知道遇见左括号把括号的全部运算完毕然后继续接收字符;如果既不是左括号也不是右括号则判断是不是运算符,如果是运算符则判断和运算符栈的栈顶元素的优先级, 如果栈顶元素的优先级等于或高于接收元素则出栈运算否则入栈;最后判断是不是等号,如果是等好则出栈运算,一直到数字栈中就剩下最后一个元素结果这输出结果,运算结束。3. 方案实施3.1 模块代码if(=c)/ 左括号时入栈Push(S,c);/ 左括号入符号栈c=getchar();/

6、 接着读下一个字符else if()=c)/ 当是右括号时计算括号内的内容Pop(S,a);/符号栈出栈if(=a)/判断刚出栈的符号是不是左括号c=getchar();/如果是左括号说明括号内运算完了,接收下个字符else/ 不是左括号说明没运算玩,接着运算SPop(Z,q);/ 数字栈出栈,用于运算SPop(Z,p);/ 数字栈出栈,用于运算SPush(Z,Operate(p,a,q); / 调用 Operate 计算,然后把计算结果入数字栈else if(+=c|-=c|*=c|/=c)/ 当是运算符的时候判断前一个运算符,前一个运算符高的时候运算/ 否则入栈if(0=StackLeng

7、th(S) / 判断符号栈是否为空Push(S,c);/ 符号入符号栈c=getchar();/ 接着接收下个字符else if(fuhao(GetTop(S),c)=0) / 调用 fuhao 函数判断栈顶元素和刚接收的符号的优先级/如果栈顶元素优先级高活相等就运算Pop(S,a);/符号出栈SPop(Z,q);/数字出栈SPop(Z,p);/数字出栈SPush(Z,Operate(p,a,q);/ 调用 Operate 计算,然后把计算结果入数字栈else/ 如果刚接收的符号的优先级高则入栈Push(S,c);/ 符号入符号栈c=getchar();/ 接着接收下个字符else if(=c

8、)/ 当是等号的时候/ 当输入等号时符号栈中应该至少有一个符号,数字栈中应该有两个数字Pop(S,a);/符号栈出栈SPop(Z,q);/数字栈出栈SPop(Z,p);/数字栈出栈SPush(Z,Operate(p,a,q);/ 调用 Operate 计算,然后把计算结果入数字栈if(1=SStackLength(Z) / 判断数字栈是否就剩一个数字/ 如果就剩一个数字则说明运算结束if(0!=StackLength(S)/ 判断符号栈是否为空/ 运算结束符号栈应该为空,不为空则说明输入错误printf(输入有错! n);/错误提示return ;/ 结束该函数/ 最后一个数字即运算结果出栈S

9、Pop(Z,n);printf(%7.3fn,n);/ 输出运算结果return;/ 结束该函数else/ 如果接受的既不是数字又不是运算符还不是等号则说明输入非法字符printf(tt 出错 !nnt 输入非法字符!或未输入等号!nn);/ 错误提示return;/ 结束该函数6模块流程图如图1-284.测试主界面如图2-1图2-1主页面9传统计算结果如图2-2图2-2传统计算结果自定义优先运算输入如图2-3鼻 C: DocuAEnts and Sett ingsAi2 2 11无无戈 W附附的 + - * / 不入1A1A 一寸H.-.qn.3 三诉请请请图2-3自定义优先级5结论图2-4

10、自定义优先级运算错误提示(一)如图2-5cf C: Docimeirt s and Sett insAd*iiList rat ax出错,输入法字符!或未输入等号!1:继续计算 其他键退出计算图2-5错误提示(一)11错误提示(二)如图2-6H 从从“ 异心,珏 WEUUK JL3mdiILL出现错误,缺少数字fPress any key to continue图2-6错误提示(二)5.1总结通过数据结构课程设计真正把知识点运用到实际问题中去更熟悉了栈的使用,最重要的是学会了很多知识,考虑问题方面也变得更加周到一些,在调试过程中遇到错误时, 特别感谢老师一步一步帮助我们查找错误并讲解,让很多模

11、糊的地方瞬间清楚了很多。5.2谢词在此次课题设计中感谢老师在百忙之中抽出时间对我们的亲切指导,感谢组员们的 热心配合,感谢所参考的书本的作者。6.参考文献1严蔚敏,吴伟民 编著.数据Z勾(c语言版).北京,清华大学出版社,20122严蔚敏,吴伟民编著.数据结构题集(C语言版).北京,清华大学出版社,20073 Sartaj Sahni 编著.Data Structures,Algorithms,and Applications in C+.McGraw-Hill7. 附件源代码:/* 表达式计算程序设计#include#include#include#defineOK1#defineTRUE1

12、#defineFALSE0#defineBAI100#defineSHI10typedefcharSElemType;typedeffloatElemType;/ 存放符号的栈typedef structSElemType*base;SElemType*top;intstacksize;SqStack;/ 存放数字的栈typedef struct12intStack;ElemTypeElemType*base;*top;stacksize;25/ 运算符结构体structchar m;int n;Fu5;/ 构造一个符号栈void InitStack(SqStack &S)S.base=(SE

13、lemType*)malloc(BAI*sizeof(SElemType);if(!S.base)exit(FALSE);S.top=S.base; / 栈初始化的时候头和尾指向相同S.stacksize=BAI;/* 符号入栈int Push(SqStack &S,SElemType e)if(S.top-S.base=S.stacksize) / 检查是否满,如果满了再添加内存S.base=(SElemType*)realloc(S.base,(S.stacksize+SHI)*sizeof(SElemType);if(!S.base)exit(FALSE);S.top=S.base+S.

14、stacksize; / 内存可能从新分配,所以 top 要从新弄S.stacksize=+SHI;*S.top+=e;return OK;/* 符号出栈int Pop(SqStack &S,SElemType &e)if(S.top=S.base) / 头尾相同则说明是个空栈printf(t出现错误!nn);printf(t缺少符号!nn);exit(0);e=*-S.top;return OK;/* 返回符号栈的长度int StackLength(SqStack S)return S.top-S.base;/ 返回符号栈顶元素 char GetTop(SqStack S) if(S.top

15、=S.base)return FALSE;return *(S.top-1);/ 构造一个数字栈void SInitStack(Stack &S)S.base=(ElemType*)malloc(BAI*sizeof(ElemType);if(!S.base)exit(FALSE);S.top=S.base; / 栈初始化的时候头和尾指向相同S.stacksize=BAI;/* 数字入栈int SPush(Stack &S,ElemType e)if(S.top-S.base=S.stacksize) / 检查是否满,如果满了再添加内存S.base=(ElemType*)realloc(S.b

16、ase,(S.stacksize+SHI)*sizeof(ElemType);if(!S.base)exit(FALSE);S.top=S.base+S.stacksize; / 内存可能从新分配,所以 top 要从新弄S.stacksize=+SHI;*S.top+=e;return OK;/* 数字出栈int SPop(Stack &S,ElemType &e)if(S.top=S.base) / 头尾相同则说明是个空栈printf(t出现错误!nn);printf(t缺少数字!nn);exit(0);e=*-S.top;return OK;/* 返回数字栈的长度int SStackLen

17、gth(Stack S)return S.top-S.base;/ 返回数字栈顶元素float SGetTop(Stack S)if(S.top=S.base)return FALSE;return *(S.top-1);/* 主界面int jiemian()int n;printf(ntt 欢迎使用计算器tnn);printf(t1:传统计算机* / 优先于 + -n);printf(t2: 自定义优先序列 nt 输入其它命令退出 n);printf(t 请选择: );scanf(%d,&n);getchar();return n;/ 传统优先级void chuantong() / 传统优先

18、级* 、 / 为第一优先级, +、 - 为第二优先级Fu0.m=+;Fu1.m=-;Fu2.m=*;Fu3.m=/;Fu4.m=(;Fu0.n=1;Fu1.n=1;Fu2.n=2;Fu3.n=2;Fu4.n=0;/ 重新定优先级void xin()int i;Fu0.m=+;Fu1.m=-;Fu2.m=*;Fu3.m=/;Fu4.m=(;Fu4.n=0;for(i=0;i4;i+)printf(请输入 c 的优先级:,Fui.m);scanf(%d,&Fui.n);getchar();system(cls);/ 清除显示器上前面的东西/ 计算float Operate(float a,char

19、 c,float b)switch(c)case+:return a+b;break;case-:return a-b;break;case*:return a*b;break;case/:return a/b;break;/ 判断符号的等级int fuhao(char a,char b)int i,j;for(i=0;i5;i+)for(j=0;j5;j+)if(Fui.m=a&Fuj.m=b)/ 优先级越高数值越大return Fui.n-Fuj.n;/ 表达式计算void jisuan(SqStack &S,Stack &Z)char c,shu10,a;int i=0,j,b=1;fl

20、oat m=0,n=0.1,p,q;c=getchar();while(1)/ 输入数字的时候先以字符串的方if(0=c&c=9)|.=c)式储存下来shui+=c;c=getchar();else if(0!=i)/ 当输入的不是数字时把原来存储字符串的数字转换成浮点型然后压入栈for(j=0;j=0) / 调用 fuhao 函数判断栈顶元素和 刚接收的符号的优先级/ 如果栈顶元素优先级高活相等就运算Pop(S,a);/符号出栈SPop(Z,q);/数字出栈SPop(Z,p);/数字出栈SPush(Z,Operate(p,a,q);/ 调用 Operate 计算,然后把计算结果 入数字栈 e

21、lse/如果刚接收的符号的优先级高则入栈 Push(S,c);/符号入符号栈c=getchar();/接着接收下个字符 else if(=c)/ 当是等号的时候/ 当输入等号时符号栈中应该至少有一个符号,数字栈中应该有两个数字Pop(S,a);/符号栈出栈SPop(Z,q);/数字栈出栈SPop(Z,p);/数字栈出栈SPush(Z,Operate(p,a,q);/ 调用 Operate 计算, 然后把计算结果入数字栈if(1=SStackLength(Z) / 判断数字栈是否就剩一个数字/ 如果就剩一个数字则说明运算结束判断符号栈是否为空/ 运算结束符号栈应该为空, 不为空则说明n);/ 错

22、误提示/ 结束该函数/ 最后一个数字即运算结果出栈/ 输出运算结果/ 结束该函数if(0!=StackLength(S)/输入错误printf( 输入有错!return ;SPop(Z,n);printf(%7.3fn,n);return;else/ 如果接受的既不是数字又不是运算符还不是等号则说明输入非法字符printf(tt 出错 !nnt 输入非法字符!或未输入等号! nn);/错误提示return;/ 结束该函数/* 主函数void main()SqStack S;/定义一个符号栈Stack Z;/定义一个整数栈int n;InitStack(S);/对符号栈进行初始化SInitSta

23、ck(Z);/ 对数字栈进行初始化n=jiemian();while(n=1|n=2)system(cls);/ 清除显示器上前面的东西if(1=n)/ 先输入优先级chuantong();if(2=n)xin();jisuan(S,Z);printf(t1:继续计算 nt 其他键退出计算nt:);scanf(%d,&n);system(cls);/ 清除显示器上前面的东西if(1!=n)break;n=jiemian();指导教师评语:1、课程设计报告:a、内容:不完整口* 详细匚b、方案设计:较差 口基本合理口合理匚c、实现:未实现口部分实现口全部实现口d、文档格式:不规范口基本规范口规范 匚2、出勤:全勤 口缺勤次3、答辩:a、未能完全理解题目,答辩情况较差口b、部分理解题目,部分问题回答正确口c、理解题目较清楚,问题回答基本正确 口d 、理解题目透彻,问题回答流利口课程设计报告成绩: ,占总成绩比例:50%课程设计其它环节成绩:环节名称: 出勤,成绩: ,占总成绩比例: 20%环节名称: 答辩,成绩: ,占总成绩比例: 30%总成绩:指导教师签字:年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1