《程序语言课程设计 - 高次多项式的加法和乘法》
- 格式:doc
- 大小:321.32 KB
- 文档页数:26
西安文理学院软件学院课程设计报告设计名称:数据结构课程设计设计题目:两个高次多项式的加法和乘法学生学号:1402120135专业班级:软件工程1班学生姓名:张文东学生成绩:指导教师(职称):韩利凯(教授)课题工作时间:2014.6.16 至2014.6.27软件学院课程设计任务书指导教师:韩利凯院长:日期:2014年6月16日软件学院课程设计进度安排表学生姓名:张文东学号:1402120135 专业:软件工程班级:1班指导教师签名:2014年6月16日成绩评定表学生姓名:张文东学号:1402120135 专业:软件工程班级:1班摘要摘要:本课程设计主要解决任意两个高次多项式的乘法运算。
所设计的数据结构应尽可能节省存储空间,程序的运行时间应尽可能少。
从题目看出所设计的程序应能达到的功能,设计好的程序要满足以上两点。
在数据输入方面可以根据一元高次多项式的特征,从左到右开始,按每一项指数、系数的顺序输入。
这里要留意一个问题,因为要相乘的多项式项数是未知的,所以选择什么样的存储方式在本课程设计中尤为重要,这也是本程序好坏的一个评定。
程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在商业中解决实际问题。
关键词:高次多项式;加法;乘法;时间复杂度;空间复杂度西安文理学院计算机科学系课程设计报告目录目录 (I)第一章课题背景 (2)1.1 绪论 (2)1.2 主要内容 (2)第二章设计简介及设计方案论述 (3)2.1 系统分析 (3)2.1.1 功能需求 (3)2.1.2 数据需求 (3)2.1.3 系统需求 (3)2.2 总体设计 (3)2.2.1 系统设计方案 (3)2.2.2 功能模块设计 (4)第三章详细设计 (5)3.1 主要流程图 (5)3.2 链表模块 (6)3.3 加法模块 (8)3.4 乘法模块 (10)第四章设计结果及分析 (12)4.1 调试与测试 (12)4.1.1 调试 (12)4.1.2 测试 (12)4.1.3 运行界面 (13)4.2 结果分析 (13)总结 (14)参考文献 (15)附录 (16)第一章课题背景1.1 绪论随着科技的进步,社会的不断发展,计算器已普遍应用于各行各业,为了帮助人们提高工作效率,节约运算时间,设计一个多功能的计算器是很有必要的,在此设计一个高次多项式计算器可以很方便的对多项式相加、相减、相乘,对提高人们的运算效率很有帮助。
这样一个程序需要用到C++多方面的知识,要实现多项式的建立和输入输出等功能,必须要熟练的掌握C++,在此尤其是链表的灵活运用和结点特点。
1.2 主要内容用C++语言实现多项式的输入输出和多项式的加减乘等运算,其中主要用到链表和结点的相关知识,具体功能如下:1)输入并建立多项式;2)输出多项式;3)两个多项式相加,输出和多项式;4)两个多项式相减,输出差多项式。
第二章设计简介及设计方案论述2.1 系统分析2.1.1 功能需求实现任意两个高次多项式的加法和乘法2.1.2 数据需求在输入过程中,首先要给定输入的数据,数据只能是数字,不能是字母或其他,不能连续输入数据,必须要求以空格分开要输入的数据。
2.1.3 系统需求系统必须安全可靠,不会出现无故死机状态,运算速度要快。
2.2 总体设计2.2.1 系统设计方案用户输入高次多项式系数和指数,用单链表储存你输入的数据,输出两个多项式相加和相乘之后的结果。
(1) 数据结构的选择本程序选择的数据结构是单链表,原因如下:当需要插入数据元素时,临时动态地为其申请一个存储空间,而不是将结点放在一个定义的数组中,删除数据元素时,可以释放该数据元素所占用的空间,即可以根据表的实际需要临时动态的分配存储空间以存储表中的数据元素。
单链表是有限个具有相同数据类型的数据元素组成的链表且该链表的每一个结点只有一个指针域。
带头结点的单链表是在单链表的第一个结点之前加一个同类型的结点,目的是为了使链表有一致的描述。
本程序解决的是两多项式相乘的问题,多项式的项数本身就是不确定的,而且相乘后的多项式可能含有指数相同的问题,这时就需要合并,合并后其中的一项就没有用了需要删除,不然就浪费内存空间。
基于以上几点所以采用了链表。
链表具有动态生成,灵活添加或删除结点的特点,尽可能节省存储空间。
(2) 文件保存方式运用带头节点的单链表储存多项式。
(3) 抽象数据类型定义主要定义多项式的系数和指数,系数项和指数项均用整型定义。
(4) 存储结构采用链式结构,建立链表储存输入的多项式(5) 算法设计先将两个已知的多项式的指数和系数存放在指定链表中在执行乘法运算。
乘法运算的过程是将A式中的第一项与B式的每一项相乘,在将A式的第二项与B式的每一项相乘,依次下去直到A式的所有项与B式乘完为止。
将相乘后所得的指数、系数存在预先建好的C链表中。
C链表中如果有指数相同的项就需要合并,合并时将结果放在前一个项中,将后一项删除。
首先定义3个指针,x、y、z,x、y指向首元素结点z指向第二个结点,用z结点中指数项与x结点的指数项比较,如果不同指针z向后移,若相同则将z结点的系数加到x上去然后将z所在结点空间释放,并且指针z后移。
直到指针z指向空后,将指针x后移一项,并令z指向x的下一项,然后按上述步骤依次执行,直到x指向空结束。
这里指针y是z的前驱结点他的作用是合并后结点空间释放结点空间将此结点的前后两项链接起来。
本程序核心部分全部是运用while 循环语句实现的。
2.2.2 功能模块设计第三章详细设计多项式的建立主要需要建立新链表,并分配给这个新链表一定量的存储空间,分配的存储空间内进行运算;多项式加减乘等运算主要运用了链表的建立,链表存储空间分配,链表的查找,插入与连接进行计算。
3.1 主要流程图此阶段是程序构建的思路,是本程序的结构图,同时也体现出本程序将要达到的功能,如图3-1所示:图 3-1 主流程图3.2 链表模块此阶段是程序中链表的主要流程,如图3-2所示:图 3-2 链表结构图主要代码如下:list<term> Poly_add(list<term>&poly_list_first,list<term>&poly_list_second) {list<term> poly_list_result; //用以存储运算结果list<term>::iterator iter_first = poly_list_first.begin();list<term>::iterator iter_second = poly_list_second.begin();/*该while循环针对两个链表迭代器都没有指到结尾的情形*/while (iter_first != poly_list_first.end() && iter_second != poly_list_second.end()){term t_temp;term t_first = (term)*iter_first;term t_second = (term)*iter_second;if (t_first.exp>t_second.exp){poly_list_result.push_back(t_first);iter_first++;}else if (t_second.exp>t_first.exp) {poly_list_result.push_back(t_second);iter_second++;}else{t_temp.coef = t_first.coef + t_second.coef;t_temp.exp = t_first.coef;poly_list_result.push_back(t_temp);iter_first++;iter_second++;}}//该for循环针对第一个多项式的迭代器没有指到结尾for (;iter_first != poly_list_first.end();iter_first++){poly_list_result.push_back(*iter_first);}//该for循环针对第二个多项式的迭代器没有指到结尾for (; iter_second != poly_list_second.end(); iter_second++){poly_list_result.push_back(*iter_second);}return poly_list_result;}3.3 加法模块此阶段是程序中加法模块的主要流程,如图3-3所示:图 3-3 加法模块结构主要代码如下:void Poly_add(){list<term>::iterator iter_first = m_poly_list_first.begin();list<term>::iterator iter_second = m_poly_list_second.begin();while (iter_first != m_poly_list_first.end() && iter_second != m_poly_list_second.end()){term t_temp;term t_first = (term)*iter_first;term t_second = (term)*iter_second;if(t_first.exp>t_second.exp){m_poly_list_result.push_back(t_first);iter_first++;}else if(t_second.exp>t_first.exp){m_poly_list_result.push_back(t_second);iter_second++;}else{t_temp.coef = t_first.coef + t_second.coef;t_temp.exp = t_first.exp;m_poly_list_result.push_back(t_temp);iter_first++;iter_second++;}}for(;iter_first != m_poly_list_first.end(); iter_first++){m_poly_list_result.push_back(*iter_first);}for (;iter_second != m_poly_list_second.end(); iter_second++){m_poly_list_result.push_back(*iter_second);}}3.4 乘法模块此阶段是程序中乘法模块的主要流程,如图3-4所示:图3-4 乘法模块结构主要代码如下:void Poly_multi(){list<term> poly_list_result;list<term>::iterator iter_first = m_poly_list_first.begin();for (; iter_first != m_poly_list_first.end(); iter_first++){list<term> poly_list_temp; //用以存储多项式的中间运算结果list<term>::iterator iter_second=m_poly_list_second.begin();for (;iter_second != m_poly_list_second.end();iter_second++){term t_temp; //用以存储项的中间运算结果term t_first = (term)*iter_first;term t_second = (term)*iter_second;//此处实现多项式项的相乘t_temp.coef = t_first.coef*t_second.coef; //系数相乘t_temp.exp = t_first.exp + t_second.exp; //指数相加poly_list_temp.push_back(t_temp);}//此处调用私有成员函数Poly_add()poly_list_result = Poly_add(poly_list_temp, poly_list_result);}//将运算结果赋值给私有数据成员,用以输出m_poly_list_result = poly_list_result;}第四章设计结果及分析4.1 调试与测试4.1.1 调试调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。