一元多项式计算器设计与实现

合集下载

一元稀疏多项式计算器实现(完整实现版详细源码)

一元稀疏多项式计算器实现(完整实现版详细源码)

1.5一元稀疏‎多项式计算‎器实习报告一、需求分析1.输入并建立‎多项式;2.输出多项式‎,输出形式为‎整数序列:n,c1,e1,c2,e2,……,c n,e n,其中n是多‎项式的项数‎,c i和ei‎分别是第i‎项的系数和‎指数,序列按指数‎降序排列;3.多项式a和‎b相加,建立多项式‎a+b;4.多项式a和‎b相减,建立多项式‎a—b;5.多项式a和‎b相乘,建立多项式‎a×b;6.计算多项式‎在x处的值‎;7.求多项式P‎的导函数P‎';8.多项式的输‎出形式为类‎数学表达式‎;9.做出计算器‎的仿真界面‎;10.测试数据:(1) (2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7)(2) (6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 ) =(-7.8x^15-1.2x^9+12x^-3-x);(3)(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5);(4)(x+x^3)+(-x-x^3)=0(5)(x+x^100)+(x^100+x^200)=(x+2x^100+x^200)(6)(x+x^2+x^3)+0=x+x^2+x^3(7)互换上述测‎试数据中的‎前后两个多‎项式二、概要设计1.链表的抽象‎数据类型定‎义为:ADT LinkL‎i st{数据对象:D={ ai | ai∈ElemS‎e t, i=1,2,...,n, n≥0 }数据关系:R1={ <ai-1, ai>|ai-1, ai∈D, i=2,...,n }基本操作:InitL‎i st(&L)操作结果:构造一个空‎的线性表L‎。

Destr‎o yLis‎t(&L)初始条件:线性表L已‎存在。

操作结果:销毁线性表‎L。

数据结构课程设计一元稀疏多项式计算器报告代码

数据结构课程设计一元稀疏多项式计算器报告代码

数据结构课程设计设计题目:一元稀疏多项式计算器专业______________________ 班级______________________ 学号______________________ 姓名______________________ 指导教师___________________2010 年12 月20 H目录一、课程题目 (1)二、需求分析 (1)三、测试数据 (2)四、概要设计 (2)五、调用关系图 (3)六、程序代码 (3)七、测试结果 (11)八、心得体会及总结 (12)数据结构课程设计一、课程题冃一元稀诡多项式计算器二、需求分析1、一元稀疏多项式简单计算器的功能是:1.1输入并建立多项式;1.2输出多项式,输出形式为整数序列:n, cl,el,c2,e2, ......................... c n, en,其中ii是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;1.3求多项式a、b的导函数;1.4计算多项式在x处的值;1.5多项式"和b和加,建立多项认a+b;1.6多项式a和b相减,建立多项式a-b。

2、设计思路:2.1定义线性表的动态分配顺序存储结构;2.2建立多项式存储结构,定义指针*next2.3利用链表实现队列的构造.毎次输入一项的系数和指数,町以输出构造的一元多项式2.4演示程用以用户和计舜机的对话方式执行,即在计舜机终站上显示“提示信息” Z后,由川户化键盘丄输入演示程序小规运的运行•命令;报后根据相应的输入数据〔滤去输入中的4法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。

多项式显示的格式为:clx*el+c2x*e2+ — +cnx"en3、设计思路分析要解决多项式相加,必须要冇多项式,所以必须首先建立两个多项式,在这电采用链表的方式存储琏表,所以我将结点结构体定义为运川尾插法建立两条单链表,以巾•链表polyn p和polyn h分别表示两个一元多项式a和b, a+b的求和运算等同于单链表的插入问题(将单链表polyn P 中的结点插入到单链表polyn h中),因此“和多项式”中的结点无须另生成。

一个一元稀疏多项式简单计算器

一个一元稀疏多项式简单计算器

