资源描述
西安文理学院软件学院
课程设计汇报
设计名称: 程序语言课程设计
设计题目: 一元多项式简单计算器
学生学号: 140215
专业班级: 软件学院一班
学生姓名: 张文东
学生成绩:
指导老师(职称): 袁溪(讲师)
课题工作时间: .12.9 至 .12.23
软件学院课程设计任务书
学生姓名
张文东
学号
专业班级
1班
设计题目
一元多项式简单计算器
内容概要:
设计或开发环境:Microsoft Visual Studio
关键技术:C语言
关键功效:
[1]建立一元数次多项式
[2]多项式相加
[3]多项式相减
[4]多项式相乘
文件资料:
[1]谭浩强《C语言程序设计》(第三版) 清华大学出版社
[2]姜敏芝 余健 《C语言程序设计案例精编》 清华大学出版社
[3]李健学 余健 《数据结构课程设计案例精编》
[4]唐国民 王国均《数据结构》(C语言版) 清华大学出版社
[5]网上相关文件资料
设计要求:
A.功效要求
1)输入并建立多项式;
2)输出多项式;
3)两个多项式相加,输出和多项式;
4)两个多项式相减,输出差多项式。
B.文档格式
*.c
工作期限:设计工作自12月9日至12月23日止。
指导老师: 院长:
日 期:12月9日
软件学院课程设计进度安排表
学生姓名: 张文东 学号: 140215 专业: 软件工程 班级: 一班
起止日期
内 容
备注
12月9日
下达任务书,制订进度安排计划
12月10日~12月12日
系统整体设计和具体设计
12月13日~12月17日
系统编码实现
12月18日~12月19日
系统测试
12月20日~12月23日
撰写课程设计汇报
12月25日
演示软件和答辩
指导老师署名:
12月11日
成绩评定表
学生姓名: 张文东 学号: 140215 专业: 软件工程 班级: 一班
类别
累计
分值
各项分值
评分标准
实际得分
累计得分
平时表现
10
10
按时参与设计指导,无违反纪律情况。
完成情况
30
20
按设计任务书要求完成了全部任务,能完整演示其设计内容,符合要求。
10
能对其设计内容进行具体、完整介绍,并能就指导老师提出问题进行正确回复。
汇报质量
35
10
汇报文字通顺,内容翔实,叙述充足、完整,立论正确,结构严谨合理;汇报字数符合相关要求,工整规范,整齐划一。
5
课题背景介绍清楚,综述分析充足。
5
设计方案合理、可行,论证严谨,逻辑性强,含有说服力。
5
符号统一;图表完备、符合规范要求。
5
能对整个设计过程进行全方面总结,得出有价值结论或结果。
5
参考文件数量在2篇以上,格式符合要求,在正文中正确引用。
答辩情况
25
10
在要求时间内能就所设计内容进行叙述,言简意明,关键突出,论点正确,条理清楚。
15
在要求时间内能正确、完整、流利地回复老师所提出问题。
总评成绩: 分
指导老师: (签字)
日期: 年12月 25 日
摘 要
摘要:伴随科技不停发展,大家生活水平不停提升,方便、高效、快捷成为了大家所追求关键目标,面对部分复杂技术总会花费大量时间进行计算,所以有一个多项式功效计算器是很有必需。
开发这么一个程序需要用到C结点、链表方面知识,系统分为多项式输入输出、多项式加法、多项式减法、多项式乘法四个模块。
该汇报关键是经过系统程序段、程序设计要求和计算器功效来介绍该计算器实现过程。
关键字:多项式;C语言;结点;链表
目 录
目 录 1
第一章 课题背景 2
1.1 绪论 2
1.2 关键内容 2
第二章 设计介绍及设计方案叙述 3
2.1 系统分析 3
2.2 总体设计 3
第三章 具体设计 5
3.1 建立多项式 5
3.2 多项式相加 7
3.3 多项式相减 9
3.4 多项式相乘 10
关键代码以下: 12
关键代码以下: 14
第四章 设计结果及分析 17
4.1 调试和测试 17
4.2 运行结果 19
4.3 结果分析 21
总结 22
参考文件 23
附录 24
第一章 课题背景
1.1 绪论
伴随科技进步,社会不停发展,计算器已普遍应用于各行各业,为了帮助大家提升工作效率,节省运算时间,设计一个多功效计算器是很有必需,在此设计一个多项式计算器能够很方便对多项式相加、相减、相乘,对提升大家运算效率很有帮助。
一个计算器需要用到C多方面知识,要实现多项式建立和输入输出等功效,必需要熟练掌握C,在此尤其是链表和结点。
1.2 关键内容
用C语言实现多项式输入输出和多项式加减乘等运算,其中关键用到链表和结点相关知识,具体功效以下:
1)输入并建立多项式;
2)输出多项式;
3)两个多项式相加,输出和多项式;
4)两个多项式相减,输出差多项式。
第二章 设计介绍及设计方案叙述
2.1 系统分析
2.1.1 功效需求
多项式建立 多项式输入输出 多项式加减乘等运算
2.1.2 数据需求
在输入过程中,首先要给定输入数据,数据只能是数字,不能是字母或其它,不能连续输入数据,必需要求以空格分开要输入数据。
2.1.3 系统需求
系统必需安全可靠,不会出现无故死机状态,运算速度要快。
2.2 总体设计
2.2.1 系统设计方案
采取菜单设计,选择你需要功效,用单链表储存你输入数据。
(1) 菜单
菜单包含计算器加减乘等功效选择
(2) 文件保留方法
利用带头节点单链表储存多项式
(3) 抽象数据类型定义
关键定义多项式系数和指数。系数项用浮点类型定义,指数项用整型定义
(4) 存放结构
采取链式结构,建立链表储存输入多项式
(5) 算法设计
利用链表知识,建立链表,给链表分配一定量存放空间,查找链表,插入链表和链表连接
2.2.2 功效模块设计
一元多项式计算器
建立多项式 多项式相加 多项式相减 多项式相乘
将输入多项式相乘
将输入多项式相减
将输入多项式相加
建立一元多项式
输出一元多项式
图 2-1 功效模块设计
第三章 具体设计
一元多项式计算器关键分为4大部分,多项式建立,多项式加法,多项式减法和多项式乘法。多项式建立关键需要建立新链表,并分配给这个新链表一定量存放空间,分配存放空间内进行运算;多项式加减乘等运算关键利用了链表建立,链表存放空间分配,链表查找,插入和连接进行计算。
3.1 建立多项式
此阶段是多项式建立,能够对计算器进行输入输出等功效。关键利用链表方面知识图 3-1所表示:
开始
PLOY *head,*inpt;
N
X!=0
Y
inpt=(PLOY *)
malloc(sizeof(PLOY))
Return head
结束
图 3-1 多项式建立
关键代码以下:
PLOY *creat(char ch) //建立多项式
{
PLOY *head,*inpt;
float x;
int y;
head=(PLOY *)malloc(sizeof(PLOY));
head->next=NULL;
printf("请输入一元多项式%c:(格式是:系数 指数;以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y);
while(x!=0)
{
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);
printf("请输入一元多项式%c:(以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y);
}
return head;
}
3.2 多项式相加
此阶段是计算器加法利用功效,对你输入多项式进行相加计算,关键利用了链表,及链表插入等知识,图 3-2所表示:
开始
PLOY *inpt;
N
flag==0
Y
N
pre->next==NULL
Y
Flag==1 pre=pre->next
Return head
结束
图 3-2 多项式相加
关键代码以下:
PLOY *addPLOY(PLOY *head,PLOY *pre) //多项式相加
{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}
}
return head;
3.3 多项式相减
此阶段是计算器减法利用功效,对你输入多项式进行相减计算,关键利用了链表,链表查询,及链表插入等知识,图 3-3所表示:
开始
PLOY *inpt;
N
flag==0
Y
N
pre->next==NULL
Y
Flag==1 pre=pre->next
Return head
结束
图 3-3 多项式相减
关键代码以下:
PLOY *minusPLOY(PLOY *head,PLOY *pre) //多项式相减
{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=0-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}
}
return head;
}
3.4 多项式相乘
此阶段是计算器乘法利用功效,对你输入多项式进行相乘计算,关键利用了链表,链表查询,及链表插入等知识,图 3-4所表示:
开始
PLOY *inpt,
*flag,*pre;
N
flag==0
Y
pre-> N
next==NULL
Y
pre=head2
Continue
head1==NULL
Y N
flag==1
continue
pre=pre->next
return res
结束
图 3-4多项式相乘
关键代码以下:
PLOY *byPLOY(PLOY *head1,PLOY *head2) //多项式相乘
{
PLOY *inpt,*res,*pre;
int flag=0;
res=(PLOY *)malloc(sizeof(PLOY));
res->next=NULL;
head1=head1->next;
pre=head2;
while(flag==0)
{
if(pre->next==NULL)
{
pre=head2;
head1=head1->next;
continue;
}
if(head1==NULL)
{
flag=1;
continue;
}
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);
}
return res;
}
3.5 计算器主函数
开始
PLOY *f,*g
N
sign!=0
Y
scanf(“%d”,&sign)
N
sign=0
Y N
sign=1
break
Y
printf(“你选择
操作是多项式 N
相加\n”); sign=2
Y
break printf(“你选择
操作是多项式 N
相减\n”); sign=3
Y
break printf(“你选择
操作是多项式 N
相乘\n”); sign=4
Y printf(“Error!
break sign=-1 请重新输入”);
break break
结束 图 3-5 计算器主函数
关键代码以下:
void main()
{
PLOY *f,*g;
int sign=-1;
start();
while(sign!=0)
{
scanf("%d",&sign);
switch(sign)
{
case 0:
break;
case 1:
{
printf("你选择操作是多项式相加:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("--------------------\n\n");
printf("两个多项式相加结果为:\n\n");
printf(" F(x)=f(x)+g(x)=");
f=addPLOY(f,g);
print(f);
printf("\n--------------------\n");
sign=-1;
start();
break;
}
case 2:
{
printf("你选择操作是多项式相减:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("--------------------\n\n");
printf("两个多项式相减结果为:\n\n");
printf(" F(x)=f(x)-g(x)=");
f=minusPLOY(f,g);
print(f);
printf("\n--------------------\n");
sign=-1;
start();
break;
}
case 3:
{
printf("你选择操作是多项式相乘:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("--------------------\n\n");
printf("两个多项式相乘结果为:\n\n");
printf(" F(x)=f(x)*g(x)=");
f=byPLOY(f,g);
print(f);
printf("\n--------------------\n");
sign=-1;
start();
break;
}
case 4:
{
sign=-1;
start();
break;
}
default:
{
printf("Error!请重新选择操作!\n");
start();
break;
}
}
}
printf(" ***********************\n");
printf(" * 谢谢使用! *\n");
printf(" ***********************\n");
}
第四章 设计结果及分析
4.1 调试和测试
4.1.1 调试
调试过程关键是运行编制好程序,然后碰到错误后依据系统提醒,找到相关问题所在。本系统调试过程中碰到关键问题、原因和处理方法以下面介绍。
(1) cannot open Debug/Cpp1.exe for writing
实施窗口没关闭就修改程序段
关闭实施窗口后从新实施程序。
(2) 系统提醒错误
error C2065: 'addPLOY' : undeclared identifier
addPLOY没有被明确定义。
到程序段里仔细寻求addPLOY,并将其定义。
4.1.2 测试
软件测试是软件生存期中一个关键阶段,是软件质量确保关键步骤从用户角度来看,普遍期望经过软件测试暴露软件中隐藏错误和缺点,所以软件测试应该是“为了发觉错误而实施程序过程”。或说,软件测试应该依据软件开发各阶段规格说明和程序内部结构而精心设计一批测试用例(即输入数据及其预期输出结果),并利用这些测试用例去运行程序,以发觉程序错误或缺点。过分测试则会浪费很多宝贵资源。到测试后期,即使找到了错误,然而付出了过高代价。
测试数据过程以下:
(1) 输入功效测试
输入数据1:2 3 0 0
预期结果:2.000000x^3
运行结果: 2.000000x^3
说明:符合输入要求
输入数据2:a b 0 0
预期结果:a.000000x^b
运行结果:死循环
说明:不符合输入要求
(2) 运算功效测试
输入数据1:2 3 0 0 5 6 0 0
预期结果:2.000000x^3+5.000000x^6
运行结果:2.000000x^3+5.000000x^6
说明:符累计算要求
输入数据2:a b 0 0 c d 0 0
预期结果:a.000000x^b+c.000000x^d
运行结果:死循环
4.2 运行结果
4.2.1 欢迎界面
图 4-1 欢迎界面
4.2.2 多项式加法
图 4-2 多项式加法
4.2.3 多项式减法
图 4-3 多项式减法
4.2.4 多项式乘法
图4-4多项式乘法
4.3 结果分析
经过一段时间设计,我程序大致完成,任务书中所要求实现多项式输入输出、多项式加法、多项式减法全部实现了,而且实现了多项式乘法,但程序还存在部分缺点,比如,无法输入字母计算,无法进行多项连续计算。
总结
数据结构表现是处理问题一个思想,怎样把这种思想表现出来,需要我们对每个方面系统了解。并发觉了很多自己不足,平时没掌握知识在实践中暴露,经过不停思索,查阅书籍和上网查资料及上机运行,处理了大部分问题,还有部分小问题。不过,我相信在以后学习中,一定能把它处理好。当今计算机应用在生活中能够说是无处不在。所以作为二十一世纪大学生来说掌握程序开发技术是十分关键,而C语言又是最常见,功效最强大一个高级语言,所以做好c语言版数据结构课程设计是十分必需。我不仅巩固了数据结构程序设计内容,掌握设计基础方法,强化了上机动手能力,还深入掌握了以下知识:数据类型,链表,结点,分支控制,循环控制,结构体及数组,指针,文件操作,编译预处理等;经过课程设计,掌握了程序局部测试,调试方法,建立程序系统调试,测试基础概念和思想,学会较大程序系统测试和调试方法。当我选择这个多项式计算器系统时,首先系统分析关键思绪和框架哦,和同学讨论,联络所学知识。我知道书上和老师讲有限,所以上网搜也是一个利用资源表现。在编程中,尤其是结构体,指针部分,几乎是一片空白。不过经过几天努力,大致把书本上知识点看了一遍,知识点也基础上掌握了,所以下一步就是开始正式编程序了。当读懂了C语言编程基础过程和方法,经过一波三折,最终开始正式编程。
编译过程中,算法至关关键,多项式加法:系数相同时指数相加,不一样时两项做加法;多项式减法:和加法相差无几,只是把加换成减;多项式乘法:指数相乘,系数相加,当然在设计过程中还要注意部分特殊值,如0,1等。
经过这次课程设计,我感觉到要自己动手真正做出一个程序并不很轻易,但只要用心去做,总会有收获,尤其是当我碰到问题,问老师,问同学,想尽措施去处理,最终最终找到方法时,心里那份喜悦之情真是难以形容.编写程序中碰到问题再所难免,应耐心探究其中原因,从出现问题地方起,并联络前后程序,仔细推敲,逐一排查.直到最终搞清为止。
在课程设计过程中,收获知识,提升能力同时,我也学到了很多人生哲理,知道了怎么去制订计划,怎么去实现这个计划,并掌握了在实施过程中怎样去克服心理上不良情绪。所以在以后生活和学习过程中,我一定把课程设计精神带到生活中,使生活变得愈加好。
参考文件
[1] 谭浩强. C语言程序设计(第三版)[M]. 清华大学出版社, .
[2] 姜敏芝,余健. C语言程序设计案例精编[M]. 清华大学出版社, .
[3] 李健学,余健. 数据结构课程设计案例精编[M]. .
[4] 唐国民,王国均. 数据结构(C语言版)[M]. 北京:清华大学出版社.
[5] 王路明. C语言程序设计教程[M]. 北京:北京邮电大学出版社,5月.
[6] 谭浩强. C++程序设计[M]. 北京:清华大学出版社..
[7] 范策. 算法和数据结构(C语言版)[M]. 北京:机械工业出版社,.
[8] 詹春华,杨沙. C语言程序设计教程[M]. 科学出版社,.8.
[9] 董志民,崔建平,肖利娜. C语言程序设计教学改革探索和实践[J].福建电脑.
附录
#include<stdio.h>
#include<malloc.h>
typedef struct myNode{ //数据结构
float coef; //系数coefficient
int expn; //指数exponent
struct myNode * next;
}PLOY;
void start() //用户选择界面
{
printf(" \n");
printf(" ************************************\n");
printf(" * 欢迎使用一元多项式计算器 *\n");
printf(" ************************************\n");
printf("\n");
printf(" 请选择操作:\n\n");
printf(" 0.退出操作\n");
printf(" 1.一元多项式相加\n");
printf(" 2.一元多项式相减\n");
printf(" 3.一元多项式相乘\n\n");
}
void insert(PLOY *head,PLOY *inpt)
{
PLOY *pre,*now;
int signal=0;
pre=head;
if(pre->next==NULL)
{
pre->next=inpt;
}
else
{
now=pre->next;
while(signal==0)
{
if(inpt->expn<now->expn)
{
if(now->next==NULL)
{
now->next=inpt;
signal=1;
}
else
{
pre=now;
now=pre->next;
}
}
else
if(inpt->expn>now->expn)
{
inpt->next=now;
pre->next=inpt;
signal=1;
}
else
{
now->coef=now->coef+inpt->coef;
signal=1;
free(inpt);
if(now->coef==0)
{
pre->next=now->next;
free(now);
}
}
}
}
}
PLOY *creat(char ch) //建立多项式
{
PLOY *head,*inpt;
float x;
int y;
head=(PLOY *)malloc(sizeof(PLOY));
head->next=NULL;
printf("请输入一元多项式%c:(格式是:系数 指数;以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y);
while(x!=0)
{
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);
printf("请输入一元多项式%c:(以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y);
}
return head;
}
PLOY *addPLOY(PLOY *head,PLOY *pre) //多项式相加
{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}
}
return head;
}
PLOY *minusPLOY(PLOY *head,PLOY *pre) //多项式相减
{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=0-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}
}
return head;
}
PLOY *byPLOY(PLOY *head1,PLOY *head2) //多项式相乘
{
PLOY *inpt,*res,*pre;
int flag=0;
res=(PLOY *)malloc(sizeof(PLOY));
res->next=NULL;
head1=head1->next;
pre=head2;
while(flag==0)
{
if(pre->next==NULL)
{
pre=head2;
head1=head1->next;
continue;
}
if(head1==NULL)
{
flag=1;
continue;
}
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));
inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);
}
return res;
}
void print(PLOY *fun)
{
PLOY *printing;
int flag=0;
printing=fun->next;
if(fun->next==NULL)
{
printf("0\n");
return;
}
while(flag==0)
{
if(printing->coef>0&&fun->next!=printing)
printf("+");
if(printing->coef==1);
else if(printing->coef==-1)
printf("-");
else
printf("%f",printing->coef);
if(printing->expn!=0) printf("x^%d",printing->expn);
else if((printing->coef==1)||(printing->coef==-1))
printf("1");
if(printing->next==NULL)
flag=1;
else
printing=printing->next;
}
printf("\n");
}
void main()
{
PLOY *f,*g;
int sign=-1;
start();
while(sign!=0)
{
scanf("%d",&sign);
switch(sign)
{
case 0:
break;
case 1:
{
printf("你选择操作是多项式相加:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("--------------------\n\n");
printf("两个多项式相加结果为:\n\n");
printf(" F(x)=f(x)+g(x)=");
f=addPLOY(f,g);
print(f);
printf("\n--------------------\n");
sign=-1;
start();
break;
}
case 2:
{
printf("你选择操作是多项式相减:\n");
f=creat('f');
printf("f(x)=");
print(f);
g=creat('g');
printf("g(x)=");
print(g);
printf("--------------------\n\n");
printf("两个多项式相减结果为:\n\n");
printf(" F(x)=f(x)-g(x)=");
展开阅读全文