您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 一元多项式计算器报告(C语言编程)
题目:编制一个一元多项式基本运算的程序姓名:学号:PB110130一、需求分析1.在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。2.程序中单链表存储,根据链表的指数域,对链表进行升序排序,可给运算带来方便。3.程序设计是在VC6.0环境下设计的的。4.程序执行的命令为(程序主界面):二、概要设计抽象数据类型一元多项式的定义如下:1.LNode*MakeNode(doublecoef,intexp)通过传入指数和系数创建一个节点,返回该节点的地址。2.voidInitList(LinkList&L)初始化,带头节点3.voidPrintPolyn(LinkListL)传入链表的指针,打印该链表4.LinkListCreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L5.doubleSumPolyn(LinkListL,doublex)传入链表的指针及x值,求多项式的值。6.voidDestroyPolyn(LinkList&L)销毁多项式,去掉头节点7.voidClearPolyn(LinkList&L)清空多项式,保留节点8.voidCopyPolyn(LinkListLa,LinkList&Lb)将La位置的多项式复制到Lb位置9.voidAddPolyn(LinkListL,LinkListJ,LinkList&K)将a和b多项式相加存到c10.voidMultiplyPolyn(LinkListL,LinkListJ,LinkList&K)将a和b相减存到c11.voidMultiplyPolyn(LinkListL,LinkListJ,LinkList&K)将a和b多项式相乘存到c12.voidOrderInsert(LinkListL,LNode*r){//根据链表的expn指数域,对链表进行升序插入。13.voidDifferentialPolyn(LinkListL,LinkList&L2)对L1求导存到L214.voidIntegralPolyn(LinkListL,LinkList&L2)对L1积分存到L22.主程序:voidmain(){初始化;While(1){实验报告Switch(){选择命令;处理命令;}}}三、详细设计1.元素类型、结点类型和指针类型typedefstructPolyNode{intexpn;//指数doublecoef;//系数structPolyNode*next;}LNode,*LinkList;2.几个基本操作的函数1.LNode*MakeNode(doublecoef,intexpn)//制造节点{LNode*p;p=(LNode*)malloc(sizeof(LNode));p-coef=coef;p-expn=expn;p-next=NULL;returnp;}2.voidOrderInsert(LinkListL,LNode*r){//根据链表的expn指数域,对链表进行升序插入if(!L)printf(error);LNode*p,*q;p=L;while(p-next&&p-next-expnr-expn)p=p-next;if(p-next&&p-next-expn==r-expn){p-next-coef+=r-coef;if(p-next-coef==0){q=p-next;p-next=q-next;free(q);}free(r);}else{r-next=p-next;p-next=r;}}3.voidAddPolyn(LinkListL,LinkListJ,LinkList&K){//多项式相加if(!L||!J){printf(error\n);return;}LNode*p,*q,*m;p=L-next;q=J-next;InitList(K);while(p){m=MakeNode(p-coef,p-expn);OrderInsert(K,m);p=p-next;}while(q){m=MakeNode(q-coef,q-expn);OrderInsert(K,m);q=q-next;}}4.voidMultiplyPolyn(LinkListL,LinkListJ,LinkList&K){//多项式相乘if(!L||!J){printf(error);return;}LNode*p,*q,*m;p=L-next;InitList(K);while(p){q=J-next;while(q){m=MakeNode(p-coef*q-coef,p-expn+q-expn);OrderInsert(K,m);q=q-next;}p=p-next;}}5.LinkListCreatPolyn(void)//输入m项的系数和指数,建立表示一元多项式的有序链表L{LNode*p;LinkListhead;doublec;inte;InitList(head);printf(输入系数、指数,系数为0时结束);while(1){scanf(%lf,&c);if(c==0)break;scanf(%d,&e);p=MakeNode(c,e);OrderInsert(head,p);}returnhead;}6.voidDifferentialPolyn(LinkListL,LinkList&L2){//求导LNode*p,*r;if(!L)return;InitList(L2);r=L2;p=L-next;while(p){if(p-expn==0)r-next=MakeNode(0,0);elser-next=MakeNode(p-coef*p-expn,p-expn-1);r=r-next;p=p-next;}r-next=NULL;}3.主函数#defineN12voidmain(){LinkListP[N]={NULL};intmenu,i,j,l;doublek,sum;while(1){printf(\n);printf(多项式计算器\n);printf(======================================\n);printf(新建--1打印--2复制--3\n);printf(求值--4相加--5相减--6\n);printf(微分--7销毁--8清空--9\n);printf(积分--10相乘--11退出--0\n);printf(======================================\n);printf(请选择:\n);scanf(%d,&menu);switch(menu){case0:return;case1:printf(输入新多项式的下标(0--%d):,N-1);scanf(%d,&i);P[i]=CreatPolyn();break;case2:for(i=0;iN;i++){printf(P[%d]=,i);printPolyn(P[i]);}break;case3:printf(输入被复制的多项式和新多项式的下标(0--%d):,N-1);scanf(%d%d,&i,&j);CopyPolyn(P[i],P[j]);break;case4:printf(输入要求值多项式的下标(0--%d)和X值:,N-1);scanf(%d%lf,&i,&k);sum=SumPolyn(P[i],k);printf(多项式值为%lf,sum);break;case5:printf(输入相加两项的多项式和新多项式的下标(0--%d):,N-1);scanf(%d%d%d,&i,&j,&l);AddPolyn(P[i],P[j],P[l]);break;case6:printf(输入减两项的多项式和新多项式的下标(0--%d):,N-1);scanf(%d%d%d,&i,&j,&l);MinusPolyn(P[i],P[j],P[l]);break;case7:printf(输入求导的多项式的下标(0--%d)和新多项式的下标(0--%d):,N-1,N-1);scanf(%d%d,&i,&j);DifferentialPolyn(P[i],P[j]);break;case8:printf(输入被销毁多项式的下标(0--%d):,N-1);scanf(%d,&i);DestroyPolyn(P[i]);break;case9:printf(输入被清空多项式的下标(0--%d):,N-1);scanf(%d,&i);ClearPolyn(P[i]);break;case10:printf(输入求积分的多项式的下标(0--%d)和新多项式的下标(0--%d):,N-1,N-1);scanf(%d%d,&i,&j);IntegralPolyn(P[i],P[j]);break;case11:printf(输入相乘两项的多项式和新多项式的下标(0--%d):,N-1);scanf(%d%d%d,&i,&j,&l);MultiplyPolyn(P[i],P[j],P[l]);break;}}}四、调试分析1.刚开始时,忽略了一些变量参数的标识&,使调试程序时费了不少功夫。应注重确定参数的变量和属性。2.在做多项式求导运算时,未考虑常数项,结果出现a*x^-1,运算错误。应考虑特殊情况。3.整个程序运行期间实行动态存储管理,释放无用空间;特别是通过清除函数ClearPolyn和销毁函数DestroyPolyn释放无用空间。有效地防止了在程序反复运行可能出现系统空间不够分配的现象。4.经验体会:经过多次测试和修改,程序得到一定的完善。五、程序特色1.界面友好、简洁、大方。2.功能强大,包含加、减、乘、微分、积分、求值。3.通过将一些常用的操作打包成一个个功能函数,省去了对指针及节点的低层次操作,大大简化了程序,提高了编程的效率。4.程序操作简单,可读性强,性能稳定。5.编写的CreatPolyn、OrderInsert、AddPolyn、DifferentialPolyn函数简洁、可读性强。操作截图:
本文标题:一元多项式计算器报告(C语言编程)
链接地址:https://www.777doc.com/doc-5340876 .html