C++一元多项式计算问题-课程设计说明书2

合集下载

c多项式课程设计

c多项式课程设计

c 多项式课程设计一、课程目标知识目标:1. 学生能够理解并掌握多项式的定义,区分单项式、多项式的概念。

2. 学生能够运用多项式的加减法则,准确进行多项式的加减运算。

3. 学生能够掌握多项式的乘法法则,解决简单的多项式乘法问题。

4. 学生能够理解多项式乘法与因式分解的关系,掌握基本的因式分解方法。

技能目标:1. 学生能够运用所学知识,解决实际问题中涉及的多项式运算。

2. 学生能够通过画图、列式等方法,将现实问题转化为多项式问题,并运用多项式知识解决。

3. 学生能够运用逻辑思维和分析能力,对多项式进行简化、分解和求解。

情感态度价值观目标:1. 学生对数学学科产生兴趣,认识到数学知识在生活中的实际应用。

2. 学生在学习过程中,培养良好的逻辑思维能力和解决问题的信心。

3. 学生通过小组合作、讨论交流,培养团队协作精神和沟通能力。

课程性质:本课程为初中数学课程,以多项式为主要教学内容,注重培养学生的运算能力和逻辑思维能力。

学生特点:初中生正处于形象思维向抽象思维过渡的阶段,需要通过具体实例和实际操作,帮助他们理解抽象的数学概念。

教学要求:教师应注重启发式教学,引导学生通过自主探究、合作交流等方式,掌握多项式的相关知识和技能。

同时,关注学生的情感态度价值观的培养,使他们在学习过程中形成积极的学习态度和价值观。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 多项式的定义与分类- 单项式与多项式的概念- 多项式的项与次数2. 多项式的加减运算- 多项式加减法的法则- 合并同类项的方法3. 多项式的乘法运算- 多项式乘法的法则- 乘法运算中的符号处理4. 多项式乘法与因式分解- 多项式乘法与因式分解的关系- 常见因式分解方法:提公因式法、公式法等5. 多项式的应用- 实际问题中的多项式运算- 通过画图、列式等方法,将现实问题转化为多项式问题教学内容安排与进度:第一课时:多项式的定义与分类,了解单项式与多项式的概念,掌握多项式的项与次数。

一元多项式的计算问题-数据结构与算法课程设计报告

一元多项式的计算问题-数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告2009 ~2010 学年第 2 学期课程数据结构与算法课程设计名称一元多项式的计算问题学生姓名周维学号**********专业班级08计科(2)指导教师王昆仑教授2010年6月题目:(一元多项式的计算问题)要求能够按照指数降序排列建立并输出一元多项式;能够完成两个一元多项式的相加、相减,并将结果输入。

一、问题分析和任务定义1.问题分析本程序关键点是如何将输入的两个多项式相加、相减操作。

①如何将输入的一元多项式按指数的降序排列②如何确定要输入的多项式的项数;③如何将输入的两个一元多项式显示出来。

④如何将输入的两个一元多项式进行相加操作。

⑤如何将输入的两个一元多项式进行相减操作。

本程序是通过链表实现一元多项式的相加减操作。

2、任务定义此程序需要完成如下的要求:将多项式按照指数降序排列建立并输出,将两个一元多项式进行相加、相减操作,并将结果输入。

a:输入多项式的项数并建立多项式;b:输出多项式,输出形式分别为浮点和整数序列,序列按指数升序排列;c:多项式a和b相加,建立多项式a+b;d:多项式a和b相减,建立多项式a-b。

e:多项式的输出。

二、数据结构的选择和概要设计:(1)数据结构的选用A:基于链表中的节点可以动态生成的特点,以及链表可以灵活的添加或删除节点的数据结构,为了实现任意多项式的加法,减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元属;例如,图1中的两个线性链表分别表示一元多项式和一元多项式。

从图中可见,每个结点表示多项式中的一项。