//设计一个一元稀疏多项式简单计算器#include<stdio.h>#include<stdlib.h>struct tagNode{int coef; //多项式的系数int exp; //多项式的指数struct tagNode *next;};typedef struct tagNode Node; //重新定义结点名称typedef struct tagNode* pNode; //重新定义指针名称void TrailInsertList(pNode,int,int); //在链表表尾部插入结点void AddPolynomial(pNode,pNode); //将两个多项式相加void PrintPolynomial(pNode); //打印多项式int main(void){pNode pa,pb;//定义两个头指针pNode pFree;//定义一个释放指针pa=pb=NULL;Node heada,headb; //定义两个头结点heada.coef=headb.coef=0; //头结点的coef作为结点的个数heada.exp=headb.exp=-1; //头结点的exp无意义故赋给其-1的值heada.next=headb.next=NULL;//让头指针指向头结点pa=&heada;pb=&headb;int coef=0; //系数int exp =0; //指数//第一个多项式的输入printf("请分别输入第一个多项式的系数和指数,并以输入系数为0作为结束标志!\n");do{printf("系数: ");scanf("%d",&coef);printf("指数: ");scanf("%d",&exp);printf("\n");if(coef!=0)TrailInsertList(pa,coef,exp);}while(coef!=0);//第二个多项式的输入printf("请分别输入第二个多项式的系数和指数,并以输入系数为0作为结束标志!\n");do{printf("系数: ");scanf("%d",&coef);printf("指数: ");scanf("%d",&exp);printf("\n");if(coef!=0)TrailInsertList(pb,coef,exp);}while(coef!=0);AddPolynomial(pa,pb); //将两个多项式相加PrintPolynomial(pa); //打印出相加后的多项式pFree=pa->next;free(pFree); //释放动态申请的内存空间return 0;}void TrailInsertList(pNode pHead,int coef,int exp){pNode trail=NULL; //定义一个指向链表尾部的指针pNode newnode=NULL; //定义一个指向新结点的指针//让trail指针指向尾部的结点trail=pHead;while(trail->next!=NULL){trail=trail->next;}newnode=(struct tagNode *)malloc(sizeof(Node)); //申请一块大小为Node的内存空间if(!newnode) //如果申请失败{printf("Allocte memory failure!\n");exit(1); //退出}//初始化申请的新结点newnode->coef=coef;newnode->exp=exp;newnode->next=NULL;trail->next=newnode; //插入新结点pHead->coef++; //头结点的计算器加一}void AddPolynomial(pNode p1,pNode p2){pNode cur1=p1->next; //链表1,结果存放的地方pNode cur2=p2->next; //链表2pNode pre1=p1;pNode temp=NULL; //临时指针while(cur1!=NULL && cur2!=NULL)//当前两个链表都不为空{if(cur1->exp<cur2->exp)//比较链表1与链表2当前指数大小{pre1=cur1;cur1=cur1->next; //cur1指向下一个结点}else if(cur1->exp==cur2->exp) //链表1与链表2指数相等时{cur1->coef+=cur2->coef;if(cur1->coef!=0){pre1=cur1;}else{pre1->next=cur1->next; //保持链表1的连续性free(cur1);}cur1=pre1->next; //cur1指向要比较的下一个结点//下面是删除指针cur2指向的结点,因为结果已经存放在链表1的结点中temp=cur2;cur2=cur2->next;free(temp);}else //链表1当前结点的指数比链表2的大时{p2->next=cur2->next;cur2->next=cur1;pre1->next=cur2;pre1=cur2;cur2=p2->next;}}if(cur2) //如果链表2比链表1长{pre1->next=cur2;}p2->next=NULL;}void PrintPolynomial(pNode pHead){pNode p; //定义头指针p=pHead;p=p->next;while(p){printf("%dX(%d)",p->coef,p->exp);if(p->next){printf(" + ");}p=p->next;}printf("\n");}。

数据结构课程设计_一元稀疏多项式计算器

数据结构课程设计_一元稀疏多项式计算器

