7 一元稀疏多项式计算器.docx
- 文档编号:6007308
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:28
- 大小:116.39KB
7 一元稀疏多项式计算器.docx
《7 一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《7 一元稀疏多项式计算器.docx(28页珍藏版)》请在冰豆网上搜索。
7一元稀疏多项式计算器
软件学院
课程设计报告书
课程名称数据结构
设计题目一元稀疏多项式计算器
专业班级软件10-1班
学号1020010127
姓名
指导教师徐娇月
2012年1月
目录
1.设计时间……………………………………………………………3
2.设计目的……………………………………………………………3
3.设计任务……………………………………………………………3
4.设计内容……………………………………………………………3
4.1.需求分析……………………………………………………………3
4.1.1程序所能达到的功能…………………………………………3
4.1.2输入的形式和输入值的范围…………………………………3
4.1.3输出的形式………………………………………………………3
4.1.4测试数据…………………………………………………………3
4.2.总体设计………………………………………………………4
4.2.1说明本程序中用到的所有抽象数据类型的定义…………4
4.2.2说明主程序的流程………………………………………………4
4.2.3说明各程序模块之间的层次(调用)关系………………5
4.3.详细设计………………………………………………………5
4.4.测试与分析……………………………………………………11
4.4.1.测试…………………………………………………………11
4.4.2.分析…………………………………………………………12
4.5.附录…………………………………………………………12
5.总体与展望………………………………………………………22
6.参考文献……………………………………………………………22
7.成绩评定……………………………………………………………23
1设计时间
(19周)2012年1月3-4号
2设计目的
数据结构是计算机专业的核心课程,是计算机科学的算法理论基础和软件设计的技术基础。
数据结构是实践性很强的课程。
课程设计是加强学生实践能力的一个强有力手段。
要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法。
课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
3设计任务
设计一个一元稀疏多项式简单计算器。
4设计内容
4.1需求分析
4.1.1程序所能达到的功能
(1)输入并建立多项式——CreateItem();
(2)输出多项式,输出形式为整数序列;
(3)多项式p(x)和q(x)相加;
(4)多项式p(x)和q(x)相减;
4.1.2输入的形式和输入值的范围
输入形式为整数序列:
n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,系数输入范围可以是小数,指数输入范围是整数。
4.1.3输出的形式
输入形式为整数序列:
n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,输入范围是整数。
4.1.4测试数据
1.(2x^3+3x^4)+2x^4=2x^3+5x^4
2.(2x^3+3x^4)-2x^4=2x^3+x^4
错误的输入:
未创建链表时输出。
输出结果:
“()isnotexist!
”
4.2总体设计
4.2.1说明本程序中用到的所有抽象数据类型的定义
CreateItem(&p,n)
操作结果:
输入n项的系数和指数,建立一元多项式p。
DestroyPolyn(&p)
初始条件:
一元多项式p已存在。
操作结果:
摧毁一元多项式p
OutputPolyn(p)
初始条件:
一元多项式p已存在。
操作结果:
打印输出一元多项式p。
AddPolyn(&P,&q)
初始条件:
一元多项式p(x)和q(x)已存在。
操作结果:
完成多项式相加运算,即:
p(x)=p(x)+q(x),并摧毁一元多项式q。
SubtractPolyn(&P,&q)
初始条件:
一元多项式p(x)和q(x)已存在。
操作结果:
完成多项式相减运算,即:
p(x)=p(x)-q(x),并摧毁一元多项式q。
4.2.2说明主程序的流程
创建链表CreateItem(s)
多项式相加PolynAddPolyn(Polynh1,Polynh2)
多项式相减PolynSubtractPolyn(Polynh1,Polynh2)
输出多项式voidOutput(Polynh,char*title)
4.2.3说明各程序模块之间的层次(调用)关系
4.3详细设计
内容包括:
1.
1)PolynInput(void)//输入并创建一个一元多项式
{
doublecoef;
intexpn;
inti;
intn;
Item*h,*p,*pp;
CreateItem(h);
h->next=NULL;
printf("输入多项式的项数n\n");
scanf("%d",&n);
printf("请输入多项式的系数和指数\n");
for(i=0;i { scanf("%lf%d",&coef,&expn); if(InsertLocate(h,expn,&pp)) {CreateItem(p); p->coef=coef; p->expn=expn; insert(pp,p); }; }returnh; } 2) voidDestroy(Polynh)//销毁多项式 { Item*p=h,*q; while(p! =NULL) { q=p; p=p->next; DeleteItem(q); } } 3) voidOutput(Polynh,char*title)//按指数升序输出多项式 { intflag=1; Item*p=h->next; printf("%s=",title); while(p) { if(flag! =0) {flag=0; if(p->expn==0&&p->coef! =0)printf("%.2lf",p->coef); elseif(p->expn! =0&&p->coef! =0)printf("%.2lfx^%d",p->coef,p->expn); } else { if(p->coef>0) {printf("+");printf("%.2lfx^%d",p->coef,p->expn);} elseif(p->coef==0)continue; elseprintf("%.2lfx^%d",p->coef,p->expn); } p=p->next; } printf("\n"); } 4) intInsertLocate(Polynh,intexpn,Item**p)//插入、查找 {Item*pre,*q; pre=h; q=h->next; while(q&&q->expn {pre=q; q=q->next; } if(! q) {*p=pre; return (1); } elseif(q->expn==expn) {*p=q; return(0); } else {*p=pre; return(-1); } } voidinsert(Item*pre,Item*p) { p->next=pre->next; pre->next=p; } 5) PolynAddPolyn(Polynh1,Polynh2)//求解多项式p(x)+q(x) { Item*head,*last,*pa=h1->next,*pb=h2->next,*s,*s0,*p; CreateItem(head); last=head; s=head; s0=s; while(pa&&pb) { CreateItem(s); s0->next=s; s0=s; if(pa->expn elseif(pa->expn>pb->expn){s->coef=pb->coef;s->expn=pb->expn;pb=pb->next;} elseif(pa->expn==pb->expn){s->coef=pa->coef+pb->coef;s->expn=pa->expn;pa=pa->next;pb=pb->next;} } if(pa)p=pa; elseif(pb)p=pb; else{last=s;last->next=NULL;returnhead;} while(p) { CreateItem(s); s0->next=s; s0=s; s->coef=p->coef; s->expn=p->expn; p=p->next; } last=s; last->next=NULL; returnhead; } 6) PolynSubtractPolyn(Polynh1,Polynh2)//求解多项式p(x)+q(x) {Item*head,*last,*pa=h1->next,*pb=h2->next,*s,*s0,*p; CreateItem(head); last=head; s=head; s0=s; while(pa&&pb) { CreateItem(s); s0->next=s; s0=s; if(pa->expn elseif(pa->expn>pb->expn){s->coef=-(pb->coef);s->expn=pb->expn;pb=pb->next;} elseif(pa->expn==pb->expn){s->coef=pa->coef+(-(pb->coef));s->expn=pa->expn;pa=pa->next;pb=pb->next;} } if(pa)p=pa; elseif(pb)p=pb; else{last=s;last->next=NULL;returnhead;} while(p) { CreateItem(s); s0->next=s; s0=s; if(p==pa) s->coef=p->coef; elses->coef=-(p->coef); s->expn=p->expn; p=p->next; } last=s; last->next=NULL; returnhead; } 2.intmain()//主函数 {intnum; Polynh1=NULL;//p(x) Polynh2=NULL;//Q(x) Polynh3=NULL;//P(x)+Q(x) Polynh4=NULL;//P(x)-Q(x) while (1) {num=menu(); getchar(); switch(num) { case1: if(h1! =NULL) { if(Select("P(x)isnotEmpty,CreateP(x)again? ")) {Destroy(h1);h1=Input();} } elseh1=Input(); break; case2: if(h2! =NULL) { if(Select("Q(x)isnotEmpty,CreateQ(x)again? ")) {Destroy(h2);h2=Input();} } elseh2=Input(); break; case3: if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)")) { h3=AddPolyn(h1,h2); Output(h3,"P(x)+Q(X)"); printf("P(x)+Q(x)hasfinished! \n"); getchar(); } break; case4: if(PolynNotEmpty(h1,"p(x)")&&PolynNotEmpty(h2,"Q(X)")) { h4=SubtractPolyn(h1,h2); Output(h4,"Px)-Q(x)"); printf("P(x)-Q(x)hasfinished! \n"); getchar(); } break; case5: if(PolynNotEmpty(h1,"p(x)")) { Output(h1,"P(x)"); getchar(); } break; case6: if(PolynNotEmpty(h2,"Q(x)")) { Output(h2,"Q(x)"); getchar(); } break; case7: if(PolynNotEmpty(h3,"P(x)+Q(x)")) { Output(h3,"P(x)+Q(x)"); getchar(); } break; case8: if(PolynNotEmpty(h4,"P(x)-Q(x)")) { Output(h4,"P(x)-Q(x)"); getchar(); } break; case9: { if(h1! =NULL)Destroy(h1); if(h2! =NULL)Destroy(h2); if(h3! =NULL)Destroy(h3); if(h4! =NULL)Destroy(h4); } return0; } } } 3. 主函数 多项式p(x)+q(x)多项式p(x)-q(x) PolynAddPolyn(Polynh1,Polynh2)PolynSubtractPolyn(Polynh1,Polynh2) 输入并建立多项式输出多项式 PolynInput(void)voidOutput(Polynh,char*title) 4.4测试与分析 4.4.1测试 4.4.2分析 1、在调用函数时可能对未定义的函数进行调用,或是输入时的数据与前面所定义的不相匹配,或是括号不匹配,语法错误等问题 2、希望能使结果以数学表达式的形式输出,希望实现合并在“此多项式不存在! ”等语句的输出。 应减少链表的空间复杂度。 4.5附录 #include #include //#include typedefstructItem{ doublecoef; intexpn; structItem*next; }Item,*Polyn; #defineCreateItem(p)p=(Item*)malloc(sizeof(Item)); #defineDeleteItem(p)free((void*)p); intSelect(char*str) {charch; printf("%s\n",str);1 printf("InputYorN: "); do{ch=getchar(); }while(ch! ='Y'&&ch! ='y'&&ch! ='N'&&ch! ='n'); printf("\n"); if(ch=='Y'||ch=='y')return (1); elsereturn(0); } intInsertLocate(Polynh,intexpn,Item**p) {Item*pre,*q; pre=h; q=h->next; while(q&&q->expn {pre=q; q=q->next; } if(! q) {*p=pre; return (1); } elseif(q->expn==expn) {*p=q; return(0); } else {*p=pre; return(-1); } } voidinsert(Item*pre,Item*p) { p->next=pre->next; pre->next=p; } /*输入*/ PolynInput(void) { doublecoef; intexpn; inti; intn; Item*h,*p,*pp; CreateItem(h); h->next=NULL; printf("输入多项式的项数n\n"); scanf("%d",&n); printf("请输入多项式的系数和指数\n"); for(i=0;i { scanf("%lf%d",&coef,&expn); if(InsertLocate(h,expn,&pp)) {CreateItem(p); p->coef=coef; p->expn=expn; insert(pp,p); } }returnh; } /*删除*/ voidDestroy(Polynh) { Item*p=h,*q; while(p! =NULL) { q=p; p=p->next; DeleteItem(q); } } /*输出*/ voidOutput(Polynh,char*title) { intflag=1; Item*p=h->next; printf("%s=",title); while(p) { if(flag! =0) {flag=0; if(p->expn==0&&p->coef! =0)printf("%.2lf",p->coef); elseif(p->expn! =0&&p->coef! =0)printf("%.2lfx^%d",p->coef,p->expn); } else { if(p->coef>0) {printf("+");printf("%.2lfx^%d",p->coef,p->expn);} elseif(p->coef==0)continue; elseprintf("%.2lfx^%d",p->coef,p->expn); } p=p->next; } printf("\n"); } intItemComp(Itemx,Itemy) {if(x.expn return(-1); elseif(x.expn==y.expn) return(0); elsereturn (1); } PolynAddPolyn(Polynh1,Polynh2) { Item*head,*last,*pa=h1->next,*pb=h2->next,*s,*s0,*p; CreateItem(head); last=head; s=head; s0=s; while(pa&&pb) { CreateItem(s); s0->next=s; s0=s; if(pa->expn elseif(pa->expn>pb->expn){s->coef=pb->coef;s->expn=pb->expn;pb=pb->next;} elseif(pa->expn==pb->expn){s->coef=pa->coef+pb->coef;s->expn=pa->expn;pa=pa->next;pb=pb->next;} } if(pa)p=pa; elseif(pb)p=pb; else{last=s;last->next=NULL;returnhead;} while(p) { CreateItem(s); s0->next=s; s0=s; s->coef=p->coef; s->expn=p->expn; p=p->next; } last=s; last->next=NULL; returnhead; } PolynSubtractPolyn(Polynh1,Polynh2) {Item*head,*last,*pa=h1->next,*pb=h2->next,*s,*s0,*p; CreateItem(head); last=head; s=head; s0=s; while(pa&&pb) { CreateItem(s); s0->next=s; s0=s; if(pa->expn elseif(pa->expn>pb->expn){s->coef=-(pb->coef);s->expn=pb->expn;pb=pb->next;} elseif(pa->expn==pb->expn){s->coef=pa->coef+(-(pb->coef));s->expn=pa->expn;pa=pa->next;pb=pb->next;} } if(pa)p=pa; elseif(pb)p=pb; else{last=s;last->next=NULL;returnhead;} while(p) { CreateItem(s); s0->next=s; s0=s; if(p==pa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元稀疏多项式计算器 一元 稀疏 多项式 计算器