图1 多项式表的单链存储结构B:本设计使用了以下数据结构:t ypedef struct {float coef; //系数int expn; //指数} ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode;C:设计本程序需用到九个模块,用到以下九个子函数如下:1、void Menu()//建立菜单2、LNode *InitList() // 创建链表3、void ChaLNode(LNode *L,ElemType x)//插入链表4、LNode *AddPolyn(LNode *A,LNode *B)//多项式相加5、void Invert(LNode *L)//逆序输出链表6、void Print(LNode *L)//输出多项式7、main()//主程序模块调用链一元多项式的各种基本操作模块。

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

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

用C语言解决一元多项式运算问题摘要本数据结构课程设计运用一元多项式运算的基本法则,对一元多项式的加法、减法运算进行设计,并有人机交换界面。

本课程设计中,系统开发平台为Windows XP;程序设计语言主要采用C语言,其中也掺入了C++部分语句,兼而两者的优势并存;开发环境为Microsoft Visual C++ 6.0,友好的界面、功能更加强大,相比较于C语言的专用开发环境Turbo C,其操作简单却已能完全在其环境中借用C语言开发设计出源程序;程序运行平台为Windows 98/2000/XP,程序兼容特性比较强,具有很好的移植特性。

在程序设计中,整个程序层次结构突出,直观性与易理解性优势明显。

程序通过调试运行后,完成了一元多项式运算的各种操作的设想,符合题目要求,初步实现了设计目标,达到了预期的效果。

关键词:数据结构课程设计; C程序语言;多项式1 引言计算机的快速发展,特别是计算机网络的发展,越来越深刻地改变了人们生活的方方面面。

但同时,也要求人们能高效、有效地完成某些运算任务。

而“数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其他理工专业的热门选修课。

本课程设计主要是对所学的数据结构知识进行整合和运用,解决在一元多项式的运算,包括加法、减法及乘法运算,通过该程序,将大大减少运算时间,提高工作效率。

2 课程设计目的在我们对一个具体的问题进行分析时,往往要抽象出一个模型,设计一个算法来实现所需要达到的功能。

在此程序中,我们主要是综合运用所学过的知识,回顾VC++编程的同时,熟悉并掌握数据结构中的算法分析与设计。

同时,要掌握类C语言的算法转换成C程序并上机调试的基础;这次课程设计,要求设计一个C语言程序,该程序能够按照指数的降幂排列,并完成多个一元多项式的相加、相减、相乘,并将结果输出。

通过这次课程设计,进一步巩固《数据结构》等课程所学的知识,特别加强指针、结构体、文件数据类型的应用,熟悉面向过程的结构化、了解面向对象设计方法,通过本次课程设计的实践,加强动手能力的操作,掌握程序设计的流程,以及用C程序语言编写程序,从而解决实际问题的能力,了解掌握Visual C++开发环境,在老师的指导下,独立完成课程设计的全部内容,培养严谨的科学态度和认真学习的工作作风,培养创造性思维方式。

一元多项式的计算数据结构课程设计

一元多项式的计算数据结构课程设计

一元多项式的计算—加,减摘要(题目)一元多项式计算任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输入;目录1.引言2.需求分析3.概要设计4.详细设计5.测试结果6.调试分析7.设计体会8.结束语一:引言:通过C语言使用链式存储结构实现一元多项式加法、减法和乘法的运算。

按指数降序排列。

二:需求分析建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果三:概要设计存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。

链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。

创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。

1.单连表的抽象数据类型定义:ADT List{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={<ai-1,ai>| ai-1, ai∈D,i=2,…,n}基本操作:InitList(&L)//操作结果:构造一个空的线性表CreatPolyn(&L)//操作结果:构造一个以单连表存储的多项试DispPolyn(L)//操作结果:显示多项试Polyn(&pa,&pb)//操作结果:显示两个多项试相加,相减的结果} ADT List2.本程序包含模块: typedef struct LNode //定义单链表{}LNode,*LinkList;void InitList(LinkList &L) //定义一个空表{ }void CreatPolyn(LinkList &L) //用单链表定义一个多项式{ }void DispPolyn(LinkList L) //显示输入的多项式{ }void Polyn(LinkList &pa,LinkList &pb){}void main(){//定义一个单连表;cout<<endl<<" *****************欢迎来到一元多项式计算程序*************** "<<endl;LNode *L1,*L2;Polyn(L1,L2); }2.1 加,减操作模块——实现加减操作各模块之间的调用关系如下:主程序模块加法操作模块减法操作模块基本算法:1、输入输出(1)功能:将要进行运算的多项式输入输出。

c多项式类课程设计

c多项式类课程设计

c 多项式类课程设计一、课程目标知识目标:1. 理解多项式的定义,掌握多项式的表示方法;2. 学会多项式的加减运算规则,能够正确进行计算;3. 掌握多项式的乘法运算,了解乘法与幂的关系;4. 了解多项式与单项式的乘除法则,并能应用于实际问题。

技能目标:1. 能够准确、迅速地进行多项式的加减乘除运算;2. 能够运用因式分解方法简化多项式;3. 能够将实际问题转化为多项式方程,并解决实际问题;4. 能够运用多项式性质进行推理和证明。

情感态度价值观目标:1. 培养学生对数学学科的兴趣,增强学习数学的自信心;2. 培养学生严谨、细心的学习态度,提高学生的逻辑思维能力;3. 培养学生合作交流、互助共赢的团队精神,激发学生探索数学问题的热情;4. 培养学生将数学知识应用于实际生活的意识,提高解决实际问题的能力。

课程性质:本课程为初中数学课程,以多项式为基础,结合实际应用,锻炼学生的运算能力和逻辑思维能力。

学生特点:初中生具有较强的求知欲和好奇心,有一定的运算基础,但需要进一步培养逻辑思维能力和解决问题的能力。

教学要求:注重理论与实践相结合,以学生为主体,引导学生主动探究,激发学生的学习兴趣和积极性。

通过本章节学习,使学生能够熟练掌握多项式的相关知识和运算技能,提高数学素养。

二、教学内容1. 多项式的定义与表示方法- 多项式的概念- 多项式的表示方法- 多项式的项、次数与系数2. 多项式的加减法- 多项式加减法的运算规则- 合并同类项- 实例分析与练习3. 多项式的乘法- 多项式乘法的运算规则- 乘法与幂的关系- 实例分析与练习4. 多项式与单项式的乘除法- 乘除法则- 实例分析与练习5. 多项式的因式分解- 因式分解的概念与方法- 应用因式分解简化多项式- 实例分析与练习6. 多项式的应用- 将实际问题转化为多项式方程- 解决实际问题- 综合应用题分析与练习教学内容安排与进度:第一课时:多项式的定义与表示方法第二课时:多项式的加减法第三课时:多项式的乘法第四课时:多项式与单项式的乘除法第五课时:多项式的因式分解第六课时:多项式的应用本教学内容依据课程目标,结合教材章节内容,注重科学性和系统性,循序渐进地引导学生掌握多项式的相关知识。

课程设计说明书一元多项式的代数运算.(DOC)

课程设计说明书一元多项式的代数运算.(DOC)

《数据结构》课程设计说明书题目一元多项式的代数运算学号1376807331姓名武飞指导教师康懿日期2015/6/27内蒙古科技大学课程设计任务书课程名称数据结构课程设计设计题目一元多项式的代数运算指导教师康懿时间2015 年春学期第 17 周至第 19 周一、教课要求1.掌握数据结构与算法的设计方法,具备初步的独立剖析和设计能力2.初步掌握软件开发过程的问题剖析、系统设计、程序编码、测试等基本方法和技术3.提升综合运用所学的理论知识和方法独立剖析和解决问题的能力4.训练用系统的看法和软件开发一般规范进行软件开发,培育软件工作者所应具备的科学的工作方法和作风二、设计资料及参数每个学生在教师供给的课程设计题目中随意选择一题,独立达成,题目选定后不行改换。

一元多项式的代数运算以链表储存一元多项式,在此基础上达成对多项式的操作。

要求设计类(或类模板)来描绘一元多项式,包含必需的结构函数和析构函数,以及实现以下要求:输入多项式、输出多项式多项式加法(重载运算符“+”)、多项式乘法(重载运算符“* ”)多项式中无重复阶项和无零系数项要求输出结果的升幂和降幂两种摆列状况并设计主函数测试该类。

三、设计要求及成就1.剖析课程设计题目的要求2.写出详细设计说明3.编写程序代码,调试程序使其能正确运转4.设计达成的软件要便于操作和使用5.设计达成后提交课程设计报告四、进度安排资料查阅与议论( 1 天)系统剖析( 2 天)系统的开发与测试( 5 天)编写课程设计说明书和查收( 2 天)五、评分标准1.依据平常上机考勤、表现和进度,教师将每日点名和检查2.依据课程设计达成状况,一定有可运转的软件。

3.依据课程设计报告的质量,若有相同,则全部相同的全部人均判为不及格。

4.依据辩论的状况,应能够以清楚的思路和正确、精练的语言表达自己的设计和回答教师的发问六、建议参照资料1.《数据结构(C 语言版)》严蔚敏、吴伟民主编清华大学第一版社 2004.11 2.《数据结构课程设计事例精编(用C/C++描绘)》,李建学等编著,清华大学第一版社2007.2目录第 1 章需求剖析 (3)第 2 章整体设计 (4)2.1 多项式双链循环链表的生成函数 (4)2.2 实现两个一元多项式的加法函数 (5)2.3 实现两个一元多项式的乘法函数 (7)2.4 将结果按幂的升序办理函数 (8)2.5 输出函数 (9)第 3 章详细设计 (12)3.1 主程序流程图 (12)3.2 主要算法的流程图 (13)第 4 章测试 (17)第 5 章总结 (20)参照文件 (20)附录:程序代码 (21)第 1章需求剖析两个一元多项式加法与乘法的实现,顾名思义,本程序的主要功能就是对两个一元多项式进行代数上的加法与乘法运算。

一元多项式计算(数据结构课程设计)

一元多项式计算(数据结构课程设计)

一元多项式计算(数据结构课程设计)一、系统设计1、算法思想根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应指数相加(减),若其和(差)不为零,则构成“和(差)多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别写到“和(差)多项式”中去。

因为多项式指数最高项以及项数是不确定的,因此采用线性链表的存储结构便于实现一元多项式的运算。

为了节省空间,我采用两个链表分别存放多项式a 和多项式b,对于最后计算所得的多项式则利用多项式a进行存储。

主要用到了单链表的插入和删除操作。

(1)一元多项式加法运算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为零的话,用头插法建立一个新的节点。

P 的指数小于q的指数的话就应该复制q的节点到多项式中。

P的指数大于q的指数的话,就应该复制p节点到多项式中。

当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。

当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生。

(2)一元多项式的减法运算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就相减;相加的和不为零的话,用头插法建立一个新的节点。

p的指数小于q的指数的话,就应该复制q的节点到多项式中。

P的指数大于q的指数的话就应该复制p的节点到多项式中,并且建立的节点的系数为原来的相反数;当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。

当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数。

2、概要设计(1)主函数流程图:(注:a代表第一个一元二次方程,b代表第二个一元二次方程)(2)一元多项式计算算法用类C语言表示:Typedef struct00{ //项的表示,多项式的项作为LinkList的数据元素Float coef;//细数Int expn;//指数}term,ElemType;//两个类型名:term用于本ADT,ElemType为LinkList的数据对象名Typedef LinkList polynomial://用带表头的节点的有序链表表示多项式//基本操作的函数原型说明Void CreatePolyn(polynomail&P);//输入n的系数和指数,建立表示一元多项式的有序链表P 销毁一元多项式P Void DestroyPolyn(polynomailP);销毁一元多项式PvoidPrintPoly(polynomail P);//打印输入一元多项式PIntPolynLength(polynnomail P);//返回一元多项式P中的项数void CreatPolyn(polynomail&Pa.polunomail&Pb);//完成多项式相加运算,即:Pa=Pa+Pb,并贤惠一元多项式Pb voidSubtractPolyn(polunomail&Papolunomail&Pb);//完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb//基本操作的算法描述Int cmp(tem a,temp b);//依a的指数值<(或=)(或>b的住数值,分别返回-1、0和+1Void CreatePolyn(polynomail&P,int m){//输入m项的系数和指数,建立表示一元多项式的有序链表PInitList(P);h=GetHead(P);E.coef=0.0; e.expn=-1;S erCurElem(h,e);//设置头结点的数据元素For (i=1;i<=m;++i){ //依次输入m个非零项Scanf(e.coef,e.epn);If(!LocateElem(P,e,q,(*cmp)())){//当前链表中不存在该指数项If(MakeNode(s,e))InsFirst(q,s);//生成节点并插入链表}}}//CreatPolun二、详细设计1、算法实现(1)输入一元多项式函数:void shuchu(pnode *head){pnode *p;int one_time=1;p=head;while(p!=NULL) /*如果不为空*/{if(one_time==1){if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/printf("%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/else if(p->xishu==1||p->xishu==-1)printf("X^%d",p->zhishu); /*如果系数是1的话就直接输出+x*//*如果系数是-1的话就直接输出-x号*/else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);one_time=0;}else{if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/{if(p->xishu>0)printf("+%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/}else if(p->xishu==1) /*如果系数是1的话就直接输出+x号*/printf("+X^%d",p->zhishu);else if(p->xishu==-1) /*如果系数是-1的话就直接输出-x号*/printf("X^%d",p->zhishu);else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("+%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/printf("%5.2fX^%d",p->xishu,p->zhishu);}p=p->next; /*指向下一个指针*/}printf("\n");}(2)加法函数/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}(3)减法函数/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}2、程序代码/*一元多项式计算*//*程序功能:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;*//*提示:输入完一元多项式之后,输入“0 0”结束本一元多项式的输入*//*注意:系数只精确到百分位,最大系数只能为999.99,指数为整数.如果需要输入更大的系数,可以对程序中5.2%f进行相应的修改*/#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<conio.h>/*建立结构体*/typedef struct pnode{float xishu; /*系数*/int zhishu; /*指数*/struct pnode *next; /*下一个指针*/}pnode;/*用头插法生成一个多项式,系数和指数输入0时退出输入*/pnode * creat()int m;float n;pnode *head,*rear,*s; /*head为头指针,rear和s为临时指针*/ head=(pnode *)malloc(sizeof(pnode));rear=head; /*指向头*/scanf("%f",&n); /*系数*/scanf("%d",&m); /*输入指数*/while(n!=0) /*输入0退出*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=n;s->zhishu=m;s->next=NULL;rear->next=s; /*头插法*/rear=s;scanf("%f",&n); /*输入系数*/scanf("%d",&m); /*输入指数*/}head=head->next; /*第一个头没有用到*/return head;}/*调整多项式*/void tiaozhen(pnode *head){pnode *p,*q,*t;float temp;p=head;while(p!=NULL){q=p;t=q->next;while(t!=NULL){if(t->zhishu>q->zhishu)q=t;t=t->next;}temp=p->xishu;p->xishu=q->xishu;q->xishu=temp;temp=p->zhishu;p->zhishu=q->zhishu;q->zhishu=temp;p=p->next;}/*显示一个多项式*/void shuchu(pnode *head){pnode *p;int one_time=1;p=head;while(p!=NULL) /*如果不为空*/{if(one_time==1){if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/printf("%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/else if(p->xishu==1||p->xishu==-1)printf("X^%d",p->zhishu); /*如果系数是1的话就直接输出+x*//*如果系数是-1的话就直接输出-x号*/else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);one_time=0;}else{if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/{if(p->xishu>0)printf("+%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/}else if(p->xishu==1) /*如果系数是1的话就直接输出+x号*/printf("+X^%d",p->zhishu);else if(p->xishu==-1) /*如果系数是-1的话就直接输出-x号*/printf("X^%d",p->zhishu);else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("+%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);}p=p->next; /*指向下一个指针*/}printf("\n");/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}/*两个多项式的减法运算*/pnode * sub(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r;float x; /*x为系数相减*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*两个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu-q->xishu; /*系数相减*/if(x!=0) /*相减的差不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=-q->xishu; /*建立的节点的系数为原来的相反数*/s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}else{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}while(p!=NULL) /*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}while(q!=NULL) /*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=-q->xishu; /*建立的节点的系数为原来的相反数*/ s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}void add_main(){pnode * a,*b,*c;printf("\n输入第一个一元多项式:\n系数指数\n");a=creat();tiaozhen(a);printf("\n输入第二个一元多项式:\n系数指数\n");b=creat();tiaozhen(b);c=add(a,b);printf("第一个一元多项式如下:");shuchu(a);printf("第二个一元多项式如下:");shuchu(b);printf("两式相加如下:");shuchu(c);}void sub_main(){pnode * a,*b,*c;printf("\n输入第一个一元多项式:\n系数指数\n");a=creat();tiaozhen(a);printf("\n输入第二个一元多项式:\n系数指数\n");b=creat();tiaozhen(b);c=sub(a,b);printf("第一个一元多项式如下:");shuchu(a);printf("第二个一元多项式如下:");shuchu(b);printf("两式相减如下:");shuchu(c);}void open(){printf("\n****************************************************\n");printf(" 功能项: * 1 两个一元多项式相加;2 两个一元多项式相减;0 退出*\n");printf("****************************************************\n\n请选择操作: ");}void main(){int choose;open();while(choose!=0){scanf("%d",&choose);getchar();switch(choose){case 0:return;case 1:printf("\n 两个一元多项式相加\n");add_main();choose=-1;open();break;case 2:printf("\n 两个一元多项式相减\n");sub_main();choose=-1;open();break;default:printf("没有该选项!请重新选择操作!\n\n");open();}}}三、测试方案及结果1、测试方案在Visual C++ 6.0环境中调试运行。

一元多项式的计算课程设计报告

一元多项式的计算课程设计报告

合肥学院计算机科学与技术系课程设计报告2008~2009学年第二学期课程程序设计语言Ⅱ课程设计课程设计名称多项式的计算学生姓名王建敏学号0804013029专业班级计算机科学与技术(3)班指导教师张贯虹汪彩梅2009年6月一、课程设计题目:多项式(单项链表的应用)二、分析与设计1.程序的基本功能(1)建立多项式(2)输出多项式(3)删除多项式以释放空间(4)删除多项式中的某一项(5)将多项式合并同类项(6)拷贝多项式(7)将多项式按指数升序排列(8)判断两多项式是否相等(9)两个多项式相加,建立并输出和多项式(10)两个多项式相减,建立并输出差多项式(11)两个多项式相乘,建立并输出积多项式(12)两个多项式相除,建立并输出商多项式2.算法设计本程序主要应用了链表,结构体和类模板。

用结构体来定义多项式的结点(即每一项),它包含三个域,分别存放该项的系数、指数以及指向下一项结点的指针;用链表来存储多项式,为了节省空间,只存储多项式中系数非0 的项,用多项式链表类来实现设定的程序的基本功能。

涉及的主要算法有:(1)使用尾插法创建多项式,即从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表尾上,直到读入结束标志(某一项的系数为零)为止。

(2)输出一个非空的多项式链表,不要输出最后一项,即输入系数为零的结束项,用if……else语句判断。

(3)删除整个多项式是一项一项的删,使用链表删除其结点的方法,使用free()函数释放存储空间。

在删除非空的多项式的某一项时,定义k来找到要删除的那一项的位置,再使用delete 将其删除。

(4)在对多项式合并同类项时,主要有两点,一是看两项指数是否相等,若相等则合并成一项,二是看两项系数和是否为零,若为零则去掉这两项。

在对多项式排序时,先合并同类项,再按指数值从小到大排序。

(5)在拷贝多项式时使用重载函数,将系数和指数都拷贝给新的多项式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学院课程设计说明书题目一元多项式计算问题系(部) 计算机科学与技术系专业(班级) 计算机科学与技术专业姓名学号指导教师起止日期第十三、十四周课程设计任务书课程名称:数据结构与算法设计题目:一元多项式计算问题已知技术参数和设计要求:问题描述:设计一个稀疏多项式简单计算器基本要求:(1)输入并分别建立多项式A和B(2)输入输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……,其中n是多项式的项数,ci和ei 是第i项的系数和指数,序列按指数降序排列(3)完成两个多项式的相加、相减,并将结果输出;测试数据:(1) A+B A= 3x14-8x8+6x2+2 B=2x10+4x8+-6x2(2) A-B A=11x14+3x10+2x8+10x6+5 B=2x14+3x8+5x6+7(3) A+B A=x3+x1B=-x3-x1(4) A+B A=0 B=x7+x5+x3+x1(5) A-B A=100x100+50x50+20x20+x B=10x100+10x50+10x20+x选作内容:(1).多项式在x=1时的运算结果(2)求多项式A和B的乘积设计工作量:40课时工作计划:周次星期地点设计方式13 星期一1-2节A多1 讲授内容星期二3-4节科1608 答疑星期二5-8节1403 上机调试星期三1-4节科1608 答疑星期四1-4节1404 上机调试星期四5-8节科1608 答疑14 星期二3-4节科1608 答疑星期二5-8节1403 上机调试星期三1-4节科1608 答疑指导教师签名:日期:教研室主任签名:日期:系主任签名:日期:长沙学院课程设计鉴定表摘要本文是关于一个一元稀疏多项式计算器的问题。

一元稀疏多项式计算内容包括输入并建立多项式,多项式相加,多项式求值,多项式求乘积以及输出多项式。

本程序运用面向对象程序设计方法,使用C++语言,利用Microsoft Visual C++ 6.0开发工具,还有数据结构课中学到的链式存储结构,存储一元稀疏多项式,从而实现程序的基本功能。

在程序中定义了各种类型的运算的模块,通过主程序的调用来完成它们之间的配合,进而使得一元稀疏多项式计算器的顺利运行。

关键词:数据结构;一元稀疏多项式;链表;C++语言目录1 设计内容与要求 (1)2.设计说明 (1)2.1 问题描述与功能设计 (1)2.2 数据结构与算法 (1)2.3 函数定义 (3)2.4 界面设计 (4)2.5 编码 (5)2.6 测试 (10)3 总结 (14)参考文献 (15)附录A 源代码 (16)⒈设计内容与要求设计内容:设计一个稀疏多项式简单计算器,能够进行简单的基本运算。

如:多项式相加、多项式相减、多项式求值……等等。

基本要求:(1)输入并分别建立多项式A和B(2)输入输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……,其中n是多项式的项数,ci和ei是第i项的系数和指数,序列按指数降序排列(3)完成两个多项式的相加、相减,并将结果输出;创新要求:(1).多项式在x=1时的运算结果(2)求多项式A和B的乘积2.设计说明2.1 问题描述与功能设计本程序要求能够实现从键盘键入两个多项式的系数、指数相关数据后,能够进行多项式输出、多项式相加、多项式相减、多项式求值、多项式求积的运算。

2.2 数据结构与算法数据结构多项式的逻辑结构:视为线性表p(x)=3x14-8x8+6x2+2数据元素(coef,exp)表示多项式项coef·X exp,coef是该项的系数,exp是变元X的指数。

为了实现任意多项式的运算,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个成员。

算法多项式的输入与建立调用CreatePolyn()函数建立链表,将多项式每一项的系数与指数作为链表一个结点的数据,按照指示输入每一项的系数与指数时,将调用Insert()函数,将输入的结点信息按指数降序排列的方式插入到之前建立的链表中,并合并同类项。

依次输入、建立一元多项式pa和pb。

如下图。

多项式的输出调用PrintPolyn()函数将多项式链表中的结点数据按照一元多项式的格式(如:6x^5+3x^3+7x+3)输出到屏幕上。

两个多项式的加法调用AddPolyn()函数直接对两个多项式的链表的结点成员的系数与指数按照数学中多项式相加的原则进行操作。

其中要调用compare()函数对两个多项式的指数或是项数进行比较。

相加所得的多项式存放到新建的第三个多项式中。

再对第三个多项式输出即可。

两个多项式的减法调用SubtractPolyn()函数对两个多项式减法运算。

首先对要减的多项式的系数求反,接着调用AddPolyn()函数对处理后的多项式相加即两个多项式的相减。

所得的多项式存放到新建的第三个多项式中,再对第三个多项式输出即可。

多项式的求值调用ValuePolyn()函数对多项式求值。

在用户输入X的值后,对链表每个结点的数据进行求值,然后求和即多项式在X为某一值的值。

其中用到C语言中的数学函数:pow。

其功能为计算x的y次幂,所在头文件:math.h 。

两个多项式的乘法调用MultiplyPolyn()函数对两个多项式进行乘法运算。

根据数学知识,依次用一个多项式的每一项乘以另一个多项式的每一项,再求和、合并同类项即两个多项式的乘积。

当中用了多两个多项式的while循环,以确保两个多项式的每一项都得到相应的运算,每一次运算后调用Insert()函数把乘积插入到新建的链表中,以得到一个结点信息按指数降序排列的方式排列,并以合并同类项的链表。

2.3 函数定义为了程序功能的顺利实现,在本程序中定义了如下函数:函数名功能Insert() 链表结点数据的插入与排序CreatePolyn() 链表头结点的创建DestroyPolyn() 链表的销毁PrintPolyn() 链表数据的多项式形象化输出Compare() 两个多项式的指数或是项数进行比较AddPolyn() 两个多项式的加法SubtractPolyn() 两个多项式的减法ValuePolyn() 多项式的求值MultiplyPolyn() 两个多项式的乘法desktop() 程序界面的实现2.4 界面设计程序数据初始界面:程序操作主界面:2.5 编码链表建立的函数,该函数在多项式信息输入时按照指数降序排列建立链表,并在出现同类项时合并。

void Insert(Polyn p,Polyn h){if(p->coe==0) delete p; //当前结点的coe成员等于0的时候删除当前结点else{Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->exp<q2->exp) //查找插入位置{q1=q2;q2=q2->next;}if(q2&&p->exp==q2->exp) //将指数相同相合并{q2->coe+=p->coe;delete p;if(!q2->coe){q1->next=q2->next;delete q2;}}else//指数为新时将结点插入{p->next=q2;q1->next=p;}}}链表信息按照多项式形式输出。

void PrintPolyn(Polyn P){Polyn q=P->next;int flag=1; //项数计数器if(!q){ //若多项式为空,输出0cout<<"0";cout<<endl;return;}while (q){if(q->coe>0&&flag!=1) cout<<"+"; //系数大于0且不是第一项时就输出+if(q->coe!=1&&q->coe!=-1) //系数非1或-1的普通情况{cout<<q->coe;if(q->exp==1) cout<<"X";//当前结点exp为1时else if(q->exp) cout<<"X^"<<q->exp;}else{if(q->coe==1) 系数为1的特殊情况{if(!q->exp) cout<<"1";//指数不存在else if(q->exp==1) cout<<"X";/指数等于一else cout<<"X^"<<q->exp;}if(q->coe==-1) 系数为-1的特殊情况情况{if(!q->exp) cout<<"-1"; //指数不存在else if(q->exp==1) cout<<"-X"; //指数等于一else cout<<"-X^"<<q->exp;}}q=q->next; //当前指针指向下一结点flag++;//项序数自加1}cout<<endl;}两个多项式的加法。

int compare(Polyn a,Polyn b)//对两个多项式的系数或项数进行比较{if(a&&b) {//两个多项式都存在if(!b||a->exp>b->exp) return 1;当b多项式不存在或者a多项式的指数大于b的的时候,返回1 else if(!a||a->exp<b->exp) return -1; 当a多项式不存在或者b多项式的指数大于a的的时候,返回-1else return 0;//其他情况返回0}else if(!a&&b) return -1; //a多项式已空,但b多项式非空else return 1; //b多项式已空,但a多项式非空}Polyn AddPolyn(Polyn pa,Polyn pb){Polyn qa=pa->next;Polyn qb=pb->next;Polyn headc,hc,qc;hc=new Polynomial;//建立一个新的结点hc->next=NULL;headc=hc;while(qa||qb){qc=new Polynomial;//新建一个结点switch(compare(qa,qb)){//调用compare函数对两个多项式进行比较case 1:// a多项式的指数大于b的{qc->coe=qa->coe;qc->exp=qa->exp;qa=qa->next;break;}case 0://有同类项则合并{qc->coe=qa->coe+qb->coe;qc->exp=qa->exp;qa=qa->next;qb=qb->next;break;}case -1: a多项式的指数小于b的{qc->coe=qb->coe;qc->exp=qb->exp;qb=qb->next;break;}}if(qc->coe!=0){ //当相加系数不为0时qc->next=hc->next;hc->next=qc;hc=qc;}else delete qc; //当相加系数为0时,释放该结点}return headc;}两个多项式的减法。

相关文档
最新文档