数据结构实验报告——一元稀疏多项式计算器安子烨PB12203079实验目的实现一元多项式的简单运算功能,掌握线性表的知识,提高编程能力。

功能清单1.一元多项式创建2.显示一元多项式3.复制一元多项式4.多项式加法5.多项式减法6.修改一元多项式7.删除一元多项式8.销毁记录实验设计该多项式计算器以菜单驱动的形式实现上述各运算功能。

最多可支持十条记录,分别用指针数组引导存储于十个不同的位置。

以下为程序的部分源代码。

#include<stdio.h>#include<math.h>#include<stdlib.h>typedef struct LinkList{double coef;int expn;LinkList *next;}LNode;void CreatPolyn(LinkList **h)//创建多项式{LinkList *q=NULL, *w=NULL, *p=NULL;double m=0; int n=0;(*h)=(LinkList *)malloc(sizeof(LinkList));(*h)->coef=0; (*h)->expn=0; (*h)->next=NULL;printf("请输入X的系数和指数,当系数为零时结束创建\n");scanf("%lf%d",&m,&n);while(m!=0){q=(LinkList *)malloc(sizeof(LinkList));q->coef=m; q->expn=n; q->next=NULL;if((*h)->next==NULL){if(q->expn==(*h)->expn) (*h)->coef+=q->coef;else if((*h)->expn>q->expn) {q->next=(*h); *h=q; } else (*h)->next=q;}else{for(w=(*h);w->next!=NULL;w=w->next){if(q->expn==w->expn){w->coef+=q->coef;break;}else if((w->expn>q->expn)&&(w==*h)){q->next=(*h);(*h)=q;break;}else if((w->expn<q->expn)&&(w->next->expn>q->expn)){q->next=w->next;w->next=q;break;}}if(w->next==NULL){if(w->expn==q->expn) w->coef+=q->coef;else if(w->expn<q->expn) w->next=q;}}printf("请输入X的系数和指数,当系数为零时结束创建\n");scanf("%lf%d",&m,&n);}}void PrintPolyn(LinkList *p, int i)//打印多项式{printf("第%d个多项式是:",i);while(p!=NULL){if((p->coef)>0) printf("+%lf*X^%d",p->coef,p->expn);else if((p->coef)<0) printf("%lf*X^%d",p->coef,p->expn); p=p->next;}printf("\n");}void CopyPolyn(LinkList **M, LinkList **N)//多项式复制{LinkList *p=NULL, *q=NULL, *w=NULL;(*N)=(LinkList *)malloc(sizeof(LinkList));(*N)->coef=(*M)->coef; (*N)->expn=(*M)->expn; (*N)->next=NULL;for(w=(*N),p=(*M)->next;p!=NULL;p=p->next){q=(LinkList *)malloc(sizeof(LinkList));q->coef=p->coef; q->expn=p->expn; q->next=p->next;w->next=q; w=w->next;}}void AddPolyn(LinkList *M, LinkList *N, LinkList **X)//多项式加法{LinkList *p=NULL, *q=NULL, *w=NULL, *z=NULL;(*X)=(LinkList *)malloc(sizeof(LinkList));(*X)->coef=0; (*X)->expn=0; (*X)->next=NULL;for(p=M,q=N,w=(*X);(p!=NULL)&&(q!=NULL);){z=(LinkList *)malloc(sizeof(LinkList));if(p->expn<q->expn){z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}else if(p->expn>q->expn){z->coef=q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}else if(p->expn==q->expn){z->coef=p->coef+q->coef; z->expn=p->expn; z->next=NULL;p=p->next; q=q->next; w->next=z; w=w->next;}}if(p==NULL){for(;q!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}}else if(q==NULL){for(;p!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}}for(w=(*X);w!=NULL;w=w->next){printf("%lf %d\n",w->coef,w->expn);}}void SubtractPolyn(LinkList *M, LinkList *N, LinkList **X)//多项式减法{LinkList *p=NULL, *q=NULL, *w=NULL, *z=NULL;(*X)=(LinkList *)malloc(sizeof(LinkList));(*X)->coef=0; (*X)->expn=0; (*X)->next=NULL;for(p=M,q=N,w=(*X);(p!=NULL)&&(q!=NULL);){z=(LinkList *)malloc(sizeof(LinkList));if(p->expn<q->expn){z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}else if(p->expn>q->expn){z->coef=-q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}else if(p->expn==q->expn){z->coef=p->coef-q->coef; z->expn=p->expn; z->next=NULL;p=p->next; q=q->next; w->next=z; w=w->next;}}if(p==NULL){for(;q!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=-q->coef; z->expn=q->expn; z->next=NULL;q=q->next; w->next=z; w=w->next;}}else if(q==NULL){for(;p!=NULL;){z=(LinkList *)malloc(sizeof(LinkList));z->coef=p->coef; z->expn=p->expn; z->next=NULL;p=p->next; w->next=z; w=w->next;}}/*for(w=(*X);w!=NULL;w=w->next){printf("%lf %d\n",w->coef,w->expn);}*/}void ValuePolyn(LinkList *h, double x)//多项式求值{double sum=0, a=0;while(h!=NULL){a=pow(x,h->expn);sum=sum+(h->coef)*a;h=h->next;}printf("所求多项式的值为%lf\n",sum);}void DeletePolyn(LinkList **h){LinkList *p=(*h)->next; (*h)=NULL;while(p!=NULL){free(*h);(*h)=p;p=p->next;}}void RevisePolyn(LinkList **h, int i){int n=0;int choose=0;double m=0;LinkList *q=NULL, *w=NULL;PrintPolyn((*h),i);printf("请输入你想执行的操作代号(添加:1;修改:2;删除:3)\n");scanf("%d",&choose);switch(choose){case 1:{printf("输入你想要添加项的系数和次数\n");scanf("%lf%d",&m,&n);q=(LinkList *)malloc(sizeof(LinkList));q->coef=m; q->expn=n; q->next=NULL;for(w=(*h);w->next!=NULL;w=w->next){if((w->expn>q->expn)&&(w==*h)){q->next=(*h);(*h)=q;break;}else if((w->expn<q->expn)&&(w->next->expn>q->expn)) {q->next=w->next;w->next=q;break;}}if(w->expn<n) w->next=q;break;}case 2:{printf("输入你想要修改项的系数和次数\n");scanf("%lf%d",&m,&n);for(w=(*h);w!=NULL;w=w->next){if(w->expn==n) w->coef=m;}printf("未找到该项。

