多项式简单的计算器.doc
- 文档编号:1935947
- 上传时间:2023-05-02
- 格式:DOC
- 页数:27
- 大小:633.50KB
多项式简单的计算器.doc
《多项式简单的计算器.doc》由会员分享,可在线阅读,更多相关《多项式简单的计算器.doc(27页珍藏版)》请在冰点文库上搜索。
目录
1 软件开发平台 1
2 软件功能说明 1
2.1 功能分析说明图 1
2.2 各项功能说明 3
3 软件设计详细内容 5
3.1 采用的主要数据结构类型 5
3.2 流程图 5
4 软件测试 8
4.1 软件测试用例 8
4.2 软件测试报告 8
5 总结和致谢 13
6 附录 13
6.1 软件使用说明 13
6.2 源码 16
6.3 参考文献 26
1.软件开发平台
配置环境WindowsXP系统或Windows7系统
运行环境WindowsXP系统或Windows7系统
开发工具VC++6.0
程序语言C语言
2.软件功能说明
一元多项式简单的计算器
该计算器具有以下功能:
① 能够按照多项式变量的指数降序创建一个多项式;
② 能够对已创建的多项式进行显示;
③ 能够对已创建的多项式之间的加法运算;
④ 能够对已创建的多项式之间的减法运算;
⑤ 能够对已创建的多项式进行删除;
⑥ 能够实现计算器退出操作;
2.1功能分析说明图
退出菜单
多项式的删除
多项式的相减
多项式的相加
多项式的显示
多项式的建立
一元多项式简单的计算器
2.2各项功能说明
要求对分别上面的每个功能模块进行详细的文字说明
主函数模块main()建立一个可供选择的菜单,通过switch语句,选择1则是去建立多项式,选择2则是去显示出多项式,选择3则是去进行两个多项式的相加,选择4则是进行两个多项式的相减,选择5则是去进行多项式的删除,选择6则是退出菜单。
多项式的建立模块Creatpol()建立一个链表,头指针均用结构体指针数组中的元素表示,且头指针所指的结构体的指数是表示该链表表示的多项式的项数,而后以指数递减的次序依次输入各项,链表中的第二个节点表示的是多项式中的第一项,依次类推,不断把多项式各项的指数,系数的值输入链表的节点中,并使链尾指针为空。
多项式的输出模块Outp_pol()首先用一个指针指向需要输出的多项式对应的链表的头指针,头指针的指数成员表示项数,接着通过链表依次输出各项,从第二项开始,系数不小于的项与系数小于0的项输出是不一样的,判断后依次输出。
多项式的相加模块Addpol()需要用到两个指针指向相加的两个多项式,用一个链表表示两个多项式相加后形成的新的多项式,首先确定两指针是否已到达链尾来作为循环条件,其次以两指针所指的节点的结构体的指数成员值的大小比较分成三种情况进行计算,指数偏大者指针向下一个移动,指数相同的两者系数相加,直到两者都到达链尾,从而伴随着新链表的形成,及相加后新的多项式的形成。
多项式的相减模块Decpol()需要用到两个指针指向相减的两个多项式,用一个链表表示两个多项式相减后形成的新的多项式,首先确定两指针是否已到达链尾来作为循环条件,其次以两指针所指的节点的结构体的指数成员值的大小比较分成三种情况进行计算,指数偏大者指针向下一个移动,指数相同的两者系数相减,直到两者都到达链尾,从而伴随着新链表的形成,及相减后新的多项式的形成。
多项式的删除模块Delpol()用一个指针指向要删除的多项式,运用free()函数,依次删除该链表的各个节点。
3.软件设计详细内容
3.1采用的主要数据结构类型
#include
#include
结构体:
structponode
{floatxishu;//系数
intzhishu;//指数
structponode*next;//自引用结构
}*polhead;//定义指针
p_polpolhead[26]={0};//定义结构体指针数组
charmenu,name,name1,name2;
inttuichu=0,j=0,n;
3.2流程图
1).主菜单流程图
inttuichu=0,j=0
tuichu==0?
j==0?
printf(“”)
READ(menu)
menu==1?
menu==2?
menu==3?
menu==4?
menu==5?
j++
menu==6?
Creatpol()
Creatpol()
Outp_pol()
Addpol()
Decpol()
Delpol()
tuichu==1
break
break
break
break
break
break
N
Y
N
N
N
N
N
N
Y
Y
Y
Y
Y
Y
printf(“再次选择”)
Y
2)Creatpol()函数流程图:
p_polp,t;
inti;
*p_polhead=(pol*)malloc(sizeof(pol))
(*p_polhead)->zhishu=n
t=*p_polhead
printf(“”)
i p=(pol*)malloc(sizeof(pol)) printf(“”) scanf("%f%d"…) t->next=p t=p i++ t->next=NULL return1 Y N 3)Outp_pol()函数流程图: inti=0;p_polp; p=p_polhead->next printf(“…”) printf("%f*x^%d",…) i i==0 printf("%f*x^%d",…) p->xishu>=0 printf("+%f*x^%d",…) p=p->next i++ printf("\n") 4)Addpol()函数流程图: p1=polhead1->next p2=polhead2->next *p_polhead=(pol*)malloc(sizeof(pol)) p=t=*p_polhead p1&&p2==0 e1=p1->zhishu e2=p2->zhishu e1>e2 e1==e2 e1 p1=p1->next sum=p1->xishu+p2->xishu p1=p1->next;p2=p2->next p2=p2->next p1==0 i++ p1=p1->next i++ p2==0 i++ p2=p2->next t->next=NULL (*p_polhead)->zhishu=i Y Y Y Y Y Y N N N N N N 5)Decpol()函数流程图: p1=polhead1->next p2=polhead2->next *p_polhead=(pol*)malloc(sizeof(pol)) p=t=*p_polhead p1&&p2==0 e1=p1->zhishu e2=p2->zhishu e1>e2 e1==e2 e1 p1=p1->next dif=p1->xishu-p2->xishu p1=p1->next;p2=p2->next p2=p2->next p1==0 i++ p1=p1->next i++ p2==0 i++ p2=p2->next t->next=NULL (*p_polhead)->zhishu=i Y Y Y Y Y Y N N N N N N 6)Delpol()函数流程图: p_polp,t p=t=*p_polhead p->next==0 p=p->next free(t) t=p N Y 4.软件测试 4.1软件测试用例 打开软件,进入系统主界面: 多项式创建功能测试: 选择指令1,进入建立多项式的模块,先创建多项式a: 再次选择指令1,创建多项式b: 多项式输出功能测试 选择指令2,进入多项式输出的模块,先输出多项式a: 再次选择指令2,输出多项式b: 多项式相加功能测试 选择指令3,进入多项式相加的模块,并输出相加后的多项式c: 多项式相减功能测试 然后选择指令4,进入多项式相减的模块,并输入相减后的多项式d: 多项式删除功能测试 接着选择指令5,进入多项式删除的模块,删除多项式d,及释放多项式d对应的链表所占用的内存: 多项式删除功能测试 最后选择指令6,退出菜单: 所有测试完毕,功能全部正常。 4.2软件测试报告 将4.1测试过程中能完成的功能和不能完成的功能以及不能完全完成的功能进行列表分析,指出测试结果和出错原因,例如: 标号 项目 预期结果 实际结果 出错原因 出错次数 01 主函数菜单 美观的菜单 得到美观的菜单 无 无 02 多项式的创建 正确输入数据 完成 无 无 03 多项式的显示 正确显示数据 完成 无 无 04 多项式的相加 正确处理数据 完成 无 无 05 多项式的相减 正确处理数据 完成 无 无 06 多项式的删除 正确删除数据 完成 无 无 5.总结和致谢 开始选这个程序的时候,我以为这个程序很简单,可当选完以后,自己开始着手做这个程序的时候,查阅了相关资料,发现做这个程序还要用到链表,而链表在课本上算是一个比较难的知识点,我做这个程序发了很久的时间,单单就把书上的关于链表部分的知识看懂就发了比较多的时间,而自己把整个程序做出来的时候,一上机检测,发现错误到处都是,自己于是细心地想办法一个一个去改,最后运行到没问题时,才放了一大口气。 我感觉自己通过做这个实验收获的挺多的,而自己完成了这个程序也产生了一种自豪感。 通过这次课程设计,我发现了自己在学习中的诸多不足,我想我会积极改正的。 无论是在课堂学习,还是在课外的相关知识的拓展,我均通过这次课程设计认识到了不足,很感谢能有这样一次课程设计的机会。 另外,在我自己写完程序上机检测的时候,真的是很多错误,我要感谢我的同学,他们帮我指出了不少错误。 然而帮助我改正绝大部分错误的还是网络资料,因为很多莫名的错误根本看不懂,只是在网上一查才知道到底错误实质上是出在哪里了。 最后还是感谢老师和许多同学,我在这次课程设计中的收获离不开他们的帮助。 6.附录 6.1软件使用说明 运行条件: 本软件可以在VisualC++里运行,其他编程软件没有测试。 进入主菜单以后,选择你要执行模块,在初次使用时,应先选择指令1输入两个多项式后才能使用其他模块,在输入多项式时应注意多项式的名称要用小写字母表示,而且输入多项式的项数时,要注意多项式的输入应不含同类项,且指数单调递减, 创建了两个多项式后,可选择指令2对其进行输出,只需输入需输出的多项式即可,可输出多项式的项数,而且显示出多项式, 接着可在再次选择中选择指令3,并输入两个相加多项式的名称和和式的名称,即可输出和式的项数以及显示出相加后的多项式, 接着可在再次选择中选择指令4,并输入两个相减多项式的名称和差式的名称,即可输出差式的项数以及显示出相减后的多项式, 然后选择指令5,可以删除想要删除的多项式,以腾出更多的内存空间, 当使用完之后,可以选择指令6来退出主菜单, 6.2源码 #include #include #defineREAD(I)do{I=getchar();}while(I=='\n')/*宏定义,读取不是回车符的字符*/ typedefstructponode { floatxishu; intzhishu; structponode*next; }pol,*p_pol;/*结构体类型的定义及其类型别名*/ intCreatpol(p_pol*p_polhead,intn);/*创建多项式的函数声明*/ voidOutp_pol(p_polp_polhead);/*输出多项式的函数声明*/ voidAddpol(p_pol*p_polhead,p_polpolhead1,p_polpolhead2);/*求多项式之和的函数声明*/ voidDecpol(p_pol*p_polhead,p_polpolhead1,p_polpolhead2);/*求多项式之差的函数声明*/ voidDelpol(p_pol*p_polhead);/*删除多项式的函数声明*/ voidmain() { p_polpolhead[26]={0};/*定义结构体指针数组*/ charmenu,name,name1,name2; inttuichu=0,j=0,n;/*数据类型声明*/ printf("***一元多项式的简单计算器***\n\n\n"); printf("(为确保函数正常运行,多项式要求不含同类项,指数递减)\n"); while(tuichu==0) { if(j! =0) printf("\n\n\n\n\n再次选择: \n"); printf("*1.建立多项式*\n"); printf("*2.输出多项式*\n"); printf("*3.求两个多项式之和,建立和式并输出*\n"); printf("*4.求两个多项式之差,建立和式并输出*\n"); printf("*5.删除多项式*\n"); printf("*6.退出*\n"); printf("*请选择指令: "); READ(menu);/*输入指令*/ printf("\n"); switch(menu)/*根据不同指令选择不同的菜单*/ { case'1': /*建立多项式*/ printf("*请输入要创建的多项式的名称,用单个小写字母表示: "); READ(name);/*输入多项式的名称*/ printf("\n"); printf("*请输入项数: "); scanf("%d",&n);/*输入多项式的项数*/ if(Creatpol(&polhead[name-'a'],n))/*调用函数并判断是否成功创建了多项式*/ printf("*多项式%c创建完毕! \n",name); break; case'2': /*输出多项式*/ printf("请输入要输出的多项式的名称: "); READ(name);/*输入需输出的多项式的名称*/ printf("\n"); Outp_pol(polhead[name-'a']);/*调用多项式输出函数*/ break; case'3': /*求两多项式的和*/ printf("请输入加式1的名称: "); READ(name1); printf("\n"); printf("请输入加式2的名称: "); READ(name2); printf("\n"); printf("请输入要创建的和式的名称: "); READ(name); printf("\n"); Addpol(&polhead[name-'a'],polhead[name1-'a'],polhead[name2-'a']);/*调用多项式求和函数*/ Outp_pol(polhead[name-'a']);/*调用多项式输出函数*/ break; case'4': /*求两多项式的差*/ printf("请输入被减式的名称: "); READ(name1); printf("\n"); printf("请输入减式的名称: "); READ(name2); printf("\n"); printf("请输入要创建的差式的名称: "); READ(name); printf("\n"); Decpol(&polhead[name-'a'],polhead[name1-'a'],polhead[name2-'a']);/*调用多项式求差函数*/ Outp_pol(polhead[name-'a']);/*调用多项式输出函数*/ break; case'5': /*删除多项式*/ printf("请输入要删除的多项式名称: \n"); READ(name); Delpol(&polhead[name-'a']);/*调用多项式删除函数*/ printf("多项式%c已删除! \n",name); break; case'6': /*退出菜单*/ tuichu=1; break; } j++;/*统计选择指令的次数*/ } } intCreatpol(p_pol*p_polhead,intn) { inti; p_polp,t; *p_polhead=(pol*)malloc(sizeof(pol));/*申请一个空间*/ (*p_polhead)->zhishu=n;/*头指针的指数成员值为多项式的项数*/ t=*p_polhead; printf("请按指数递减序输入最简形式的多项式\n"); for(i=0;i { p=(pol*)malloc(sizeof(pol)); printf("请输入第%d项(系数,指数): ",i+1); scanf("%f%d",&(p->xishu),&(p->zhishu));/*输入该项的系数与指数*/ printf("\n"); t->next=p;/*t的下一个节点为p*/ t=p;/*将p的成员值赋给t*/ } t->next=NULL;/*确定链尾指针为空*/ return1;/*创建完毕后返回1*/ } voidOutp_pol(p_polp_polhead) { inti; p_polp; printf("总项数为: %d\n",p_polhead->zhishu);/*链表的头指针的指数成员值代表该多项式的项数*/ p=p_polhead->next; for(i=0;i { if(i==0) printf("%f*x^%d",p->xishu,p->zhishu);/*第一项的输出*/ else if(p->xishu>=0) printf("+%f*x^%d",p->xishu,p->zhishu);/*系数不小于零的非第一项的输出*/ else printf("%f*x^%d",p->xishu,p->zhishu);/*系数小于零的非第一项的输出*/ p=p->next;/*p指针移向下一个节点*/ } printf("\n"); } voidAddpol(p_pol*p_polhead,p_polpolhead1,p_polpolhead2) { inti=0,e1,e2; floatsum; p_polp1,p2,p,t; p1=polhead1->next; p2=polhead2->next; *p_polhead=(pol*)malloc(sizeof(pol));/*申请一个空间*/ p=t=*p_polhead; while(p1&&p2)/*判断p1与p2均为非空指针*/ { e1=p1->zhishu; e2=p2->zhishu; if(e1>e2) { p=(pol*)malloc(sizeof(pol)); t->next=p; t=p; *p=*p1;/*将p1的成员值赋给p*/ p1=p1->next;/*p1移向下一个节点*/ i++;/*统计多项式的项数*/ } elseif(e1==e2) { sum=p1->xishu+p2->xishu;/*将两个指数相同的项的系数相加*/ if(sum! =0.0)/*当其不为零时*/ { p=(pol*)malloc(sizeof(pol)); t->next=p; t=p; p->xishu=sum;/*系数为sum*/ p->zhishu=e1;/*指数不变*/ i++;/*统计多项式的项数*/ } p1=p1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多项式 简单 计算器