用C语言解决一元多项式运算问题

上传人:飞*** 文档编号:30231909 上传时间:2018-01-28 格式:DOC 页数:27 大小:348KB
返回 下载 相关 举报
用C语言解决一元多项式运算问题_第1页
第1页 / 共27页
用C语言解决一元多项式运算问题_第2页
第2页 / 共27页
用C语言解决一元多项式运算问题_第3页
第3页 / 共27页
用C语言解决一元多项式运算问题_第4页
第4页 / 共27页
用C语言解决一元多项式运算问题_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《用C语言解决一元多项式运算问题》由会员分享,可在线阅读,更多相关《用C语言解决一元多项式运算问题(27页珍藏版)》请在金锄头文库上搜索。

1、 用 C 语言解决一元多项式运算问题摘 要 本数据结构课程设计运用一元多项式运算的基本法则,对一元多项式的加法、减法运算进行设计,并有人机交换界面。本课程设计中,系统开发平台为 Windows XP;程序设计语言主要采用 C 语言,其中也掺入了 C+部分语句,兼而两者的优势并存;开发环境为 Microsoft Visual C+ 6.0,友好的界面、功能更加强大,相比较于 C 语言的专用开发环境 Turbo C,其操作简单却已能完全在其环境中借用 C 语言开发设计出源程序;程序运行平台为 Windows 98/2000/XP,程序兼容特性比较强,具有很好的移植特性。在程序设计中,整个程序层次结

2、构突出,直观性与易理解性优势明显。程序通过调试运行后,完成了一元多项式运算的各种操作的设想,符合题目要求,初步实现了设计目标,达到了预期的效果。关键词:数据结构课程设计; C 程序语言;多项式1 引言计算机的快速发展,特别是计算机网络的发展,越来越深刻地改变了人们生活的方方面面。但同时,也要求人们能高效、有效地完成某些运算任务。而“ 数 据 结 构 ”是 计 算 机 程 序 设 计 的 重 要 理 论 技 术 基 础 , 它 不 仅 是 计 算 机 学 科 的 核 心 课 程 , 而 且 已成 为 其 他 理 工 专 业 的 热 门 选 修 课 。 本课程设计主要是对所学的数据结构知识进行整合

3、和运用,解决在一元多项式的运算,包括加法、减法及乘法运算,通过该程序,将大大减少运算时间,提高工作效率。2 课程设计目的在我们对一个具体的问题进行分析时,往往要抽象出一个模型,设计一个算法来实现所需要达到的功能。在此程序中,我们主要是综合运用所学过的知识,回顾 VC+编程的同时,熟悉并掌握数据结构中的算法分析与设计。同时,要掌握类 C 语言的算法转换成 C 程序并上机调试的基础;这次课程设计,要求设计一个 C 语言程序,该程序能够按照指数的降幂排列,并完成多个一元多项式的相加、相减、相乘,并将结果输出。通过这次课程设计,进一步巩固数据结构等课程所学的知识,特别加强指针、结构体、文件数据类型的应

4、用,熟悉面向过程的结构化、了解面向对象设计方法,通过本次课程设计的实践,加强动手能力的操作,掌握程序设计的流程,以及用 C 程序语言编写程序,从而解决实际问题的能力,了解掌握 Visual C+开发环境,在老师的指导下,独立完成课程设计的全部内容,培养严谨的科学态度和认真学习的工作作风,培养创造性思维方式。3 系统分析3.1 问题描述用 C 语言编写一段程序,该程序的功能相当于一个一元多项式的计算器,能够实现按照指数降幂建立并输出多项式,并且能够完成多个多项式的相加、相减及相乘运算及结果输出的功能。此程序的数据结构是选择用带表头结点的单链表存储多项式。虽然一元多项式可以用顺序和链表存储结果表示

5、,但顺序结构的最大长度很难确定。比如当多项式的系数较大时,此时就会浪费存储空间,所以应该选用链表结构来存储一元多项式。但链表的结构体可以用来存储多项式的系数、指数、下一个指针 3 个元素,这样便于实现任意多项式的加法、减法、乘法运算。3.2 设计思路通过对问题的描述,可设计出如图 2-1 所示的一元多项式总流程图:图 3-1 一元多项式运算总流程图(1)一元多项式的建立开始申请结点空间+num输入多项式的项数指针数组tempi中(i=1num)输入多项式各项的系数 x, 指数 y输出已输入的多项式 进行多项式的加法、减法及乘法运算结束否是是否输入正确输入多项式采用头插法的方式,输入多项式中的一

6、个项的系数和指数,就产生一个新的结点,建立起它的右指针,并用头结点指向它;为了判断一个多项式是否输入结束,定义一个结束标志,当输入非 0 时就继续;输入为 0 时,就结束一个多项式的输入。(2)显示一元多项式如果系数是大于 0 的话就输出的形式;如果系数是小于 0 的话就输出的形式;如果指数为 0 的话就直接输出;如果指数是 1 的话就直接输出;如果指数是-1 的话,就直接输出。(3)一元多项式加法运算 从两个多项式的头部开始判断,当两个多项式的某一项度不为空时,假设 P、Q 分别指向多项式 A 和多项式 B 中当前进行比较的结点,然后比较两个结点中的指数项,有三种情况:1、当 P 所指结点的

7、指数小于 Q 的话,就应该复制 P 的结点到多项式链中。2、P 所指结点的指数如果大于 Q 的指数的话,就应该复制 Q 的结点到多项式链中。3、当 P 所指结点的指数等于 Q 所指结点的指数时,则将两个结点中的系数相加,若和不为 0,则修改 P 所指结点的系数值,同时释放 Q 所指结点;若和为 0,从多项式 A 的链表中删除相应结点,并释放 P、Q 所指结点。加法流程图如图 2-2 所示:图 3-2 一元多项式加法运算流程图(4)一元多项式的减法开始定义存储结果的空链 r是 否输出存储多项式的和的链 r结束是否同指数项系数相加后存入 r中把 p 中各项系数改变符号后存入r 中直接把 q 中各项