(完整word版)一元多项式计算器报告(C语言编程)

(完整word版)一元多项式计算器报告(C语言编程)

题目:编制一个一元多项式基本运算的程序姓名: 学号:PB110130一、需求分析1.在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。

由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。

2.程序中单链表存储,根据链表的指数域,对链表进行升序排序,可给运算带来方便。

3.程序设计是在VC6.0环境下设计的的。

4.程序执行的命令为(程序主界面):二、概要设计抽象数据类型一元多项式的定义如下:1.LNode *MakeNode(double coef, int exp) 通过传入指数和系数创建一个节点,返回该节点的地址。

2.void InitList(LinkList &L)初始化,带头节点3.void PrintPolyn (LinkList L) 传入链表的指针,打印该链表4.LinkList CreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L5.double SumPolyn(LinkList L,double x) 传入链表的指针及x值,求多项式的值。

6.void DestroyPolyn (LinkList &L) 销毁多项式,去掉头节点7.void ClearPolyn (LinkList &L) 清空多项式,保留节点实验报告8.void CopyPolyn (LinkList La,LinkList &Lb) 将La位置的多项式复制到Lb位置9.void AddPolyn(LinkList L,LinkList J ,LinkList &K) 将a和b多项式相加存到c10.void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b相减存到c11. void MultiplyPolyn(LinkList L,LinkList J,LinkList &K)将a和b多项式相乘存到c12。

一元多项式计算器完整报告

一元多项式计算器完整报告

