《程序语言课程设计_一元多项式简单的计算器》
- 格式:doc
- 大小:299.50 KB
- 文档页数:36
西安文理学院软件学院课程设计报告
设计名称:程序语言课程设计
设计题目:一元多项式简单的计算器
学生学号: 1402120135 专业班级:软件学院一班
学生姓名:张文东
学生成绩:
指导教师(职称):袁溪(讲师)
课题工作时间: 2013.12.9 至 2013.12.23
软件学院课程设计任务书
指导教师:院长:
日期:2013年12月9日
软件学院课程设计进度安排表
学生姓名:张文东学号: 1402120135 专业:软件工程班级:一班
指导教师签名:
2013年12月11日
成绩评定表
学生姓名:张文东学号: 1402120135 专业:软件工程班级:一班
摘要
摘要:随着科技的不断发展,人们生活水平的不断提高,方便、高效、快捷成为了人们所追求的主要目标,面对一些复杂的技术总会花费大量时间进行计算,因此有一个多项式功能的计算器是很有必要的。
开发这样一个程序需要用到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)
主要代码如下: (15)
第四章设计结果及分析 (18)
4.1调试与测试 (18)
4.2运行结果 (20)
4.3结果分析 (22)
总结 (23)
参考文献 (24)
附录 (25)
第一章课题背景
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所示:
图 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所示:
图 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所示:
图 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所示:
图 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 计算器主函数
结束图 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]. 清华大学出版社, 2007.
[2] 姜敏芝,余健. C语言程序设计案例精编[M]. 清华大学出版社, 2008.
[3] 李健学,余健. 数据结构课程设计案例精编[M]. 2007.
[4] 唐国民,王国均. 数据结构(C语言版)[M]. 北京:清华大学出版社.
[5] 王路明. C语言程序设计教程[M]. 北京:北京邮电大学出版社,2005年5月.
[6] 谭浩强. C++程序设计[M]. 北京:清华大学出版社.2004.
[7] 范策. 算法与数据结构(C语言版)[M]. 北京:机械工业出版社,2004.
[8] 詹春华,杨沙. C语言程序设计教程[M]. 科学出版社,2011.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)=");
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"); }。