1、一元稀疏多项式的运算高级语言程序设计课程设计报告题目:一元稀疏多项式的运算专业:班级:姓名:指导教师:成绩:计算机与信息工程系 2014年6月20日 目 录 1 设计内容与要求 11.1设计内容 11.2主要功能与要求 12 概要设计 12.1设计思路 12.2设计思路分析 12.3主要模块和流程 23 设计过程 43.1代码分析及确定 43.2关键代码解释 84 设计结果与分析 114.1 设计结果 114.2 分析 125 参考文献 13附录:源代码 14 1 设计内容与要求1.1设计内容设计一个一元稀疏多项式简单计算器1.2主要功能与要求1输入并建立多项式2输出多项式,输出形式为整数序列
2、:n,c1,e1,c2,e2,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3求多项式a、b的导函数4 计算多项式在x处的值5多项式a和b相加,建立多项式a+b6 多项式a和b相减,建立多项式a-b 2 概要设计2.1设计思路 1 定义线性表的动态分配顺序存储结构; 2 建立多项式存储结构,定义指针*next 3利用链表实现队列的构造。每次输入一项的系数和指数,可以输出构造的一元多项式 4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;最后根据相应的输入数据(滤去输入中的非法字
3、符)建立的多项式以及多项式相加的运行结果在屏幕上显示。多项式显示的格式为:c1xe1+c2xe2+cnxen2.2设计思路分析 要解决多项式相加,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为序数coef指数expn指针域next运用尾插法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将单链表polyn p中的结点插入到单链表polyn h中),因此“和多项式”中的结点无须另生成。为了实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指
4、数项,由此得到下列运算规则: 若p-expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 若p-expn=q-expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。 若p-expnq-expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。2.3主要模块和流程 1 5 2 6 3 7 4 8 9 3 设计过程3.1代码分析及确定1)元素类型、结点类型和指针类型:typedef struct Polynomial float coef; /系数 int expn; /指数 struct Polynomial
5、 *next;*Polyn,Polynomial;2) 建立一个头指针为head、项数为m的一元多项式, 建立新结点以接收数据, 调用Insert函数插入结点: Polyn CreatePolyn(Polyn head,int m) int i; Polyn p; p=head=(Polyn)malloc(sizeof(struct Polynomial); head-next=NULL; for(i=0;icoef,&p-expn); Insert(p,head); return head;3)主函数和其他函数:void main() int m,n,a,x; char flag; Poly
6、n pa=0,pb=0,pc; float ValuePolyn(Polyn head,int x) /输入x值,计算并返回多项式的值4)界面代码:printf( -n); printf( | 数字媒体技术 13级(2)班 于富洋 |n); printf( -n); printf( 欢迎使用一元稀疏多项式操作程序n); printf(请输入a的项数:); scanf(%d,&m); pa=CreatePolyn(pa,m); /建立多项式a printf(请输入b的项数:); scanf(%d,&n); pb=CreatePolyn(pb,n); /建立多项式b /输出菜单printf( *n
7、); printf( * 多项式操作程序 *n);printf( * *n); printf( * A:输出多项式a B:输出多项式b *n); printf( * *n); printf( * C:输出a的导数 D:输出b的导数 *n); printf( * *n); printf( * E:代入x的值计算a F:代入x的值计算b *n); printf( * *n); printf( * G:输出a+b H:输出a-b *n); printf( * *n); printf( * I:输出a*b J:退出程序 *n); printf( * *n);printf( *n);5)在主函数中调用子
8、函数代码:while(a) printf(n请选择操作:); scanf( %c,&flag); switch(flag) caseA: casea: printf(n 多项式a=); PrintPolyn(pa); break; caseB: caseb: printf(n 多项式b=); PrintPolyn(pb); break; caseC: casec: pc=Derivative(pa); printf(n 多项式a的导函数为:a=); PrintPolyn(pc); break; caseD: cased: pc=Derivative(pb); printf(n 多项式b的导函数
9、为:b=); PrintPolyn(pc); break; caseE: casee: printf(输入x的值:x=); scanf(%d,&x); printf(n x=%d时,a=%.3fn,x,ValuePolyn(pa,x); break; caseF: casef: printf(输入x的值:x=); scanf(%d,&x); printf(n x=%d时,b=%.3fn,x,ValuePolyn(pb,x); break; caseG: caseg: pc=AddPolyn(pa,pb); printf(n a+b=); PrintPolyn(pc); break; caseH
10、: caseh: pc=SubtractPolyn(pa,pb); printf(n a-b=); PrintPolyn(pc); break; caseI: casei: pc=MultiplyPolyn(pa,pb); printf(n a*b=); PrintPolyn(pc); break; caseJ: casej: printf(n 感谢使用此程序!n); DestroyPolyn(pa); DestroyPolyn(pb); a=0; break; default: printf(n 您的选择错误,请重新选择!n); 3.2关键代码解释 1 ) 这段代码主要求a-b ,利用指针返
11、回,首先将将pb的系数取反进行判断,然后恢复pb的系数输入x值,计算并返回多项式的值Polyn SubtractPolyn(Polyn pa,Polyn pb) /求解并建立多项式a-b,返回其头指针 Polyn h=pb; Polyn p=pb-next; Polyn pd; while(p) /将pb的系数取反 p-coef*=-1; p=p-next; pd=AddPolyn(pa,h); for(p=h-next;p;p=p-next) /恢复pb的系数 p-coef*=-1; return pd;float ValuePolyn(Polyn head,int x) /输入x值,计算并
12、返回多项式的值 Polyn p; int i,t; float sum=0; for(p=head-next;p;p=p-next) t=1; for(i=p-expn;i!=0;) if(icoef*t; return sum;2)求解并建立导函数多项式,并返回其头指针,然后判断是不是常数项,再进行数据处理。Polyn Derivative(Polyn head) /求解并建立导函数多项式,并返回其头指针 Polyn q=head-next,p1,p2,hd; hd=p1=(Polyn)malloc(sizeof(struct Polynomial);/建立头结点 hd-next=NULL;
13、 while(q) if(q-expn!=0) /该项不是常数项时 p2=(Polyn)malloc(sizeof(struct Polynomial); p2-coef=q-coef*q-expn; p2-expn=q-expn-1; p2-next=p1-next; /连接结点 p1-next=p2; p1=p2; q=q-next; return hd;3)求解并建立多项式a*b,返回其头指针,调用Insert函数以合并指数相同的项Polyn MultiplyPolyn(Polyn pa,Polyn pb) /求解并建立多项式a*b,返回其头指针 Polyn hf,pf; Polyn q
14、a=pa-next; Polyn qb=pb-next; hf=(Polyn)malloc(sizeof(struct Polynomial);/建立头结点 hf-next=NULL; for(;qa;qa=qa-next) for(qb=pb-next;qb;qb=qb-next) pf=(Polyn)malloc(sizeof(struct Polynomial); pf-coef=qa-coef*qb-coef; pf-expn=qa-expn+qb-expn; Insert(pf,hf); /调用Insert函数以合并指数相同的项 return hf;4 设计结果与分析4.1 设计结果
15、 代码正确,可以正常运行。实例:对x+2x2+3x5 与 2x2+2x2+2x2 进行运算4.2 分析 程序的运行环境是VC6.0,所以可以对代码进行较好的编写与处理,比如说可以对代码进行复制、删除、粘贴等操作(这些都优于TC)。当把代码进行调试时,遇到了很多预想不到的麻烦。1 )定义函数类型时,没有较好的选择适当的类型,进而导致结果错误。所以以后要注意:前后定义变量要统一。2 )如果要调用添加函数,修改函数,修改函数,查找函数,统计函数等要在主函数前面进行申明。否则会显示警告。3 )在运行的过程中,对于一个循环语句,遇到了返回的值始终是真,程序进如死循环,这是编写代码粗心造成的,以后必须警示
16、。4 )因为此程序是简单的一元稀疏多项式的运算,所以精确度不是要求过高,但还是得对精确度进行明确,否则结果会出现错误。 在编写程序过程中明白了很多重要的步骤以及注意事项1 编写代码前要对要求进行明确。2 作出流程图。3 对各部分进行模块化,然后编写代码。4 用最规范的、最清晰的、最容易理解的方式写程序。5 在编程中,应仔细研究编译程序给出的错误信息和警告信息,弄清楚每条信息的确切根源并予以解决。6对关键语句进行注释。 5 参考文献 1谭浩强著.C程序设计(第二版).北京:清华大学出版社,19992谭浩强编著.QBASIC语言教程.北京:电子工业出版社,19973谭浩强.C程序设计M.3版.北京
17、:清华大学出版社,20054Herbert Schildt著.戴健鹏译.C语言大全(第二版).北京:电子工业出版社,1994附录:源代码#include#include /定义多项式的项typedef struct Polynomial float coef; /系数 int expn; /指数 struct Polynomial *next;*Polyn,Polynomial;void Insert(Polyn p,Polyn h) if(p-coef=0) free(p); /系数为0的话释放结点 else Polyn q1,q2; q1=h; q2=h-next; while(q2& p
18、-expn expn) /查找插入位置 q1=q2; q2=q2-next; if(q2& p-expn = q2-expn) /将指数相同相合并 q2-coef += p-coef; free(p); if(!q2-coef) /系数为0的话释放结点 q1-next=q2-next; free(q2); else /指数为新时将结点插入 p-next=q2; q1-next=p; Polyn CreatePolyn(Polyn head,int m) /建立一个头指针为head、项数为m的一元多项式 int i; Polyn p; p=head=(Polyn)malloc(sizeof(st
19、ruct Polynomial); head-next=NULL; for(i=0;icoef,&p-expn); Insert(p,head); /调用Insert函数插入结点 return head;void DestroyPolyn(Polyn p) /销毁多项式p Polyn q1,q2; q1=p-next; q2=q1-next; while(q1-next) free(q1); q1=q2; q2=q2-next; void PrintPolyn(Polyn P) Polyn q=P-next; int flag=1; /项数计数器 if(!q) /若多项式为空,输出0 putc
20、har(0); printf(n); return; while(q) if(q-coef0& flag!=1) putchar(+); /系数大于0且不是第一项 if(q-coef!=1&q-coef!=-1) /系数非1或-1的普通情况 printf(%g,q-coef); if(q-expn=1) putchar(X); else if(q-expn) printf(X%d,q-expn); else if(q-coef=1) if(!q-expn) putchar(1); else if(q-expn=1) putchar(X); else printf(X%d,q-expn); if
21、(q-coef=-1) if(!q-expn) printf(-1); else if(q-expn=1) printf(-X); else printf(-X%d,q-expn); q=q-next; flag+; printf(n);int compare(Polyn a,Polyn b) if(a&b) if(!b|a-expnb-expn) return 1; else if(!a|a-expnexpn) return -1; else return 0; else if(!a&b) return -1; /a多项式已空,但b多项式非空 else return 1; /b多项式已空,但
22、a多项式非空Polyn AddPolyn(Polyn pa,Polyn pb) /求解并建立多项式a+b,返回其头指针 Polyn qa=pa-next; Polyn qb=pb-next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial); /建立头结点 hc-next=NULL; headc=hc; while(qa|qb) qc=(Polyn)malloc(sizeof(struct Polynomial); switch(compare(qa,qb) case 1: qc-coef=qa-coef; qc-exp
23、n=qa-expn; qa=qa-next; break; case 0: qc-coef=qa-coef+qb-coef; qc-expn=qa-expn; qa=qa-next; qb=qb-next; break; case -1: qc-coef=qb-coef; qc-expn=qb-expn; qb=qb-next; break; if(qc-coef!=0) qc-next=hc-next; hc-next=qc; hc=qc; else free(qc); /当相加系数为0时,释放该结点 return headc;Polyn SubtractPolyn(Polyn pa,Pol
24、yn pb) /求解并建立多项式a-b,返回其头指针 Polyn h=pb; Polyn p=pb-next; Polyn pd; while(p) /将pb的系数取反 p-coef*=-1; p=p-next; pd=AddPolyn(pa,h); for(p=h-next;p;p=p-next) /恢复pb的系数 p-coef*=-1; return pd;float ValuePolyn(Polyn head,int x) /输入x值,计算并返回多项式的值 Polyn p; int i,t; float sum=0; for(p=head-next;p;p=p-next) t=1; for(i=p-expn;i!=0;) if(icoef*t; return sum;Polyn Derivative(Polyn head) /求解并建立导函数多项式,并返回其头指针 Polyn q=head-next,p1,p2,hd; hd=p1=(Polyn)malloc(sizeof(struct Polynomial);/建立头结点 hd-next=NULL; while(q) if(q-expn!=0)
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2