1、课程设计目的1.1、本次课程设计的主要目的是设计一个一元多项式简单计算器,体会链式存存储结构和顺序存储结构各自的优缺点和适用性;1.2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;1.3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技1.4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;1.5、加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。

2、课程设计的准备和功能要求2.1、需求环境本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:①硬件要求:一台计算机。

②软件配置:windows XP或windows 7、VC++6.0。

2.2、目标程序的功能要求集合链式存储结构和顺序存储结构实现一元多项式计算器的设计,并使该计算器具有以下功能:①能够按照多项式变量的指数降序创建一个多项式;②能够对已创建的多项式进行显示;③能够对已创建的多项式之间的加法运算;④能够对已创建的多项式之间的减法运算;⑤能够对已创建的多项式进行删除;⑥能够实现计算器退出操作;2.3、系统总框图3、课程设计过程3.1、菜单界面设计考虑到计算器的操作应具备简易性,我们采取用户和计算机的对话方式执行,即程序运行时,在计算机终端上显示该计算器的功能 菜单栏,其中包括对应的选项共用户选择输入;当用户根据选项中的“提示信息”在键盘上输入多项式的项数及各项的系数和指数,然后 进行显示、相加运算、相减运算、多项式删除以及计算器退出操作。

如下所示:用户菜单多项式的显示多项式的相加多项式的相减多项式的删除退出 菜单多项式的建立3.2、菜单选项的实现对于计算器菜单中各选项的设计处理,我们采用了switch (menu) 语句并将各选项前的数字定义为字符型。

然后根据所输入的不同的memu列出对应的6种case分支情况。

一元稀疏多项式简单的计算器

一元稀疏多项式简单的计算器

1.一元稀疏多项式简单的计算器(实验类型:综合型)1)问题描述:用线性表表示一元稀疏多项式,设计一个一元多项式运算器2)实验要求:✧采用单链表存储结构一元稀疏多项式✧输入并建立多项式✧输出多项式✧实现多项式加、减运算3) 实现提示:以两个多项式相加为例✧结果多项式另存✧扫描两个相加多项式,若都未检测完:⏹若当前被检测项指数相等,系数相加,若结果未变成0,则将结果插入到结果多项式。

⏹若当前被检测项指数不等,则将指数较小者插入到结果多项式。

若有一个多项式已检测完,则将另一个多项式剩余部分直接连接到结果多项式。

