1 问题描述
将多个多项式输入并存储在内存中,然后对多项式进行加、减运算并输出结果。
2 数据结构描述一元多项式的表示方式:如 f=6x^5-7x^4+3 表示为 f=6,5 -7,4 3,0
每个多项式用单链表来存储:
typedefstructPolyNode
{
floatcoef;// 系数
intexpn;// 指数
structPolyNode*next;// 指向下个结点的指针
}Poly;
图示举例
3 主要算法描述主要功能:对输入的一元多项式进行加减运算并输出
程序主要模块:如下图所示
3.1 模块一:一元多项式的建立结点类型为:结构体Poly
数据流:系数、指数。
函数名为:
intCreatPoly(P_Poly*,int);
3.2 模块二:两个一元多项式的加法数据流:两个一元多项式相加后的结果
函数名为:
voidAddPoly(P_Poly*,P_Poly,P_Poly);
3.3 模块三:两个一元多项式的减法数据流:两个一元多项式相减后的结果;
函数名为:
voidDecPoly(P_Poly*,P_Poly,P_Poly);
程序中的主要函数及相应功能:
// 创建一元多项式
intCreatPoly(P_Poly*,int);
// 输出一元多项式
voidOutP_Poly(P_Poly);
// 两个多项式求和
voidAddPoly(P_Poly*,P_Poly,P_Poly);
// 两个多项式求差
voidDecPoly(P_Poly*,P_Poly,P_Poly);
4 程序的调试
4.1 问题一
由于程序运用了输入输出流的控制符,而没有包含文件,所以在连接时,出了错,后来看了下面窗口的错误提示,才知道自己忘了包含该文件进去。
4.2 问题二
因为输入多项式每一项时的格式为”系数,指数”,而用cin语句不知怎么解决,后来查找资料获悉用scanf函数可以实现输入的格式控制,因此运用了scanf这一函数。
4.3 问题三
输出多项式时,要输出正负号,这是一个比较麻烦的问题。开始想到了运用输出控制符setiosflags(ios::showpos)直接输出正号。可是却发现启用了该控制符后对后面的输出也起作用,导致x后面的指数在输出时也带上了正号。左思右想,得不到解决办法,只好另寻方法。最后多项式是可以输出来了,可是每次输出完后随即弹出出错框(如下图),这个问题本人至今还想不透。
5 程序测试
多项式名称不符合时的情况(本程序规定用单个小写字母命名多项式),如:命令输出一元多项式A
多项式不存在时的输出情况,如:命令输出一元多项式a
两多项式相加,如:a=6x^6-10x^5+4x^2 b=-x^6+5x^5+6x^4+2x^3
两多项式相减,如:a=-6x^7+10x^6+4x^4 b=5x^6-9x^5+5x^4+3x^3
6 程序特色本程序的力求简单明了,让使用者易于掌握。因此每一个指令都有相应的提示语句,分别按照这些提示语句进行选择,就会出现相应的菜单或实现相应的功能。
原本想加上乘法和除法的运算,可是每项互乘除要求两个链表的节点数据也相乘除,问题太多,又想不到好的解决办法,想不出具体实现的函数,因此,没有进行功能扩展。这也是本程序最大的不足之处。
每个函数对应解决一个问题,模块分明,系统出现错误时,易于限定哪个函数还不能完美实现某个功能,以便修改并改进。在完善程序的时候,这个特点帮了我很大的忙。例如调试减法运算功能时,系统有时会出现错误,因此便锁定在相减的函数上查找不足。又如,自己对输出这一功能不是很满意,要改进的话则只需在输出函数上做改进。
7 课程设计总结
这一次的课程设计,我再次感到了程序世界的美妙。
记得在分析完问题的要求后,对要写的程序进行了初步的模块划分。当时觉得问题看起来很简单,但是在具体实现的函数编写上遇到了很多的细节问题。在着手解决这些问题的过程中,虽然耗费了不少时间,困难重重,但付出了总会有收获,即使有一些问题自己还没有十分满意的解决掉,但在无形之中自己又增加了不少课外知识和一些以前忽略的知识点,拓宽了自己的视野,提升了自己的动手能力。
最主要的是对单向链表的使用有了更深刻的了解和掌握,因为多项式的计算要求用单向链表来实现,所以在做课程设计之前通过网上找资料,查参考书等对单向链表的使用比以前掌握的更加到位,并且能够灵活运用,通篇几乎用的都是单向链表,这是受益的一大重点。
参考资料
[1] 数据结构教程学习指导(第3版). 李春葆. 北京: 清华大学出版社, 2009
[2] C++程序设计. 谭浩强. 北京: 清华大学出版社, 2008
[3] C++程序设计题解与上机指导. 谭浩强. 北京: 清华大学出版社, 2007
[4] C++程序开发例题与习题. 张基温. 北京: 清华大学出版社, 2001