一元多项式计算器设计与实现.docx
《一元多项式计算器设计与实现.docx》由会员分享,可在线阅读,更多相关《一元多项式计算器设计与实现.docx(14页珍藏版)》请在冰豆网上搜索。
一元多项式计算器设计与实现
课程设计计划任务书:
针对本课程设计,完成以下课程设计任务,
1.熟系统实现工具和上机环境;
2.根据课程设计任务,查阅相关资料;
3.针对所选课程设计任务完成以下工作:
(1).需求分析;
(2).概要设计;
(3).详细设计;
(4).编写源程序;
(5).静态做查程序和上机调试程序.
4.书写上述文档和撰写课程设计报告.
第一章设计课题
1.1设计目的
设计一元稀疏多项式简单计数器:
1.2基本功能要求
功能要求如下:
1.输入并建立多项式;
2.输出多项式,输出形式为整数序列n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
3.多项式a和b相加,建立多项式a+b;输出相加的多项式
4.多项式a和b相减,建立多项式a-b。
输出相加的多项式
用带表头结点的单链表存储多项式。
测试数据:
(1)(2x+5x8-3.1x11)+(7-5x8+7.8x15)
(2)(6x-3-x+4.4x2-1.2x9)–(-6x-3+5.4x2+7.8x15)
第二章需求分析
2.1输入的形式和输入值的范围:
输入是从键盘输入的,输入的内容为多项式的系数和指数,数为任意的整数,指数为大于等于0的整数
2.2输出的形式
从屏幕输出,显示用户输入的多项式,并显示多项式加减以后的多项式的值。
2.3程序所能达到的功能
a:
输入并建立多项式;
b:
输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
c:
多项式a和b相加,建立多项式a+b;
d:
多项式a和b相减,建立多项式a-b;
e:
多项式的输出形式为类数学表达式。
系数值为1的非零项的输出形式中略去系数1。
而-1x的输出形式为-x。
第三章概要设计
3.1设计思路
A:
数据结构的选用
为了实现任意多项式的加法,减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元属;
B:
多项式的输入
采用头插法的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;为了判断一个多项式是否输入结束,定义一个结束标志,当输入非0时就继续,当输入0时,就结束一个多项式的输入;
C:
2个多项式的加法
它从2个多项式的头部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为0的话,用头插法建立一个新的节点。
p的系数小于q的系数的话,就应该复制q接点到多项式中。
p的系数大于q的系数的话,就应该复制p接点到多项式中。
当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生。
当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生
D:
2个多项式的减法
它从2个多项式的头部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相减;相加的和不为0的话,用头插法建立一个新的节点。
p的系数小于q的系数的话,就应该复制q接点到多项式中。
p的系数大于q的系数的话,就应该复制p接点到多项式中,并且建立的接点的系数为原来的相反数;当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生。
当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生,并且建立的接点的系数为原来的相反数。
3.2流程图,如图3.2.1。
图3.2.1流程图
第四章详细设计
4.1程序头的设计:
#include
#include
typedefstructpnode
{intcoef;
intexp;
structpnode*next;
}pnode;
4.2用头插法生成一个多项式,系数和指数输入0时退出输入
pnode*creat()
{intm,n;pnode*head,*rear,*s;
head=(pnode*)malloc(sizeof(pnode));
rear=head;
printf("inputcoef:
");
scanf("%d",&n);
printf("inputexp:
");
scanf("%d",&m);
while(n!
=0)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=n;
s->exp=m;
s->next=NULL;
rear->next=s;
rear=s;
printf("inputcoef:
");
scanf("%d",&n);
printf("inputexp:
");
scanf("%d",&m);
}
head=head->next;
returnhead;
}
4.3显示一个多项式
voiddisplay(pnode*head)
{pnode*p;intone_time=1;p=head;
while(p!
=NULL)
{
if(one_time==1)
{if(p->exp==0)
printf("%d",p->coef);
elseif(p->coef==1||p->coef==-1)
printf("x^%d",p->exp);
elseif(p->coef>0)
printf("%dx^%d",p->coef,p->exp);
elseif(p->coef<0)
printf("%dx^%d",p->coef,p->exp);
one_time=0;
}
else{
if(p->exp==0)
{if(p->coef>0)
printf("+%d",p->coef);
}
elseif(p->coef==1)
printf("+x^%d",p->exp);
elseif(p->coef==-1)
printf("x^%d",p->exp);
elseif(p->coef>0)
printf("+%dx^%d",p->coef,p->exp);
elseif(p->coef<0)
printf("%dx^%d",p->coef,p->exp);
}
p=p->next;
}
printf("\n");
4.4两个多项式的加法运算
pnode*add(pnode*heada,pnode*headb)
{pnode*headc,*p,*q,*s,*r;
intx;
p=heada;
q=headb;
headc=(pnode*)malloc(sizeof(pnode));
r=headc;
while(p!
=NULL&&q!
=NULL)
{if(p->exp==q->exp)
{x=p->coef+q->coef;
if(x!
=0)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=x;
s->exp=p->exp;
r->next=s;
r=s;
}
q=q->next;p=p->next;
}
elseif(p->expexp)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
else
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
}
当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生
while(p!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生
while(q!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
headc=headc->next;
returnheadc;
4.5两个多项式的减法运算,和加法类似,不同的地方已经注释
pnode*sub(pnode*heada,pnode*headb)
{pnode*headc,*p,*q,*s,*r;
intx;
p=heada;q=headb;
headc=(pnode*)malloc(sizeof(pnode));
r=headc;
while(p!
=NULL&&q!
=NULL)
{if(p->exp==q->exp)
{x=p->coef-q->coef;
if(x!
=0)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=x;
s->exp=p->exp;
r->next=s;
r=s;
}
q=q->next;p=p->next;
}
elseif(p->expexp)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=-q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
else
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
}
while(p!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
while(q!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=-q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
headc=headc->next;
returnheadc;
4.6界面设计:
printf("\n****************************************\n");
printf("\n**************03Computer*************\n");
printf("\n********Class:
two****Num:
34*********\n");
printf("\n***********Name:
xiepan**********\n");
printf("\n****************************************\n");
printf("\n--------------1:
add-------------\n");
printf("\n--------------2:
sub-------------\n");
printf("\n--------------3:
exit------------\n");
printf("\n****************************************\n");
4.7连接程序:
case1:
add_main();break;
case2:
sub_main();break;
case3:
break;
第五章调式分析
5.1运行该程序的操作平台,如下:
5.1.1硬件要求:
此程序需在一台PC机上运行,要用INTER或AMD的CPU,其他没多大要求。
5.1.2软件要求:
本程序能在WINDOWS9X/2000/XP/2003下运行。
5.2错误分析,如下:
1、Callofnon-function调用尚未定义的函数,而正在被使用的函数则没有定义,是由于不正确的函数声明或者是函数名拼写错误所导致的(应该尽量避免该错误的出现)。
2、Badsizesyntax位字段长度语法错误,一个位字段长度是在1~16位的常量表达式。
3、Cannotmodifyaconstantobject不能修改一个常量对象,对定义为常量的对象进行不合法的操作都将引起该错误。
4、Badifndefdirectivesynaxifndef命令语法错误,#ifndef必须以单个的标识符作为该命令的主体。
5、Assemblerstatementtoolong汇编语句过长,直接插入的汇编语句长度不能超过480字节。
6、Arraysizetoolarge数组长度过大,定义的数组太大,可用的内存数量不足。
7、Argumentlistsyntaxerror参数表出现语法错误,函数调用的一组参数之间没有以逗号隔开,并以一个右括号结束。
8、Argument#missingname参数#名丢失,参数已经脱离用于定义的函数的原型。
9、#operatornotfollowedbymacroargumentname“#”运算符后没有跟宏变元名在宏定义中,#用来标识一宏变元是串。
“#”后必须跟一个宏变元名。
10、Compoundstatementmissing复合语句遗漏.主要是由于花括号不配对使用所致。
11、Defaultoutsideofswitchdefault在switch外出现。
12、Divisionbyzero除数出现了为零的情况。
13、Dostatementmusthavewhiledo语句后面丢失了while,而这个是必须需要de.
14、Do-whilestatementmissing)在其后漏掉了“)”
15、Extraparameterincall调用函数时出现多余函数,调用一个函数时,其实际参数的个数多余函数定义中的参数个数。
16、Forstatementmissing)for后面缺少“)”,在编制程序的时候,编译程序会发现控制表达式后面缺少右括号。
原因是源程序的表达式过于复杂,代码生成的程序无法为它生成代码。
此时应该简化繁琐的表达式或者干脆避免使用它。
总之,我们在编程时应该尽量认真检查,避免一些不必要的错误发生!
5.3使用说明
程序开始运行后,出现如图界面:
1、如果要进行加法运算,请输入1,出现
inputthefirst
inputcoef:
就是输入第一个多项式的每一项的系数和指数。
注意:
输入是随便输入的,输入0和0时退出。
coef:
是一项的系数
exp:
是一项的指数
如第一个多项式为5x^5+4x^4+3x^3;
过程如下:
inputthefirst:
inputcoef:
5
inputexp:
5
inputcoef:
4
inputexp:
4
inputcoef:
3
inputexp:
3
inputcoef:
0
inputexp:
0
接着输入第2个多项式的每一项的系数和指数。
如第2个多项式为4x^4+3x^3;
过程如下
inputthesecond:
inputcoef:
4
inputexp:
4
inputcoef:
3
inputexp:
3
inputcoef:
0
inputexp:
0
输入完以后就直接显示结果了:
thefirst:
5x^5+4x^4+3x^3
thesecond:
4x^4+3x^3
sumis:
5x^5+8x^4+6x^3
2、如果要进行减法运算,请输入2,过程和输入加法一样,输入2个多项式即可。
3、如果要退出的话,请输入3即可结束程序的运行。
5.4运行问题
在出现负系数时出现刷屏现象,但在程序中考虑到了负数问题,
{if(p->exp==0)
printf("%d",p->coef);
elseif(p->coef==1||p->coef==-1)
printf("x^%d",p->exp);
elseif(p->coef>0)
printf("%dx^%d",p->coef,p->exp);
elseif(p->coef<0)
解决办法:
在程序中先处理同中符号的数值,当出现负时记录数据,用第二种算法.
第六章总结
C语言功能强,使用灵活,可移植性好,目标程序质量好,它既有高级语言的优点,又具有低级语言的许多特点,既可以用来编写系统软件,又可以编写应用软件,由于c语言语法限制不严格,程序设计自由度大,在使用时会出现一些”副作用”,所以学好c语言最好有过学习一门其他语言.
在编程过程中善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行。
经验丰富的人,当编译时出现“出错信息”时,能很快地判断出错误所在,并改正之。
而缺乏经验的人即使在明确的出错提示下也往往找不出错误而求救于别人。
调试程序的经验固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积,而且有些经验是只能“会意”难以“言传”。
因此,在实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序一些功能、改变输入数据的方法等),再进行编译、连接和运行。
通过这次课程设计我觉得我们学习《数据结构》的方法存在一定的弊端,《数据结构》的效果直接影响到我们对其它专业课的学习和今后业务的成长。
我觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要让我们勤动手,多实践。
整个实验过程要结合教学进度与我们的实际情况,制定实验的内容。
实验分两部分,一是验证性的,主要结合课堂理论教学内容展开,学生可以对在课堂上学到的基本算法进行验证;二是设计性实验,坚持“学以致用”的原则,目的是让学生充分利用所学的理论知识进行相对复杂的应用设计,以进一步提高综合能力和创新实践能力。
而在传统的课堂教学中,一般采用的是“教师――黑板——学生”的教学模式,这对大多数教师和学生来说,“教”和“学”很难在课堂中得到良好的协调,因而也就难以对教学内容进行及时而有效地消化,从而使教学效果受到影响。
所以我希望以后的数据结构的学习能够改在多媒体教室进行.
最后我要衷心的感谢所有给予我帮助和指导的老师和同学,没有他们的帮助我的程序也不会完成得这么顺利!
附录1:
参考文献
1.清华大学出版社,数据结构(C语言版),严蔚敏,吴伟民编;
2.清华大学出版社,数据结构(C语言版)习题与解析,李春葆编;
3.清华大学出版社,C++程序设计教程钱能编。
附件2:
源代码
见"详细设计"一章.