4.一元稀疏多项式简单的计算器(实验类型:综合型)#include<stdio.h>#include<stdlib.h>typedef struct{float coef;//系数int expn;//指数} Term;typedef struct ploynomial{Term term;ploynomial* next;} ploynomial,*LinkList;void InitList(LinkList&L){//初始化链表L= (ploynomial*)malloc(sizeof(ploynomial));//头结点L->term.coef=0.0;L->term.expn=-1; L->next=NULL;}int cmp(Term a,Term b){//比较结点的系数大小函数if(a.expn>b.expn) return -1;else if(a.expn==b.expn) return 0; else return 1;}void insertNode(LinkList&L,Term e){//将结点插入多项式链表的适当位置,可以同时起到创建链表和多项式相加的功能ploynomial* q=L;while(q->next!=NULL){if(cmp(q->next->term,e)<0)//如果当前结点q的下一个结点的指数大于要插入的结点的指数q=q->next;//q指向下一个结点else break;//此时,q.term.expn>e.expn>=q->next->term.expn }if(q->next!=NULL&&cmp(q->next->term,e)==0) //指数相同,系数相加{q->next->term.coef+=e.coef;}else{ploynomial* node =(ploynomial*) malloc(sizeof(ploynomial));node->term.coef=e.coef;node->term.expn=e.expn;if(q->next==NULL)node->next=NULL; //如果q结点为尾结点,则node的指针域设为NULLelsenode->next=q->next; //否则node的指针域指向q的下一个结点q->next=node;//将node结点插入链表中}}void CreatPolyn(LinkList&L,int m){//输入m项的系数和指数,建立表示一元多项式的有序链表L Term e;InitList(L);for(int i=1; i<=m; i++){printf("\n第%d项的系数和指数:",i);scanf("%f%d",&e.coef,&e.expn);insertNode(L,e);}}void addPolyn(LinkList&L,LinkList L1,LinkList L2){//用L返回L1+L2的结果ploynomial* q;for(q=L1->next; q!=NULL; q=q->next){insertNode(L,q->term);//将L1的每一项插入到L中}for(q=L2->next; q!=NULL; q=q->next) //将L2的每一项插入到L 中{insertNode(L,q->term);}}void SubtracatPolyn(LinkList&L,LinkList L1,LinkList L2){//用L返回L1-L2的结果ploynomial* q;for(q=L1->next; q!=NULL; q=q->next){insertNode(L,q->term);//将L1的每一项插入到L中}for(q=L2->next; q!=NULL; q=q->next){q->term.coef = -(q->term.coef); //把系数变成相反数,再进行相加操作,即为L1-L2insertNode(L,q->term);//将L2的每一项插入到L中}}void multiplyPolyn(LinkList&L,LinkList L1,LinkList L2) {//用L返回L1*L2的结果ploynomial *p,*q;Term term;term.coef=0.0;term.expn=0;for(q=L1->next; q!=NULL; q=q->next){for(p=L2->next; p!=NULL; p=p->next){term.coef=(q->term.coef)*(p->term.coef);//系数相乘term.expn=(q->term.expn)+(p->term.expn);// 指数想加insertNode(L,term);}}}void derivativePolyn(LinkList&L,LinkList L1){//用L返回L1的导数ploynomial *p;Term term;for(p=L1->next; p!=NULL; p=p->next){if(p->term.expn==0){ continue;//指数为0时,导数为0 ,跳过此次循环}else{ term.coef=(p->term.coef)*(p->term.expn); //系数乘以指数term.expn=(p->term.expn)-1;//指数减一insertNode(L,term);}}}void visitList(LinkList L){//以类数学表达式的形式打印输出一元多项式L,//即指数或者系数为1的情况下省略1ploynomial* q=L;int flag;while(q->next!=NULL){q=q->next;flag=1;if(q->term.coef==0) continue;//系数为0 不输出if(q->term.expn==0&&flag==1) //指数为1{if(q->term.coef>0)printf("+%.2f",q->term.coef);elseprintf("%.2f",q->term.coef);flag=0;}if((q->term.coef==1||q->term.coef==-1)&&flag==1)//系数为1{if(q->term.expn==1){ if(q->term.coef==1)printf("+X"); elseprintf("-X");}else{if(q->term.coef==1)printf("+X^%d",q->term.expn); elseprintf("-X^%d",q->term.expn); } flag=0;}if(flag==1){ if(q->term.coef>0)printf("+%.2fX^%d",q->term.coef,q->term.expn);elseprintf("%.2fX^%d",q->term.coef,q->term.expn);} } printf("\n");}int main(){LinkList L1,L2; int n1,n2;printf("请输入多项式L1的项数:");scanf("%d",&n1);CreatPolyn(L1,n1);printf("请输入多项式L2的项数:");scanf("%d",&n2);CreatPolyn(L2,n2);printf("\n多项式L1:");visitList(L1);printf("\n多项式L2: ");visitList(L2);LinkListadd,sub,multiply,derivative1,derivative2;InitList(ad d);InitList(sub);InitList(multiply);InitList(derivative1);InitList(derivative2);derivativePol yn(derivative1,L1);derivativePolyn(derivative2,L2);printf("\nL1的导数:");visitList(derivative1);printf("\nL2的导数:");visitList(derivative2);addPolyn(add,L1,L2);SubtracatPolyn(sub,L1,L2);multiplyPolyn(multiply ,L1,L2);printf("\nL1 + L2: ");visitList(add);printf("\nL1 - L2: ");visitList(sub);printf("\nL1 * L2: ");visitList(multiply);}实验心得:无。

