一元多项式运算(包括加,乘,导).doc_第1页
一元多项式运算(包括加,乘,导).doc_第2页
一元多项式运算(包括加,乘,导).doc_第3页
一元多项式运算(包括加,乘,导).doc_第4页
一元多项式运算(包括加,乘,导).doc_第5页
免费预览已结束,剩余22页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息科学与技术学院数据结构课程设计报告题目名称:一元多项式运算专业班级:学生姓名:学生学号:2010508032指导教师:高 攀完成日期:2012-01目 录1 课程设计的目的41.1 课程设计的目的41.2 课程设计的题目41.3 题目要求42 概要设计52.1 存储结构52.2 基本操作53 详细设计53.1总体流程图63.2主模块73.3、查找位置插入链接模块73.3.1函数功能:73.3.2函数入口:83.3.3函数流程图:83.4、创建多项式模块93.4.1函数功能:93.4.2函数入口:93.4.3函数流程图:93.5、多项式相加模块103.5.1函数功能:103.5.2函数入口:103.5.3函数流程图103.6多项式相乘模块103.6.1函数功能:103.6.2函数入口:113.6.3函数流程图:113.7多项式求导模块113.7.1函数功能:113.7.2函数入口:123.7.3函数流程图:123.8输出多项式模块123.8.1函数功能:123.8.2函数入口:123.8.3函数流程图:124 测试144. 1用户选择界面144. 2,两个一元多项式相加功能144.3两个一元多项式相乘功能154.4对一个一元多项式求导功能:154.5帮助功能:165 课程设计总结166参考书目:181 课程设计的目的1.1 课程设计的目的本课程设计主要解决一元多项式的运算问题,通过链表的使用,实现对一元多项式的构建、录入、存储、打印、以及之间的运算。在本课程设计中,程序设计语言为C+语言,程序采用了链表的存储方法以及结构化和模块化的设计方法,通过调试运行,可以进行多项式的相加、相乘和求导,勉强实现了设计目标,并且经过适当的完善后,将可运用到实际中解决某些问题。1.2 课程设计的题目一元多项式运算1.3 题目要求一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请按下述要求编写程序1. 对输入的一元多项式进行求导,并输出求导的结果。2. 对输入的两个一元多项式进行求和,并输出求导的结果。3. 对输入的两个一元多项式进行求积,并输出求导的结果。2 概要设计2.1 存储结构用的链式存储,一个结点有三个域分别是:系数数据域coef、指数数据域expn、指针域next。2.2 基本操作在进行多项式运算之前先要建立一个指数从高到低排列的一个一元多项式,此功能由creat()函数来实现;其中从高到低的排序插入则由insert()函数来实现;最后进行一元多项式的加法、乘法、求导则分别由函数add()、mul()、der()来实现;最后在主函数中用了switch()来进行选择。3 详细设计3.1总体流程图 3-1总体流程图3.2主模块 3-2主流程图 3.3、查找位置插入链接模块3.3.1函数功能: 查找位置插入新链接的函数,且让输入的多项式呈降序排列。3.3.2函数入口:此函数并无参数,属无返回值函数。入口函数:void insert()3.3.3函数流程图: 3-3查找位置插入链接流程图3.4、创建多项式模块3.4.1函数功能: 输入多项式3.4.2函数入口:此函数有,返回值为指针型。入口函数:PLOYList *creat()3.4.3函数流程图: 4-4输入多项式流程图3.5、多项式相加模块3.5.1函数功能: 对输入的两个一元多项式进行相加。;3.5.2函数入口:此函数有,返回值类型为指针型。入口函数:PIOYList *add()3.5.3函数流程图: 3-5多项式相加流程图3.6多项式相乘模块3.6.1函数功能: 对输入的两个一元多项式进行乘法运算。3.6.2函数入口:此函有返回值,返回值得类型为指针型。入口函数:PLOYList *mul()3.6.3函数流程图: 3-6多项式乘法流程图3.7多项式求导模块3.7.1函数功能: 对输入的一个多项式进行求导运算。3.7.2函数入口:此函数有返回值,返回值类型为指针型。入口函数:PLOYList *der()3.7.3函数流程图: 3-7多项式求导流程图3.8输出多项式模块3.8.1函数功能: 将输入的多项式按指数次数递减的顺序输出。3.8.2函数入口:此函数并无参数,属无返回值函数。入口函数:void print()3.8.3函数流程图: 3-8多项式输出流程图 4 测试4. 1用户选择界面 4-1用户选择界面 4. 2,两个一元多项式相加功能 4-2两个一元多项式相加4.3两个一元多项式相乘功能 4-3两个一元多项式相乘4.4对一个一元多项式求导功能: 4-4一个一元多项式求导4.5帮助功能: 4-5帮助用户5 课程设计总结虽然说课程设计题目老师给的时间比较早,但是由于后面有好多考试课程设计着手做的时间不是很早,起初对一元多项式运算没有多少思路,课本上这节也讲的不详细,所以我查了好多资料试图完成多项式的相加、相乘和求导,在不懈的努力下我终于完成了这次课程设计。这次课程设计我学到了不少东西,深刻认识到变成结构化和模块化的重要性,对链表的使用也更熟练了。当然也注意到很多细节问题是平时编小程序经常疏忽的,如局部变量和全局变量的定义和使用。课程设计终于做完了,虽然有些疲劳和困倦,但带给我很多的收获。数绝结构已经学了一个学期,大概三个多月了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,实际应用,已经减少了许多。对这些知识也有了更深的理解和很好的掌握。许多困惑,有许多已经通过实际操作解决了,并能够深刻认识,但也有很多没有明白,课程设计都是要在实践中摸索的,这与平时做练习是不同的,但也因为平时有许多的练习基础,会使你做起程序来,更加得心应手。另外就是要把错误总结,有许多错误或者陷阱是平时自己陷进去的,因此很深刻,但也有些错误或者陷阱是自己还没有接触或者犯过的,这就应该看多些别人的总结,使自己不犯这些错误。不让自己掉进这些陷阱。这样长期总结,会对自己有很大的帮助。程序#include#include/动态申请空间的函数的头文件typedef struct node /定义节点类型float coef; /多项式的系数 int expn; /多项式的指数 struct node * next; /结点指针域PLOYList;void insert(PLOYList *head,PLOYList *input) /*查找位置插入新链节的函数,且让输入的多项式呈降序排列。输入一次排序一次。指数从大到小的排列。*/ PLOYList *pre,*now; int signal=0; pre=head; if(pre-next=NULL) pre-next=input; /如果只有一个头结点,则把新结点直接连在后面 else now=pre-next;/如果不是只有一个头结点,则设置now指针 while(signal=0)if(input-expn expn)if(now-next=NULL)now-next=input;signal=1;elsepre=now;now=pre-next;/始终让新输入的数的指数与最后一个结点中的数的指数比较,小于则插在其后面。指针后移。else if( input-expn now-expn )input-next=now;pre-next=input;signal=1;/若新结点中指数比最后一个结点即now中的指数大,则插入now之前else/若指数相等则需合并为一个结点,若相加后指数为0则释放该结点now-coef=now-coef+input-coef;signal=1;free(input);if(now-coef=0)pre-next=now-next;free(now);/else /while/else/voidPLOYList *creat() /输入多项式PLOYList *head,*input;float x;int y;head=(PLOYList *)malloc(sizeof(PLOYList); /创建链表头head-next=NULL;scanf(%f %d,&x,&y);/实现用户输入的第一个项,包括其指数和系数while(x!=0)/当用户没有输入结束标志0时可一直输入多项式的项,且输入一个创建一个结点input=(PLOYList *)malloc(sizeof(PLOYList); /创建新链节input-coef=x;input-expn=y;input-next=NULL;insert(head,input); /每输入一项就将其排序,是的链表中多项式呈降序排列scanf(%f %d,&x,&y);return head;PLOYList *add(PLOYList *head,PLOYList *pre) /多项式相加,head为第一个多项式建立的链表表头,pre为第二个多项式建立的链表表头 PLOYList *input; int flag=0; while(flag=0)if(pre-next=NULL)flag=1; /若该链表为空,则无需进行加法运算,跳出循环elsepre=pre-next;input=(PLOYList *)malloc(sizeof(PLOYList);/申请空间input-coef=pre-coef;input-expn=pre-expn;input-next=NULL;insert(head,input); / 把g(x)插入到f(x)中,相当于两者相加,结果保存于f(x)return head;PLOYList *mul(PLOYList *head,PLOYList *pre)/多项式项乘PLOYList *hf,*pf,*qa,*qb; qa = head - next; qb = pre - next;/定义指针指向表头后一个元素,即链表中第一个元素。指向首元结点。hf = ( PLOYList * )malloc( sizeof(PLOYList);/新创建一个结点,当做表头hf - next = NULL;for ( ;qa;qa = qa - next)for( qb = pre - next;qb;qb= qb - next)/用两个循环,实现两个多项式之间每个项相乘,结果用insert函数进行排序与合并pf = ( PLOYList *)malloc(sizeof(PLOYList);pf - coef = qa - coef * qb - coef;pf - expn = qa - expn + qb - expn;pf - next = NULL;insert( hf,pf);return hf;PLOYList *der(PLOYList *head)/多项式求导PLOYList *p;p = head - next;while (p)p - coef = p - coef * p - expn;p - expn = p - expn-;p = p - next;return head;/将多项式的每项系数和指数相乘得到新的系数,指数减一得到新的指数即完成求导void print(PLOYList *fun) /输出多项式,fun指要输出的多项式链表的表头 PLOYList *printing; int flag=0; printing=fun-next;/指向首元结点 if(fun-next=NULL)/若为空表,则无需输出printf(0n);return; while(flag=0) if(printing-coef0&fun-next!=printing)printf(+);if(printing-coef=1); else if(printing-coef=-1)printf(-); elseprintf(%f,printing-coef); if(printing-expn!=0) printf(x%d,printing-expn); else if(printing-coef=1)|(printing-coef=-1)printf(1); if(printing-next=NULL)flag=1; elseprinting=printing-next;printf(n);void start() /用户选择界面printf( *n); printf( 用户选择界面 n); printf( *n); printf( * *n); printf( * 1.两个一元多项式相加 *n); printf( * 2.两个一元多项式相乘 *n); printf( * 3.对一个一元多项式求导 *n); printf( * 4.帮助 *n); printf( * 0.退出系统 *n); printf( * *n); printf( *n); printf( n); printf( 注:输入多项式格式为:系数1 指数1 系数2 指数2 ,并以0 0 结束:n); printf( n); printf( 请选择操作: );void main()PLOYList *f,*g,*pf,*hf,*p; int choose=-1; start(); while(choose!=0)scanf(%d,&choose);switch(choose)case 0:break;case 1:/多项式相加printf( 你选择的操作是多项式相加:n);printf( 请输入第一个多项式f(x):);f=creat();printf( 第一个多项式为:f(x)=);print(f);printf( 请输入第二个多项式g(x):);g=creat();printf( 第二个多项式为:g(x)=);print(g);printf( 结果为:F(x)=f(x)+g(x)=);f=add(f,g);print(f);printf(nn);printf( 继续请选择相应操作,退出请按0. );break;case 2:/多项式相乘 printf( 你选择的操作是多项式相乘:n);printf( 请输入第一个多项式f(x):);f=creat();printf( 第一个多项式为:f(x)=);print(f);printf( 请输入第二个多项式g(x):);g=creat();printf(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论