8、存入 r存储多项式 2 的空链 Q 是否为空存储多项式 1 的空链 P 是否为空合并同类项 从两个多项式的头部开始判断,当两个多项式的某一项度不为空时,假设 P、Q 分别指向多项式 A 和多项式 B 中当前进行比较的结点,然后比较两个结点中的指数项,有三种情况:1、当 P 所指结点的指数小于 Q 的话,就应该复制 P 的结点到多项式链中。2、P 所指结点的指数如果大于 Q 的指数的话,就应该复制 Q 的结点到多项式链中,并将建立的结点系数变为相反数。3、当 P 所指结点的指数等于 Q 所指结点的指数时,并将 Q 的结点系数变为相反数,并将两个结点中的系数相加,若和不为 0,则修改 P 所指结点

9、的系数值,同时释放 Q 所指结点;若和为 0,从多项式 A 的链表中删除相应结点,并释放 P、Q 所指结点。减法流程图如图 2-3 所示:开始定义存储结果的空链 r是 否输出存储多项式的和的链 r结束是否同指数项系数相加后存入 r中把 p 中各项系数改变符号后存入r 中直接把 q 中各项存入 r存储多项式 2 的空链 Q 是否为空存储多项式 1 的空链 P 是否为空合并同类项图 3-3 一元多项式减法运算流程图4 系统的详细设计4.1 主要算法设计(1)结构式的定义typedef int status; typedef struct NodeType float fCoeff; /系数int

10、iExpon; /指数struct NodeType *next; /下一个指针 NodeType, *LinkType;(2)系统中使用的各函数说明:status MakePolyBuff(PolyPointer *, const int); status MakeNode(polynomial *, const float, const int); void AppNodeToList(polynomial *, polynomial); /* 在链表尾追加结点 */ status CreatePolyn(PolyPointer, int); /输入 m 项的系数和指数,建立表示一元多项式

11、的有序链表status ProcStrError(const char); /* 检查输入的数据 */ void SortPolyn(PolyPointer, int); /* 根据 iExpon 域对链表进行升序排序 */ void DestroyBuff(PolyPointer, const int); /销毁一元多项式void DestroyPolyn(polynomial); int PolynLength(const polynomial); /* 求链表的长度 */ void AddProcess(PolyPointer, const int, PolyPointer, const

12、 int); /加法运算void SubstractProcess(PolyPointer, const int, PolyPointer); /减法运算void MultiplyProcess(PolyPointer, const int, PolyPointer); /乘法运算void PrintPolyn(const polynomial); /打印输出的一元多项式void MergePolynCoeff(PolyPointer, int); /* 在有序链表中,合并同类项 */(3)主函数:int main(void) int iCounter, iPolyNum; /* 多项式链表缓

13、冲区中链表的个数 */ PolyPointer PolyBuff = NULL; /* 用户输入的多项式链表缓冲区 */ polynomial PolyAddRes = NULL, /* 存放连加结果链表 */ PolySubRes = NULL, /* 存放连减结果链表 */ PolyMulRes = NULL; /* 存放连乘结果链表 */ char strNum10; do printf(请输入需要构造多项式的个数,至少 2 个: ); gets(strNum); iPolyNum = atoi(strNum); while (iPolyNum *cpCurr | *cpCurr 9)

14、| (*(cpCurr + 1) = 0 ) printf(输入数据出错,请注意正确的输入方式!n); return FALSE; cpCurr+; 4.3 运行结果分析:对程序进行编译运行,按照窗口的提示,输入多项式个数。首先考虑多项式个数为 2,且各指数的系数为正数时。输入数据是,特别注意多项式系数、指数的输入,如图图 3-1 的所示:图 3-1 多项式的输入运行图最终运算结果,如图 3-2:图 3-2 一元多项式运算运行图 1当多项式个数大于等于 2 时,且输入各指数的系数均为正数时,对程序进行编译。输入多项式个数为 3,具体运行图如图 3-3 所示:图 3-2 一元多项式运算运行图 2

15、当输入的多项式系数中存在负数时,对程序进行编译,结果运行图如图 3-4 所示:5 结束语 5.1 端正程序设计态度在这次课程设计中,我遇到了不少困难,但是在我的坚持和虚心请教中都得到顺利解决。在这次课程设计中,我发现理论必须和实践相结合,才能真正学会程序设计,才能完成一个课题。在这次设计中我参考了不少书籍,从中学到了课堂中无法学到的许多东西,对此我感到很兴奋。原来不断的学习,不断的探索是苦中带着甜,虽然经历了不少弯路,经历了不少挫折,但当程序调试成功后,当运行能达到要求后,我感到十二分成就感。面对课题,要展现自信出来,这是成功的一半,在这个设计过程中,不懂的可以虚心向老师请教,与同学交流经验。态度是成功的基石!5.2 程序设计体会在我这课题中,关键在于对一元多项式的表示及相加的操作。这个实际问题,在学习过的知识中找到一种合适的模型来模拟,数据结构的选择是主要,而对于编写代码,所涉及的并不是很复杂,对于链表数据存储访问方式,在 C 语言的学习过程中已经有过很多讲解,为了进一步了解,我还阅读了一些数据结构中关于链表的叙述。对于这个课题,运用 C 语言简单一点的结构化程序设计已足能满足要求而不至于结构过于复杂,为了简便的实现插入操作,我选择了一个带表头结点的链表。在写源代码时要注意指针使用的正确性,为产生的新结点需及时分配存储空间。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号