当前位置:文档之家› 一元多项式计算器设计与实现

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

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

二、需求分析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.单链表抽象数据类型。

相关主题