一元多项式课程设计Word文件下载.docx
- 文档编号:18681703
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:25
- 大小:45.44KB
一元多项式课程设计Word文件下载.docx
《一元多项式课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《一元多项式课程设计Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
2.1范围
2.1.1标识
文件状态:
【】草稿
【√】正式发布
【】正在修改
文件标识:
一元多项式计算器
需求分析报告
当前版本:
1.0
作者:
刘胜寒
完成日期:
2012-4-1
2.1.2系统概述
软件名称:
软件功能:
为用户提供快速计算两个任意一元多项式的计算器(只包括加法,减法,乘法)。
用户:
中学生
开发者:
2.2需求概述
2.2.1系统目标
系统的开发目标是对于用户给定的任意两个一元多项式实现其之间的加法,减法,乘法,三种功能,并且按照升幂的方式输出运算结果。
2.2.2运行环境
配置一般的PC机就行,运行环境为win7/xp(此系统在win7环境下开发,调试,测试)。
2.2.3实验环境
Windows2000以上,C-Free任意版本。
2.2.4用户的特点
经常进行一元多项式操作的工作者。
2.3功能需求
用户要求输入两个字符串(任意一元多项式)然后进行加减乘操作,并且按照升幂输出结果。
此系统可以直接输入两个任意一元多项式的字符串,支持同类项合并(输入的多项式可以有相同的指数),去掉系数为0的项。
网上关于一多项式的操作代码大多是分别输入多项式的有几项然后依次输入各项的系数、指数,有的不支持同类项合并,有的连小数都不支持,还要人工进行拆分系数,指数合并同类项,增加许多麻烦,这与系统原来的意愿背道而驰。
此系统缺点就是没有菜单,只有输入输出。
操作界面蹩脚,不能给用户一个友好的操作界面。
优点就是操作简单,只需用户输入一元多项式即可,一元多项式的格式不限,注意:
输入一个完整的多项式时中间不能有空格,因为此系统是用cin读入。
3概要设计
3.1范围
3.1.1标识
概要设计报告
2012-3-31
3.1.2系统概述
一元多项式计算器。
为学生用户提供快速计算两个一元多项式的计算器(只包括加法,减法,乘法)。
初中生。
3.2系统结构
该系统直接面向用户。
用户可以直接运行此软甲,进行一元多项式的操作。
该系统只是进行简单的一元多项式的计算,没有设计什么菜单,用户类型,用户权限。
这只是一个工具。
4系统详细设计
4.1范围
4.1.1标识
详细设计报告
2011-4-10
4.1.2系统概述
一元多项式简单计算器
节约学生计算一元多项式的时间,提高效率。
初中生
刘胜寒。
4.2详细设计说明
此软件按照分治思想来进行编写的。
分别进行,字符串处理算法设计,提取多项式各个系数和指数算法设计,加、减、乘算法设计,化简算法设计,输出算法设计。
这设计每个算法时,定义每个函数的参数,所要实现那些功能。
intcmp(NodeA,NodeB)比较指数
inthuajian(NodeAB[],intn)合并同类项
intzhuanhuan(charA[],stringAB[])分解一元多项式
intTiqu(stringA,NodeAB[],intS)提取单项式的系数和指数
intMulti(NodeAB1[],intn,NodeAB2[],intm,NodeAB3[])
多项式相乘
intadd_sub(Nodetmp1[],intn,Nodetmp2[],intm,NodeAB3[],intN)
多项式相加或者相减
voidoutput(NodeA[],intn)输出计算结果
4.2.2字符串处理算法
这个函数的主要功能就是分解一元多项式的项数,把一元多项式变成一个个单项式。
例如2x+5x^8-3.1x^11,会被分解为2x,+5x^8,-3.1x^11。
也是整个系统的第一个函数,待操作的一元多项式都会经过这个函数进行处理。
参数分别为待处理的一元多项式A,和用来保存单项式的数组AB。
intzhuanhuan(charA[],stringAB[])
{//A[]输入的一元多项式AB[]分解后的一元多项式
stringB="
"
;
ints=0;
for(inti=0;
i<
strlen(A);
i++)
{
if((A[i]=='
+'
||A[i]=='
-'
)&
&
(A[i-1]=='
)'
||A[i-1]=='
x'
)&
i!
=0)
{//判断是否为多项式
AB[s++]=B;
B="
}
if((A[i]=='
(A[i-1]<
='
9'
A[i-1]>
0'
))
{//判断是否为多项式
B="
}
B=B+A[i];
if(i==strlen(A)-1)
{//结束
AB[s++]=B;
}
}
returns;
//一元多项式的个数
}
4.2.2提取多项式各个参数算法设计
个提取单项式的系数和指数,参数A代表单项式,AB用来存放单项式的系数和指数。
S表示有多少个单项式,用来返回AB的有效个数。
intTiqu(stringA,NodeAB[],intS)
{
intl,BJ=-1,bj=-1,i,B[2],s=0,Bj=-1;
//BJ标记x的位置bj标记系数有无括号Bj表示指数是否含有‘-’
doublex=0,y=0;
//x用来存放系数y用来存放指数
l=A.length();
memset(B,-1,sizeof(B));
//用来标记小数点的位置B[0]标记系数B[1]标记指数
for(inti=0;
l;
{
if(A[i]=='
)
BJ=i;
//BJ标记x的位置
break;
.'
B[0]=i;
//系数小数点的位置
for(i=l-1;
i>
=BJ;
i--)
('
)bj=i;
//指数括号的位置
)B[1]=i;
//指数小数点的位置
)Bj=i;
//指数判断有无'
^'
)break;
if(BJ!
=-1)//********************
{//x^nn!
=0
for(intj=0;
j<
BJ;
j++)
if(A[j]>
A[j]<
x=x*10+A[j]-'
if((A[0]=='
||A[0]=='
A[1]=='
)x=1;
if(A[0]=='
)x=-x;
if(B[0]!
=-1)
x=x*pow(0.1,BJ-B[0]-1);
if(BJ==-1)//x^nn=0
if(B[0]!
=-1)
x=x*pow(0.1,l-B[0]-1);
//****处理指数
if(BJ==-1)y=0;
//没有指数也就是指数为0
for(intj=BJ+1;
y=y*10+A[j]-'
if(BJ+1==l)y=1;
if(B[1]!
if(bj!
{//有括号
y=y*pow(0.1,l-2-B[1]);
if(bj==-1)
y=y*pow(0.1,l-B[1]-1);
if(Bj!
=-1)y=-y;
AB[S].x=x;
AB[S].y=y;
S++;
cout<
<
x<
"
y<
endl;
returnS;
4.2.3加减算法设计
进行加法或者减法计算,加法和减法只是后者取相反数,这个参数N为0时,tmp2的参数全部去相反数,就执行减法运算了。
tmp1存储第一个多项式的系数和指数,n为个数。
tmp2和tmp1一样,m为tmp2存储个数。
N判断加法还是减法
intadd_sub(Nodetmp1[],intn,Nodetmp2[],intm,NodeAB3[],intN)
{//N=0执行减法N=1执行加法AB3[]运行后的结果
NodeAB1[100],AB2[100];
n;
i++)//复制
AB1[i]=tmp1[i];
m;
AB2[i]=tmp2[i];
if(N==0)//判断是否执行减法
AB2[i].x*=-1;
for(intj=0;
if(AB1[i].y==AB2[j].y)
AB1[i].x+=AB2[j].x;
AB2[j].x=0;
//标记是否有同类项
AB3[i]=AB1[i];
j++)//添加未被运算的多项式
if(AB2[j].x!
AB3[n++]=AB2[j];
i++)//同类项合并
for(intj=i+1;
if(AB3[i].y==AB3[j].y)
AB3[i].x+=AB3[j].x;
AB3[j].x=0;
//标记是否有同类项
sort(AB3,AB3+n,cmp);
//升幂排序
returnn;
//执行加法或者减法后的不同项的个数
4.2.4乘法算法设计
执行乘法AB3用来保存运算结果
i++)//for循环
AB3[s].x=AB1[i].x*AB2[j].x;
AB3[s].y=AB1[i].y+AB2[j].y;
s++;
s;
i++)//合并同类项
//cout<
AB1[i].x<
AB1[i].y<
sort(AB3,AB3+s,cmp);
returns;
4.2.5化简算法设计
inthuajian(NodeAB[],intn)
sort(AB,AB+n,cmp);
if(AB[i].y==AB[j].y&
AB[i].x!
AB[i].x+=AB[j].x;
AB[j].x=0;
if(AB[i].x!
AB[s++]=AB[i];
4.2.6输出算法设计
voidoutput(NodeA[],intn)
doublex,y;
intBJ=0;
//表示是否所有的多项式的因子全为0即多项式为0
x=A[i].x;
y=A[i].y;
if(x!
=0)BJ=1;
if(x>
0&
=0)cout<
'
if(x<
0)cout<
if(y==0)
cout<
fabs(x);
elseif(y==1)
if(fabs(x)!
=1)
fabs(x)<
elsecout<
elseif(y<
0)
x^("
else
else
x^"
y;
}
if(BJ==0)cout<
0;
cout<
5测试说明
5.1范围
5.1.1标识
5.1.2系统概述
5.2测试计划及预期结果
(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=7+2x+11x^9-3.1x^11
(2x+5x^8-3.1x^11)-(7-5x^8+11x^9)=7+2x+11x^9-3.1x^11
(2x+5x^8-3.1x^11)*(7-5x^8+11x^9)=
14x+35x^8-10x^9+22x^10-21.7x^11-25x^16+55x^17+15.5x^19-34.1x^20
(6x^(-3)-x+4.4x^2-1.2x^9)+(-6x^(-3)+5.4x^2-x^2+7.8x^15)=-x+8.8x^2-1.2x^9+7.8x^15
(6x^(-3)-x+4.4x^2-1.2x^9)-(-6x^(-3)+5.4x^2-x^2+7.8x^15)=12x^(-3)-x-1.2x^9-7.8x^15
(6x^(-3)-x+4.4x^2-1.2x^9)*(-6x^(-3)+5.4x^2-x^2+7.8x^15)=-36x^(-6)+6x^(-2)
-4.4x^3+19.36x^4+7.2x^6-5.28x^11+46.8x^12-7.8x^16+34.32x^17-9.36x^24
(x+x^2)+(1+x+x^2)=1+2x+2x^2
(x+x^2)-(1+x+x^2)=-1
(x+x^2)*(1+x+x^2)=x+2x^2+2x^3+x^4
5.3具体测试情况
2x+5x^8-3.1x^117-5x^8+11x^9
6x^(-3)-x+4.4x^2-1.2x^9-6x^(-3)+5.4x^2-x^2+7.8x^15
x+x^21+x+x^2
6总结
通过这次课程设计,有对数据结构加深一次认识,对C语言编程有了一定的提高。
另外也提高了我分析问题,解决问题,从而运用所学知识解决实际问题的能力。
一开始选这个课题的时候感觉应该很容易,因为只牵涉到一元多项式的加减乘。
按照一班的写法就是把多项式的因子和指数分开读取,这样写的话,确实蛮简单,网上各种资料一大堆。
基本不用修改什么就可以拿来用了。
但这是不是我想要的,按照我的想法就是把一元多项式用字符串的方法读取。
这样可以方便用户操作,大大节约用户的时间。
一个大的程序是有许许多多小的函数组成的。
给定每个函数的接口,任务,功能。
这样就能化难为简,化繁为简。
这次没有使用链表写,是因为对链表不是很感兴趣,换成链表写的话,就改一下排序就行了。
因为用数组写的时后可以调用函数sort直接进行排序,如果用链表,要用比较暴利的循环在进行排序。
其他地方就不需要怎么大的修改就行可以实现用链表操作。
参考文献
[1]杨永斌.数据结构理论与实践[M].天津科学技术出版社,2011.
[2]谭浩强,C程序语言设计(第三版)[M].清华大学出版社,2007.
致谢
经过一个月的忙碌,课程设计顺利完成了。
在这里感谢我的数据结构老师高艳霞在以往的基础课学习中为我打下来良好的基础,是我这次课程设计能够顺利完成的前提。
感谢指导老师马竹根的悉心指导,没有他的帮助很多关键部分以己之力是很难完成,马老师的悉心知道是这次课程设计顺利完成的必要条件。
感谢学校能够给我们提供这么好的机房,是我方便上网查资料,有地方做这次的课程设计,
很感谢寝室的室友,请他们帮我调试,提了不少宝贵的意见,是我的程序有了进一步的完善。
附录
#include<
iostream>
string>
cmath>
usingnamespacestd;
structNode
};
intN=45,NN=43;
intcmp(NodeA,NodeB)
if(A.y>
B.y)return0;
elsereturn1;
i++)//合并同类项
if((A[i]=='
)&
(A[i-1]=='
if((A[i]=='
(A[i-1]<
//x的位置
//因子小数点的位置
//括号的位置
//指数小数点的位置
//判断有无'
//***********************处理因子******************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 课程设计