c一元稀疏多项式计算器-课程设计实验报告

c一元稀疏多项式计算器-课程设计实验报告

2016-2017学年第二学期学号1608220203 《网络工程》课程设计报告题目:一元稀疏多项式计算器专业:网络工程班级:网络工程(3)班姓名:代应豪指导教师:代美丽成绩:[键入文字] [键入文字] [键入文字]一、问题描述 (3)二、需求分析 (3)三、概要设计 (4)四、详细设计 (5)五、源代码 (6)六、程序测试 (19)七、使用说明 (25)八、课设总结 (26)一、问题描述1.1基本要求(1)输入并建立多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2,,,,,,, cn,en,其中n 是多项式的项数,ci,ei,分别是第i项的系数和指数,序列按指数降序排序;(3)多项式a和b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b;(5)计算多项式在x处的值。

(6)计算器的仿真界面。

1.2设计目的数据结构是实践性很强的课程。

课程设计是加强学生实践能力的一个强有力手段。

课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。

严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用二、需求分析2.1设计开发环境:软件方面:系统windows 7编程软件:VC++ 6.02.2思路分析:①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem其中,p1是指数为ei的项的非零系数,且满足0≦e1<e2<……<em=n ,若用一个长度为m且每个元素有两个数据项(系数项和指数项)的线性表((p1,e1),(p2,e2),……,(pm,em))便可惟一确定多项式pn(x)。

②用两个带表头结点的单链表分别存储两个多项式③根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;④只需要将第二个多项式的系数改为其相反数,然后根据一元多项式相加的运算规则便可以得到其相应的“差多项式”三、概要设计图3-1功能模块图为实现上述程序功能,用带表头结点的单链表存储多项式。

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

一元稀疏多项式简单计算器一、设计课题设计一元稀疏多项式简单计算器。

二、需求分析2.1 输入的形式和输入值的范围:输入是从键盘输入的,输入的内容为多项式的系数和指数,数为任意的整数,指数为大于等于0的整数2.2 输出的形式从屏幕输出,显示用户输入的多项式,并显示多项式加减以后的多项式的值。

2.3 程序所能达到的功能a:输入并建立多项式;b:输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei 分别是第i项的系数和指数,序列按指数降序排列;c:多项式a和b相加,建立多项式a+b;d:多项式a和b相减,建立多项式a-b;2.4 测试数据(1)(2x+5x^8-3.1x^11)+(7-5x^8+11x^9) = (-3.1x^11+11X^9+2X+7)(2)(X+X^3)+(-X-X^3)=0(3)(X+X^2+X^3)+0= X+X^2+X^3三、概要设计3.1 设计思路A:数据结构的选用为了实现任意多项式的加法、减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元属;单链表抽象结构类型定义见附录2。

B:多项式的输入采用头节点插法的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;为了判断一个多项式是否输入结束,定义一个结束标志,当输入非00时就继续,当输入00时,就结束一个多项式的输入;C:2个多项式的加法它从2个多项式的头部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为0的话,用头插法建立一个新的节点。

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

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

当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生。

当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生D:2个多项式的减法它从2个多项式的头部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相减;相加的和不为0的话,用头插法建立一个新的节点。

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

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

当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生,并且建立的接点的系数为原来的相反数。

