1、完整word版一元多项式计算器报告C语言编程实 验 报 告题目:编制一个一元多项式基本运算的程序 姓名: 学号:PB110130 一、需求分析1在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。2程序中单链表存储,根据链表的指数域,对链表进行升序排序,可给运算带来方便。 3程序设计是在VC6.0环境下设计的的。4程序执行的命令为(程序主界面):二、概要设计抽象数据类型一元多项式的定义如下:1.LNode *MakeNode(double coef, int exp) 通过传入指数和系数创建一个节
2、点,返回该节点的地址。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 Copy
3、Polyn (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。 void OrderInsert(LinkList L,LNode *r) /根据链表的expn指数
4、域,对链表进行升序插入。13。 void DifferentialPolyn(LinkList L,LinkList L2) 对L1求导存到L214. void IntegralPolyn(LinkList L,LinkList &L2) 对L1积分存到L22。 主程序:void main( )初始化;While(1)Switch()选择命令;处理命令;三、详细设计1.元素类型、结点类型和指针类型 typedef struct PolyNode int expn; /指数 double coef;/系数 struct PolyNode next;LNode,*LinkList; 2几个基本操作
5、的函数 1. LNode *MakeNode (double coef,int expn)/制造节点LNode *p;p=(LNode*)malloc(sizeof(LNode));pcoef=coef;pexpn=expn;p-next=NULL;return p;2。 void OrderInsert(LinkList L,LNode r) /根据链表的expn指数域,对链表进行升序插入 if(!L) printf(error”); LNode *p,*q; p=L; while(pnext&p-nextexpnrexpn) p=p-next; if(pnext&p-next-expn=r
6、-expn) pnextcoef+=rcoef; if(p-nextcoef=0) q=pnext; pnext=q-next; free(q); free(r); else rnext=pnext; pnext=r; 3。 void AddPolyn(LinkList L,LinkList J,LinkList K)/多项式相加 if(!L!J) printf(errorn”); return; LNode *p,*q,m; p=L-next; q=J-next; InitList(K); while(p) m=MakeNode(pcoef,p-expn); OrderInsert(K,m)
7、; p=pnext; while(q) m=MakeNode(q-coef,q-expn); OrderInsert(K,m); q=qnext; 4. void MultiplyPolyn(LinkList L,LinkList J,LinkList K)/多项式相乘 if(!L!J) printf(”error); return; LNode p,*q,m; p=L-next; InitList(K); while(p) q=Jnext; while(q) m=MakeNode(pcoefqcoef,pexpn+q-expn); OrderInsert(K,m); q=q-next; p=
8、pnext; 5.LinkList CreatPolyn(void)/输入m项的系数和指数,建立表示一元多项式的有序链表L LNode *p; LinkList head; double c; int e; InitList(head); printf(输入系数、指数,系数为0时结束”); while(1) scanf(”%lf”,&c); if(c=0) break; scanf(”d,&e); p=MakeNode(c,e); OrderInsert(head,p); return head;6。void DifferentialPolyn(LinkList L,LinkList L2)
9、/求导 LNode p,r; if(!L) return; InitList(L2); r=L2; p=Lnext; while(p) if(pexpn=0) rnext=MakeNode(0,0); else rnext=MakeNode(pcoefp-expn,pexpn-1); r=rnext; p=p-next; r-next=NULL;3.主函数define N 12void main() LinkList PN=NULL; int menu,i,j,l; double k,sum; while(1) printf(”n”); printf( 多项式计算器 n”); printf(=
10、n); printf( 新建-1 打印2 复制-3n); printf(” 求值-4 相加-5 相减6n”); printf(” 微分-7 销毁-8 清空9n”); printf(” 积分-10 相乘-11 退出-0n); printf(”=n); printf( 请选择:n); scanf(”d”,&menu); switch(menu) case 0:return; case 1: printf(输入新多项式的下标(0-d):”,N-1); scanf(”d,i); Pi=CreatPolyn(); break; case 2: for(i=0;iN;i+) printf(” P%d =
11、,i); printPolyn(Pi); break; case 3: printf(输入被复制的多项式和新多项式的下标(0%d): ”,N1); scanf(”%dd”,&i,j); CopyPolyn(Pi,Pj); break; case 4: printf(”输入要求值多项式的下标(0-%d)和X值:,N-1); scanf(dlf,i,k); sum=SumPolyn(Pi,k); printf(”多项式值为%lf”,sum); break; case 5: printf(”输入相加两项的多项式和新多项式的下标(0d): ”,N-1); scanf(”%d%dd,i,j,l); Ad
12、dPolyn(Pi,Pj,Pl); break; case 6: printf(”输入减两项的多项式和新多项式的下标(0-%d): ”,N-1); scanf(%ddd”,i,j,l); MinusPolyn(Pi,Pj,Pl); break; case 7: printf(”输入求导的多项式的下标(0-d)和新多项式的下标(0-%d): ,N1,N1); scanf(dd,i,j); DifferentialPolyn(Pi,Pj); break; case 8: printf(”输入被销毁多项式的下标(0-d): ,N1); scanf(”d”,&i); DestroyPolyn(Pi);
13、 break; case 9: printf(”输入被清空多项式的下标(0-d): ”,N1); scanf(%d”,&i); ClearPolyn(Pi); break; case 10: printf(输入求积分的多项式的下标(0%d)和新多项式的下标(0-%d): ”,N-1,N-1); scanf(%dd,&i,j); IntegralPolyn(Pi,Pj); break; case 11: printf(”输入相乘两项的多项式和新多项式的下标(0-%d): ,N1); scanf(d%dd”,&i,j,&l); MultiplyPolyn(Pi,Pj,Pl); break; 四、调试分析1刚开始时,忽略了一些变量参数的标识,使调试程序时费了不少功夫。应注重确定参数的变量
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1