用C语言实现多项式简单计算器的设计概要Word格式.docx
《用C语言实现多项式简单计算器的设计概要Word格式.docx》由会员分享,可在线阅读,更多相关《用C语言实现多项式简单计算器的设计概要Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
程序验收、答辩;
撰写设计报告。
具体要求
1.课程设计报告按统一通用格式书写,具体内容如下:
①设计任务与要求
②总体方案与说明
③软件主要模块的流程图
④源程序清单与注释
⑤问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);
⑥小结与体会
附录:
①源程序(必须有简单注释)②使用说明③参考资料
2.每位学生应独立完成各自的任务且每天至少在设计室工作半天;
指导教师签名:
王绪梅2013年6月22日
教研室主任(或责任教师)签名:
2013年6月24日
目录
1.设计题目1
2.需求分析1
2.1一元多项式的简单计算器的基本功能1
2.2设计思路1
3.系统过程2
3.1概要设计2
3.2详细设计3
4.调用关系图3
4.1总流程图4
4.2加法流程图5
4.3减法流程图6
5.测试7
5.1测试数据7
5.2打开程序时的主界面7
5.3输入并建立多项式8
5.4选择执行的操作及执行的结果9
6.心得体会及总结10
7.参考文献10
附录11
数据结构课程设计报告书
1设计题目
用C语言实现多项式简单计算器的设计
2需求分析
2.1一元多项式的简单计算器的基本功能
(1)输入并建立多项式;
(2)输出多项式;
(3)多项式a和b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b;
(5)多项式a和b相乘,建立多项式a*b。
2.2设计思路
(1)定义线性表的动态分配顺序存储结构;
(2)建立多项式存储结构,定义指针*next;
(3)利用链表实现队列的构造,每次输入一项的系数和指数,可以构造一元多项式;
(4)演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;
最后根据相应的数据进行输入建立多项式以及多项式相加,减,乘的运行结果在屏幕上显示。
设计思路分析:
要解决多项式相加,相减,相乘,必须要有多项式,所以必须首先建立两个多项式,在这里采用链表的方式存储链表,所以我将结点结构体定义为:
系数coef
指数expn
指针域next
运用尾插法建立两个单链表,以单链表Polynp和Polynh分别表示一元多项式a和b,a+b的求和运算等同于单链表的插入问题(将Polynp中的结点插入到单链表Polynh中),因此“和多项式”的结点无须另生成。
为了实现处理,设p、q2分别指向单链表polya和polyb的当前项,比较p、q2结点的指数
由此得到下列运算规则:
①若p->
expn<
q2->
expn,则结点q2所指的结点应是“和多项式”中的一项,令指针q2后移。
②若p->
expn=q2->
expn,则将两个结点中的系数相加,当和不为0时修改结点q2的系数。
③若p->
expn>
expn,则结点p所指的结点应是“和多项式”中的一项,将结点p插入在结点q2之前,且令指针p在原来的链表上后移。
3系统设计
3.1概要设计
系统的主功能模块结构如图3—1所示。
3.2详细设计
1、元素类型、结点类型和指针类型:
typedefstructPolynomial
{
floatcoef;
//系数
intexpn;
//指数
structPolynomial*next;
}*Polyn,Polynomial;
2、建立一个头指针为head、项数为m的一元多项式,建立新结点以接收数据,调用Insert函数插入结点:
PolynCreatePolyn(Polynhead,intm){
inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));
head->
next=NULL;
for(i=0;
i<
m;
i++)
{
p=(Polyn)malloc(sizeof(structPolynomial));
printf("
请输入第%d项的系数与指数:
"
i+1);
scanf("
%f%d"
&
p->
coef,&
expn);
Insert(p,head);
//调用Insert函数插入结点
}
returnhead;
}
3、主函数和其他函数:
intmain()
intm,n,flag=0;
floatx;
Polynpa=0,pb=0,pc,pd,pe,pf;
voidPrintPolyn(PolynP)//输出多项式a和b
PolynAddPolyn(Polynpa,Polynpb)//求解并建立多项式a+b,返回其头指针
PolynSubtractPolyn(Polynpa,Polynpb)//求解并建立多项式a-b,返回其头指针
PolynMultiplyPolyn(Polynpa,Polynpb)//求解并建立多项式a*b,返回其头指针
4调用关系图
4.1总流程图
总流程图如图4—1所示。
4.2执行加法流程图
执行加法流程图如图4—2所示。
4.3执行减法流程图
执行减法流程图如图4—3所示。
5测试
5.1测试数据
1、(-3x11+5x8+4x)+(11x9-5x8+7)=(-3x11+11x9+4x+7);
2、(7x-3+4.4x2-1.2x9-x)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9+13x-3-x);
3、(9x8+4x6-5x4+8x)*(x14+2x4)=(9x22+4x20-5x18+8x15+18x12+8x10-10x8+16x5);
4、(x+x3)+(-x-x3)=0;
5、(1-x+x2+x3-x4)*(-x3-x4)=(x8-2x6-x3)。
5.2.打开程序时的主界面
打开程序时的主界面如图5—1所示。
图5—1打开程序时的主界面
5.3.输入并建立多项式
输入并建立多项式如图5—2所示。
图5—2输入并建立多项式
5.4选择执行的操作及执行操作的结果
选择执行的操作及执行操作的结果如图5—3、5—4、5—5所示。
图5—3选择执行的操作及执行操作的结果
图5—4选择执行的操作及执行操作的结果
图5—5选择执行的操作及执行操作的结果
6心得体会及总结
通过这次课程设计,我感觉到要自己动手真正做出一个程序并不很容易,但只要用心去做,总会有收获,特别是当我遇到问题,问老师,问同学,想尽办法去解决,最后终于找到方法时,心里的那份喜悦之情真是难以形容.编写程序中遇到问题再所难免,应耐心探究其中的原因,从出现问题的地方起,并联系前后程序,仔细推敲,逐个排查.直到最终搞清为止。
对于数据结构有了更深层次的理解,数据结构体现的是解决问题的一种思想,怎样把这种思想体现出来,需要我们对每个方面的系统了解。
并发现了许多自己的不足,平时没掌握的的知识在实践中暴露,经过不断的思考,查阅书籍和上网查资料及上机运行,解决了大部分的问题,还有一些小问题。
但是,我相信在今后的学习中,一定能把它解决好。
当今计算机应用在生活中可以说是无处不在。
因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好c语言版数据结构课程设计是十分必要的。
我不仅巩固了数据结构程序设计的内容,掌握设计的基本方法,强化了上机动手能力,还进一步掌握了以下知识:
数据类型,分支控制,循环控制,结构体及数组,指针,文件操作,编译预处理等;
通过课程设计,掌握了程序的局部测试,调试方法,建立程序系统调试,测试的基本概念和思想,学会较大程序的系统测试和调试方法。
当我选择通讯录管理系统时,首先系统分析主要思路和框架哦,与同学讨论,联系所学的知识。
我知道书上和老师讲的有限,所以上网搜也是一种利用资源的表现。
在编程中,特别是结构体,指针的部分,几乎是一片空白。
不过经过几天的努力,大体把课本上的知识点看了一遍,知识点也基本上掌握了,所以下一步就是开始正式的编程序了。
当读懂了C语言编程的基本过程和方法,经过一波三折,终于开始正式编程。
通过这次的课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的知识与实际结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多的人生哲理,懂得了怎么去制定计划,怎么去实现这个计划,并掌握了在执行的过程中怎样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定把课程设计的精神带到生活中,使生活变得更好。
7参考文献
[1]唐国民,王国均.数据结构(C语言版)·
北京:
清华大学出版社.
[2]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,1997.
[3]詹春华,杨沙.《C语言程序设计教程》科学出版社,2011.8
[4]董志民,崔建平,肖利娜.《C语言程序设计》教学改革探索与实践[J].福建电脑.
[5]王路明•C语言程序设计教程•北京:
北京邮电大学出版社,2005年5月
[6]谭浩强·
C++程序设计·
清华大学出版社·
2004
[7]范策.算法与数据结构(C语言版).北京:
机械工业出版社,2004.
附录
#include<
stdio.h>
malloc.h>
typedefstructPolynomial
{floatcoef;
intexpn;
structPolynomial*next;
}*Polyn,Polynomial;
//Polyn为结点指针类型
voidInsert(Polynp,Polynh)
{if(p->
coef==0)free(p);
//系数为0的话释放结点
else
{Polynq1,q2;
q1=h;
q2=h->
next;
while(q2&
&
expn)//查找插入位置
{q1=q2;
q2=q2->
if(q2&
expn==q2->
expn)//将指数相同相合并
{q2->
coef+=p->
coef;
free(p);
if(!
coef)//系数为0的话释放结点
{q1->
next=q2->
free(q2);
else//指数为新时将结点插入
{p->
next=q2;
q1->
next=p;
}//Insert
PolynCreatePolyn(Polynhead,intm)//建立一个头指针为head、项数为m的一元多项式
{inti;
{p=(Polyn)malloc(sizeof(structPolynomial));
//建立新结点以接收数据
printf("
scanf("
Insert(p,head);
//调用Insert函数插入结点
}//CreatePolyn
voidDestroyPolyn(Polynp)//销毁多项式p
q1=p->
q2=q1->
while(q1->
next)
{free(q1);
q1=q2;
//指针后移
voidPrintPolyn(PolynP)
{Polynq=P->
intflag=1;
//项数计数器
q)//若多项式为空,输出0
{putchar('
0'
);
\n"
return;
}
while(q)
{if(q->
coef>
0&
flag!
=1)putchar('
+'
//系数大于0且不是第一项
if(q->
coef!
=1&
q->
=-1)//系数非1或-1的普通情况
{printf("
%g"
q->
coef);
expn==1)putchar('
X'
elseif(q->
expn)printf("
X^%d"
coef==1){
expn)putchar('
1'
elseprintf("
coef==-1)
{if(!
-1"
expn==1)printf("
-X"
-X^%d"
q=q->
flag++;
}//while
}//PrintPolyn
intcompare(Polyna,Polynb)
{if(a&
b)
b||a->
b->
expn)return1;
elseif(!
a||a->
expn)return-1;
elsereturn0;
a&
b)return-1;
//a多项式已空,但b多项式非空
elsereturn1;
//b多项式已空,但a多项式非空
}//compare
PolynAddPolyn(Polynpa,Polynpb)//求解并建立多项式a+b,返回其头指针
{Polynqa=pa->
Polynqb=pb->
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));
//建立头结点
hc->
headc=hc;
while(qa||qb)
{qc=(Polyn)malloc(sizeof(structPolynomial));
switch(compare(qa,qb))
{case1:
{qc->
coef=qa->
qc->
expn=qa->
expn;
qa=qa->
break;
case0:
{
coef+qb->
qb=qb->
case-1:
coef=qb->
expn=qb->
}//switch
if(qc->
=0)
next=hc->
next=qc;
hc=qc;
elsefree(qc);
//当相加系数为0时,释放该结点
returnheadc;
}//AddPolyn
{Polynh=pb;
Polynp=pb->
Polynpd;
while(p)//将pb的系数取反
coef*=-1;
p=p->
pd=AddPolyn(pa,h);
for(p=h->
p;
p=p->
next)//恢复pb的系数
p->
returnpd;
}//SubtractPolyn
PolynMultiplyPolyn(Polynpa,Polynpb)//求解并建立多项式a*b,返回其头指针
{Polynhf,pf;
Polynqa=pa->
hf=(Polyn)malloc(sizeof(structPolynomial));
hf->
for(;
qa;
qa=qa->
{for(qb=pb->
qb;
qb=qb->
{pf=(Polyn)malloc(sizeof(structPolynomial));
pf->
coef*qb->
expn+qb->
Insert(pf,hf);
//调用Insert函数以合并指数相同的项
returnhf;
}//MultiplyPolyn
//定义各式的头指针,pa与pb在使用前赋初值NULL
请输入a的项数:
%d"
m);
pa=CreatePolyn(pa,m);
//建立多项式a
请输入b的项数:
n);
pb=CreatePolyn(pb,n);
//建立多项式b
//输出菜单
********************操作提示**************************\n"
\t1.输出多项式a和b\n"
\t2.建立多项式a+b\n"
\t3.建立多项式a-b\n"
\t4.建立多项式a*b\n"
\t5.退出\n*******************************************\n"
;
flag=0)
执行操作"
flag);
if(flag==1){
多项式a:
PrintPolyn(pa);
多项式b:
PrintPolyn(pb);
continue;
if(flag==2)
pc=AddPolyn(pa,pb);
多项式a+b:
PrintPolyn(pc);
DestroyPolyn(pc);
if(flag==3)
pd=SubtractPolyn(pa,pb);
多项式a-b:
PrintPolyn(pd);
DestroyPolyn(pd);
if(flag==4){
pf=MultiplyPolyn(pa,pb);
多项式a*b:
PrintPolyn(pf);
DestroyPolyn(pf);
if(flag==5)break;
if(flag<
1||flag>
8)printf("
Error!
!
}//for
DestroyPolyn(pa);
DestroyPolyn(pb);
return0;
设计过程中质疑(或答辩)记载:
问题1:
用什么存放数据?
答:
用带头结点的的单链表
问题2:
用结构体的系数coef和指数expn加上输出的结果,形成的结构是什么?
单链表
问题3:
怎样画流程图?
答:
先设计一个总流程图,结束,然后再按模块画出各个流程图,如图
指导教师评语:
签名:
2013年7月1日