四、详细设计typedef int Status;typedef struct pnode{float coef; //系数int expn; //指数struct pnode *next; //后继结点}pnode,*Polynomail;///结点的类型,指针的类型ming///自定义类型///--------------主要功能实现--------------------- Status CreatPolyn(Polynomail &P)///创建多项式{int m; float n;pnode *rear,*s;P=(pnode *)malloc(sizeof(pnode));///fenpeikongjian// P作为头指针rear作为尾指针不断地扩展链表rear=P;printf("input coef[float]:");scanf("%f",&n);printf("input expn[int ]:");scanf("%d",&m);if(n == 0){s=(pnode *)malloc(sizeof(pnode));s->coef=n;s->expn=m;s->next=NULL;rear->next=s;rear=s;}elsewhile(n != 0){s=(pnode *)malloc(sizeof(pnode));s->coef=n;s->expn=m;s->next=NULL;rear->next=s;rear=s;printf("input coef[float]:");scanf("%f",&n);printf("input expn[int ]:");scanf("%d",&m);}P=P->next;///zhixiang diyige yuansu!!return OK;}//用链表来存储Status PrintPolyn(Polynomail P){//输出if(!P){printf("空表\n");return ERROR;}printf("\n\t");Polynomail curP=P;while(curP){if(curP->expn==0) printf("%.2f",curP->coef);else printf("%.2fx^%d",curP->coef,curP->expn);curP=curP->next;if(curP && curP->coef>0)printf("+"); //若下个节点不为空且系数>0,则在它前面输出“+”}printf("\n\n");return OK;}Status AddPolyn(Polynomail P1,Polynomail P2,Polynomail &P3)//两个多项式相加,多项式的输入要按降序输入,结果由P3带回{pnode *p=P1, *q=P2,*r,*s;P3=(pnode *)malloc(sizeof(pnode));r=P3;while(p!=NULL&&q!=NULL) ///两个都不是空的时候进行想加{if(p->expn==q->expn){float x=p->coef+q->coef;if(x!=0){s=(pnode *)malloc(sizeof(pnode));s->coef=x;s->expn=p->expn;r->next=s;r=s;}q=q->next;p=p->next;}else if(p->expn > q->expn){s=(pnode *)malloc(sizeof(pnode));s->coef=p->coef;s->expn=p->expn;r->next=s;r=s;p=p->next;}else{s=(pnode *)malloc(sizeof(pnode));s->coef=q->coef;s->expn=q->expn;r->next=s;r=s;q=q->next;}}while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->coef=p->coef;s->expn=p->expn;r->next=s;r=s;p=p->next;}while(q!=NULL) /// saowei{s=(pnode *)malloc(sizeof(pnode));s->coef=q->coef;s->expn=q->expn;r->next=s;r=s;q=q->next;}r->next=NULL;P3=P3->next; //头结点是个附加结点,不含有多项式的信息return OK;}Status SubPolyn(Polynomail P1,Polynomail P2,Polynomail &P3) //一元多项式的减法,结果由P3带回{pnode *p=P1, *q=P2,*r,*s;P3=(pnode *)malloc(sizeof(pnode));r=P3;while(p!=NULL&&q!=NULL){if(p->expn==q->expn){float x=p->coef-q->coef;if(x!=0){s=(pnode *)malloc(sizeof(pnode));s->coef=x;s->expn=p->expn;r->next=s;r=s;}q=q->next;p=p->next;}else if(p->expn < q->expn){s=(pnode *)malloc(sizeof(pnode));s->coef=-q->coef;s->expn=q->expn;r->next=s;r=s;q=q->next;}else{s=(pnode *)malloc(sizeof(pnode));s->coef=p->coef;s->expn=p->expn;r->next=s;r=s;p=p->next;}}while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->coef=p->coef;s->expn=p->expn;r->next=s;r=s;p=p->next;}while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->coef=-p->coef;s->expn=p->expn;r->next=s;r=s;p=p->next;}r->next=NULL;P3=P3->next;return OK;}float Involution(float x,int n)//求乘方函数{if(n==0)return 1;else if(n==1)return x;else{float sum=x;for(int i=2;i<=n;++i)sum*=x;return sum;}}float EvaluationPolyn(Polynomail P,float x)// 求特定值x的多项式值{float s=0.0;Polynomail curP=P;while(curP){s += curP->coef*Involution(x,curP->expn);curP=curP->next;}return s;}Status DestroyPolyn(Polynomail &P)//销毁多项式、{Polynomail curP=P,q;while(curP){q=curP->next;free(curP);curP=q;}return OK;}五、用户手册略六、测试结果七、附录1.一元多项式.cpp2.单链表抽象数据类型。

相关文档
最新文档