合肥学院 计算机科学与技术系 课程设计报告 2 0 0 9 ~2 0 1 0 学年第二学期 课程 数据结构与算法 课程设计名称 模拟计算器程序 学生姓名 桂俊飞 学号 0 8 0 4 0 1 2 0 2 1 专业班级 0 8 计本(2 )班 指导教师 王昆仑 张贯虹 2 0 1 0 年 6 月 一:问题分析和任务定义 本程序写的是模拟计算器。 要求设计一个模拟计算器的程序,要求对包含加、减、乘、除、括号运算符及 SQR 和ABS 函数的任意整型表达式进行求解。 这里可以做一个扩展,比如实现求某数的N次方,求模,一些常用的三角函数等。这个程序实际上就是对一个表达式进行计算。而一个算术表达式中包含各种运算符,每个运算符的等级可能会不同,这就成了本程序需要解决的一个主要的问题之一了。另外计算器中需要有各种数学函数,比如:abs sqrt sin cos tan 等,如何对这些函数进行处理,也是本程序能成功的一个关键。还有一个问题就是如何处理操作符和操作数之间的关系也是一个要点。例如:1+2*(3-2/1),经过怎么样的变换和处理能得出结果5。数据的输入这里应该要用字符,然后通过字符和整形之间的关系进行转换即可,这样处理的话,就方便很多了。 二:概要设计和数据结构选择 输入的时候将一个算术表达式用一个字符数组来接收,故需要对这个数组进行处理,让操作数和操作符分开,这里我想把开始的算术表达式转换成一个后缀表达式,这样在进行计算的时候就简单多了。而在转换的过程中,对运算符的处理极为重要,这里运用堆栈,用堆栈的先进后出的特点,来处理运算符优先级的问题,让其成功转换成后缀表达式。而在对后缀表达式进行处理的时候,又需要一个堆栈,这个堆栈存放操作数的。并将运算结果存入该栈中。两个堆栈的数据结构如下: struct { char data[Maxlen]; int top; }optr; //定义运算符栈 struct { double data[Maxlen]; int top; }opnd; //定义操作数栈 这里定义了类型,并且一起定义了两者类型的对象 optr,opnd。 在将算术表达式转换成后缀表达式,定义change 函数; 在对后缀表达式进行处理时,定义jisuan 函数, 另外本程序有个欢迎界面,由 meun 函数实现。 因此主函数于各函数之间的关系为: meun() main() change() jisuan() 本程序实现的流程: 这里的两个主要的函数具体算法在详细设计中有说明。 三:详细设计和编码 首先定义两个数组,p[400]用来存放算术表达式,q[400]...