C++ 数据结构 课程设计报告 计算表达式由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c计算器课程设计报告”。
题目:计算表达式的值
1、问题描述
对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值。
基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,计算后缀表达式的值。
提高要求:(1)对于表达式中的简单错误,能够给出提示;
(2)不仅提示错误,也能给出错误信息(3)表达式中可以包括单个字母表示的变量(4)能够处理多种操作符(5)实现包含简单运算的计算器
(6)实现一个包含简单运算和函数运算的计算器。
2.需求分析
软件的基本功能:由键盘输入中缀表达式,程序可以将输入的中缀表达式转换成对应的后缀表达式,并计算后缀表达式的值。对于在输入时发生的简单错误,程序可以给出提示。本程序支持整数、小数、多种操作数的处理,可以计算含加、减、乘、除、运算符的表达式,并能判断表达式括号是否匹配。输入/输出形式:用户可以通过控制台,根据输入提示。输入形式:
①正确的不含字母变量的中缀表达式; ②含有简单错误的中缀表达式。
输出形式:
①对于正确的中缀表达式,可以输出其转化后的后缀表达式及表达式的计算结果;
②对于含有简单错误的中缀表达式,程序将自动输出错误提示,并给出错误信息。
测试数据要求:用户可以输入一个符合要求的中缀表达式,也可以输入一个包含简单错误的表达式。表达式中可以包括各种类型的常数以及小数等,操作符包括(+、-、*、/),同时表达式还可以包括各种括号。
3.概要设计
(1)抽象数据类型:
根据题目的要求,考虑用栈类型比较适合。ADT SeqStack Data 栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系 Operation SeqStack 前置条件:栈不存在 输入:无
功能:栈的初始化
输出:无
后置条件:构造一个空栈 ~ SeqStack 前置条件:栈已存在输入:无
功能:销毁栈 输出:无
后置条件:释放栈所占用的存储空间
Push 前置条件:栈已存在 输入:元素值x 功能:在栈顶插入一个元素x 输出:如果插入不成功,抛出异常
后置条件:如果插入成功,栈顶增加了一个元素 Pop 前置条件:栈已存在输入:无
功能:删除栈顶元素
输出:如果删除成功,返回被删元素值,否则,抛出异常
后置条件:如果删除成功,栈顶减少了一个元素 GetTop 前置条件:栈已存在 输入:无
功能:读取当前的栈顶元素
输出:若栈不空,返回当前的栈顶元素值 后置条件:栈不变
Empty 前置条件:栈已存在输入:无
功能:判断栈是否为空
输出:如果栈为空,返回1;否则,返回0 后置条件:栈不变
End ADT 4.详细设计
(1)实现概要设计的数据类型:
采用顺序栈
const int StackSize = 50;template //定义模板类SeqStack cla SeqStack { public: SeqStack();//构造函数,栈的初始化
~SeqStack();//析构函数
void Push(T x);//将元素x入栈
DataType Pop();
//将栈顶元素弹出
DataType GetTop();//取栈顶元素(并不删除)
int Empty();//判断栈是否为空
private:
DataType data[StackSize];//存放栈元素的数组
int top;//栈顶元素 };(2)主程序以及其它模块的算法描述:
这个函数主要调用了实现功能的各个函数。其步骤为:在用户没有选择退出时,先调用输入函数,输入中缀表达式;然后调用判断表达式,如果中缀表达式错误,则根据返回的值来输出错误提示,不再往下运算;如果中缀表达式正确,则将中缀表达式转换为后缀表达式,然后输出中缀表达式和转换后的后缀表达式;接着,再调用计算函数,计算后缀表达式的结果输出。最后是清屏函数。直至用户选择退出。
5、编码与调试分析
编码与调试过程中遇到的问题及解决办法:
【问题1】程序在判断表达式输入形式有误时,考虑情况不周全。解决办法:尽可能多的将表达式有误的情况考虑在内。以下为现已考虑到并解决的问题:①表达式中出现非数字或非运算符的其他字符; ②表达式中括号不匹配。
【问题2】给变量赋值时出现重定义问题。
解决办法:在定义暂存栈顶元素的变量t时,应该在函数外面定义,在函数里面给变量赋值时不能定义。【问题3】无法处理多位数和小数。
解决办法:在连续的操作数结束之后插入空格到后缀表达式中,以分隔操作数。
解决此问题的核心代码: int i,t=0;float sum=0;for(i=0;i
if(a[i]=='.'){
}
} t=i;break;if(t!=0){
} else {
} return sum;
2.待解决问题: for(i=0;i
} i++;for(;i
} sum=(a[i]-'0')*pow(0.1,i-t)+sum;if(a[i]=='.')break;sum=(a[i]-'0')*pow(10,n-(n-t)-1-i)+sum;for(i=0;i
6、使用说明
进入菜单,根据提示进行选择。
7、测试结果
(1)含小数、多位数及括号的表达式显示结果:
8、自学知识
在课程设计过程中,特别是在代码编写和调试的过程中,自学了很多新的知识。例如atof()函数,包含于表头文件 #include。其功能是: 把字符串转换成浮点数。具体的函数说明是: atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(' ')才结束转换,并将结果返回。参数字符串可包含正负号、小数点或E(e)来表示指数部分。返回值是转换后的浮点型数。
自学MFC。还有一个知识点是清屏函数,它也是包含于头文件中的,使用形式为system(“CLS”)。主要功能就是清空屏幕。
9、课程设计心得体会
通过这次课程设计,增强了我的自信心。因为在这次课程设计中,我遇到了一些问题,但是都逐个得解决了,虽然有些问题请教了同学,但是从中学了很多东西,也学到了一些处理问题的方法。在能力上得到了一些提升。同时也养成了独立思考问题,以及和同学一起探索问题的良好习惯。当然,在课程设计过程中,有些细节的处理还是不够完美,需要完善的地方还有很多,还需要继续努力,尽量将程序完善。
在编写程序过程中,得到了部分同学的帮助,如:数据间的分隔问题,得到了***同学的帮助,将中缀表达式转换为后缀表达式的算法思想参考了《数据结构课程设计》(机械工业出版社),然后根据自己的理解,完成基本算法和细节处理,最后完成了转换函数的代码编写。
在将字符串转换为浮点型数字进行运算的思想主要参考了《程序设计引导及在线实践》这本书里面的一道程序,然后加以灵活运用,转换为自己的代码。当然,为此也掌握了一些新的知识。
清屏函数是在百度百科上获取的知识,也属于自学的新知识。
参考书 [1]《c++面向对象程序设计》 清华大学出版社 谭浩强著 [2]《数据结构(C++版)》清华大学出版社 王红梅、胡明、王涛著