一元多项式计算器完整报告.docx

上传人:b****6 文档编号:4561864 上传时间:2022-12-06 格式:DOCX 页数:35 大小:376.17KB
下载 相关 举报
一元多项式计算器完整报告.docx_第1页
第1页 / 共35页
一元多项式计算器完整报告.docx_第2页
第2页 / 共35页
一元多项式计算器完整报告.docx_第3页
第3页 / 共35页
一元多项式计算器完整报告.docx_第4页
第4页 / 共35页
一元多项式计算器完整报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

一元多项式计算器完整报告.docx

《一元多项式计算器完整报告.docx》由会员分享,可在线阅读,更多相关《一元多项式计算器完整报告.docx(35页珍藏版)》请在冰豆网上搜索。

一元多项式计算器完整报告.docx

一元多项式计算器完整报告

1、课程设计目的

1.1、本次课程设计的主要目的是设计一个一元多项式简单计算器,体会链式存存储结构和顺序存储结构各自的优缺点和适用性;

1.2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

1.3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技

1.4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

1.5、加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。

 

2、课程设计的准备和功能要求

2.1、需求环境

本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:

①硬件要求:

一台计算机。

②软件配置:

windowsXP或windows7、VC++6.0。

 

2.2、目标程序的功能要求

集合链式存储结构和顺序存储结构实现一元多项式计算器的设计,并使该计算器具有以下功能:

1 能够按照多项式变量的指数降序创建一个多项式;

2 能够对已创建的多项式进行显示;

3 能够对已创建的多项式之间的加法运算;

4 能够对已创建的多项式之间的减法运算;

5 能够对已创建的多项式进行删除;

6 能够实现计算器退出操作;

 

2.3、系统总框图

3、课程设计过程

3.1、菜单界面设计

考虑到计算器的操作应具备简易性,我们采取用户和计算机的对话方式执行,即程序运行时,在计算机终端上显示该计算器的功能菜单栏,其中包括对应的选项共用户选择输入;当用户根据选项中的“提示信息”在键盘上输入多项式的项数及各项的系数和指数,然后进行显示、相加运算、相减运算、多项式删除以及计算器退出操作。

如下所示:

 

3.2、菜单选项的实现

对于计算器菜单中各选项的设计处理,我们采用了switch(menu)语句并将各选项前的数字定义为字符型。

然后根据所输入的不同的memu列出对应的6种case分支情况。

3.3、数据类型和数据存储结构的选择

(1)结构体:

当许多项都与某一项相关联时(如本程序:

多项式的项数,项的系数和指数都与某多项式的名称有关联),如果将系数,指数分别定义为互相独立的简单变量,则难以反映他们之间的关系,于是便利用数据结构中的结构体把他们组织成一个组合项,这种方法相当于高级语言的“记录”。

其中,声明一个结构体类型的一般形式为:

typedefstructPolyNode

{

floatcoef;(各项系数)

intexpn;(各项指数)

structPolyNode*next;(各项的后一项所对应的下一项的地址)

};

(2)指针数组:

(顺序存储结构)

考虑到指针数组比较适合用来指向若干个字符串,使字符串处理更加方便更加灵活,因此我们选择用顺序结构的指针数组来描述一个多项式。

分别定义一些多项式头指针而头指针后面可以根据需要创建并接上更多单项,如果想对已经创建的各个头指针进行随机存取,不必改动各头指针的位置,只需改动指针数组中各元素的指向(即改变各元素的值,这些值都是各头指针的首地址)。

这样,各多项式的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花的时间要少得多。

采用自定义类型typedef,同时建立一个新的结构体类型名和结构体指针类型名。

代码表示为:

typedefstructPolyNode

{

floatcoef;

intexpn;

PolyNode*next;

}Poly,*P_Poly;

定义结构体指针数组:

P_PolyPolyHead[26]={0};//定义结构体指针数组,一元多项式的名称

结构体指针数组的应用:

READ_CHAR(name);

printf("*\n");

if(NULL!

=PolyHead[name-'a']){//限制多项式名称只能为26个小写字母之一

printf("*此多项式名不合法!

*\n");

break;

}

(3)线性链表

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这存储单元可以是连续的,也可以是不连续的)。

用线性链表表示线性表的时候,数据元素之间的逻辑关系是由结点中的指针指示的。

也就是说,指针为数据元素中间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求相邻。

考虑到一元多项式的项数不确定性,我们放弃采用顺序结构线性表大量初始化存储单元的方式,而选择线性链表从而能够使设计的程序灵活的对多项式进行加项、减项、删除等操作。

实现代码如下:

for(i=0;i

{

p=(Poly*)malloc(sizeof(Poly));//(创建新链结,添加新单项式)

printf("*请输入第%d项(系数,指数)(输完按空格):

",i+1);

cscanf("%f,%d",&(p->coef),&(p->expn));

printf("*");

printf("");

tail->next=p;

tail=p;

}

3.4、多项式创建功能的设计

(1)多项式创建功能的实现,采用函数:

intCreatPoly(P_Poly*,int);

(2)多项式输出功能的实现,采用函数:

voidOutP_Poly(P_PolyPolyHead)

(3)求多项式和的功能的实现,采用函数:

voidAddPoly(P_Poly*P_PolyHead,P_PolyPolyHead1,P_PolyPolyHead2)

(4)求多项式差的功能的实现,采用函数:

voidDecPoly(P_Poly*P_PolyHead,P_PolyPolyHead1,P_PolyPolyHead2)

(5)删除多项式功能的实现,采用函数:

voidDelPoly(P_Poly*P_PolyHead)

(6)计算器退出操作,实现代码:

case'6':

{

tuichu=1;break;//选择退出***

}

}

if(tuichu==1)break;

}

returnOK;

}

4、程序设计问题的解决

程序设计过程中遇到的*号输入问题

case'1':

{

intn;

printf("*****************************\n");

printf("*请输入要创建的多项式的名称(单个小写字母表示)");

cscanf("%c",&name);

printf("*\n");

if(NULL!

=PolyHead[name-'a'])//限制多项式名称只能为26个小写字母之一

{

printf("*此多项式名不合法!

*\n");

break;

}

printf("*请输入项数(输入数字后按空格):

");

cscanf("%d",&n);

printf("*\n");

if(CreatPoly(&PolyHead[name-'a'],n))

printf("*多项式%c创建完毕!

*\n",name);

printf("*****************************\n");

break;

}

case'2':

{

printf("*****************************\n");

printf("*请输入要输出的多项式的名称:

");

cscanf("%c",&name);

printf("*\n");

printf("*****************************\n");

if(NULL==PolyHead[name-'a'])

{

printf("此多项式不存在!

\n");

break;

}

OutP_Poly(PolyHead[name-'a']);

break;

}

4.1、按照我们的设计方案,该多项式计算器的菜单栏是被我们用多个*号框起来显示的,而同时我们也试图在选定每一个菜单选项后所出现的该选项的下一步输入提示(以及提示后的输入)也会被自动包含在*型框中。

但是如果在出现下一步输入提示后,当代码采用READ(name)替代上文代码中的

cscanf("%c",&name);

输入时,输入后会出现自动换行,而不能将输入数据也包含在*型框中,如:

所以为解决这个问题我们通过网络找到了cscanf函数并改用:

cscanf("%c",&name);

这样上面的问题得到解决。

4.2、但是这样新的问题又出现了。

采用cscanf函数后当执行菜单选项1,创建完成一个多项式后,下一步菜单操作的执行中无论选择那个操作选项,运行操作会自动跳过cscanf操作,而出现乱码输出,但是接下来继续从菜单中选择操作选项后却可以顺利执行出来。

如:

情况一,

 

继续再次操作2却可以顺利进行:

情况二类似:

首先创建好一个多项式后,再创建一个则出现:

总之,问题就是:

只有当创建完第一个多项式后,接下来的第一个操作中的cscanf函数会被跳过,但是继续选择菜单操作则不再出现。

这就是我们一直苦恼的地方。

为了解决这个问题,我们通过资料查找和咨询老师,

最后得出问题的症结在于:

因为宏定义RADE()中的getchar函数是从stdio读数据,而cscanf是从console读数据,混合使用出现了问题。

因而我们通过建立一个新函数:

voidREAD_CHAR(char&c)

{

do{

cscanf("%c",&c);

}while(c=='\n'||c==''||c=='\t');

}

在case2中读入字符的地方都调用函数READ_CHAR(name)代替cscanf("%c",&name);,以去掉空白符。

 

5、调试总结与心得体会

经过半个学期对数据结构的学习,我们对C语言编译调试程序的过程和方法有了更深刻的了解,一个完整的,健壮的程序需要有合理的算法和数据结构作为基础,算法是程序的灵魂,是程序的主线,是实现问题的方法和基本步骤的描述,而一个好的算法的实现要建立在合理熟练的逻辑结构和存储结构上

调试程序之前要对所要编译的程序有个整体的了解,需要用什么样的逻辑结构和存储结构,用什么样的算法去实现。

要重视对结构体变量的运用,因为无论是线形结构还是链式结构都难免用到结构体变量,结构体中要包含所要描述问题的各个数据域和指针域的指向;使用外部变量的时候要注意它的范围是整个函数,使用的时候要考虑到从上一个函数下来之后所带回的值,要小心使用;程序设计中最重要的也是最容易出错的地方是指针,因此要熟练掌握指针的使用方法,对整个程序中指针的指向,什么时候为空,有确切的了解,否则很容易出错,但要是能将指针用好的话程序设计也就简单了许多;关于数组,在调用函数实参时也容易出错,因为在用数组做实参时传递的是数组指针。

要想编译出一个好的程序真不是一件简单的事情,这次的作业又花了我们大量的时间,但是无论是C语言还是数据结构,在学习过程中收获最大的还是最后的大作业,通过大作业,对一些实际操作中算法的描述,数据结构的使用才有了更深一层的了解,同时也积累了一些在解决实际问题中的经验,处理一般的编译,连接错误的方法,并能够一步一步的进行调试,编程的过程确实很辛苦,但是有了成果之后又觉得很轻松。

所以感觉要是投入进去的话编程还不是很难的,只要能够把基础的知识学好,多在操作中练习,多积累些解决实际问题的经验,以后再做这方面的工作就简单多了。

课题设计使得我对这学期所学的专业课有了更为深刻的认识,对于我们来说这不仅仅是一次课程设计,更重要的是使我们明白了在学习的过程中,所有的问题要一个人去面对,有问题要想尽各种办法解决,克服困难,在解决这些困难的过程中提高了我们学习的能力、解决问题的能力和实际工作的能力,学到了许多书本以外的认识。

通过这次课程设计我们觉得我们学习《数据结构》的方法存在一定的弊端,《数据结构》的效果直接影响到我们对其它专业课的学习和今后业务的成长。

我们觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要让我们勤动手,多实践。

最后我们要衷心的感谢所有给予我们帮助和指导的老师和同学,没有他们的帮助我们的课程设计也不会完成得这么顺利!

最后,通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正学以致用,从而提高自己的实际动手能力和独立思考的能力。

而且,编程非常考验人的耐心和信心,这也在性格方面给了我很多磨练。

通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍,可以说是收获不少。

 

参考文献

[1]李春葆.数据结构(C语言版)习题与解析[M].清华大学出版社,2000.5:

47-51

[2]严蔚敏,吴伟民数据结构(C语言版)[M].清华大学出版社2007:

27-63

[3]陈文博,朱青.数据结构与算法[M].机械工业出版社,1996.5:

3:

47-51

[4]李邦几,王敬华.最新C语言实用教程[M].化学工业出版社,1996.3:

66-68

[5]杨明:

数据结构知识点与典型例题解析[M].清华大学出版社,2005.9:

19-76

[6]徐孝凯,魏荣.数据结构[M].机械工业出版社,1996.1:

26-103

[7]陆松年.数据结构教程[M].北京:

科学出版社,2002:

121-124.

[8]苏小红,陈惠鹏,温东新,李秀坤.C语言程序设计教程[M].北京:

电子工业出版社,2004.1(3):

123-133.

 

代码清单:

//一元多项式计算器

#include

#include

#include

#defineOK1;

#defineREAD(I)while((I=getchar())=='\n');//读入合法字符**

typedefintstatus;

typedefstructPolyNode

{

floatcoef;

intexpn;

structPolyNode*next;

}Poly,*P_Poly;

voidREAD_CHAR(char&c)

{

do{

cscanf("%c",&c);

}while(c=='\n'||c==''||c=='\t');

}

statusCreatPoly(P_Poly*,int);//创建多项式链表

voidOutP_Poly(P_Poly);//输出多项式

voidAddPoly(P_Poly*,P_Poly,P_Poly);//求和

voidDecPoly(P_Poly*,P_Poly,P_Poly);//求差

voidDelPoly(P_Poly*);//删除并释放多项式

statusmain()

{

P_PolyPolyHead[26]={0};//定义结构体指针数组,一元多项式的名称

charmenu,name;

inttuichu=0,j;

for(j=0;;j++){

if(j!

=0)printf("\n\n\n再次选择:

\n");

printf("请注意:

为确保其他子函数正常运行,入口参数要求不含同类项、指数递减.\n");

printf("*****************************\n");

printf("*1.建立多项式*\n");

printf("*2.输出多项式*\n");

printf("*3.求两个多项式之和(必须先创建),建立和式并输出*\n");

printf("*4.求两个多项式之差(必须先创建),建立差式并输出*\n");

printf("*5.删除多项式*\n");

printf("*6.退出*\n");

printf("*****************************\n");

printf("请选择指令:

");

READ(menu);

printf("\n");

switch(menu){

case'1':

{

intn;

printf("*****************************\n");

printf("*请输入要创建的多项式的名称(单个小写字母表示)");

cscanf("%c",&name);

printf("*\n");

if(NULL!

=PolyHead[name-'a']){//限制多项式名称只能为26个小写字母之一

printf("*此多项式名不合法!

*\n");

break;

}

printf("*请输入项数(输入数字后按空格):

");

cscanf("%d",&n);

printf("*\n");

if(CreatPoly(&PolyHead[name-'a'],n))

printf("*多项式%c创建完毕!

*\n",name);

printf("*****************************\n");

break;

}

case'2':

{

printf("*****************************\n");

printf("*请输入要输出的多项式的名称:

");

READ_CHAR(name);

printf("*\n");

printf("*****************************\n");

if(NULL==PolyHead[name-'a']){

printf("此多项式不存在!

\n");

break;

}

OutP_Poly(PolyHead[name-'a']);

break;

}

case'3':

{

charname1,name2;

printf("请输入加式一的名称:

");

READ(name1);

if(NULL==PolyHead[name1-'a']){

printf("此多项式不存在!

请先创建\n");

break;

}

printf("请输入加式二的名称:

");

READ(name2);

if(NULL==PolyHead[name2-'a']){

printf("此多项式不存在!

请先创建\n");

break;

}

printf("请输入要创建的和式的名称:

");

READ(name);

if(NULL!

=PolyHead[name-'a']){

printf("此多项式名不合法!

\n");

break;

}

AddPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']);

OutP_Poly(PolyHead[name-'a']);

break;

}

case'4':

{

charname1,name2;

printf("请输入被减式的名称:

");

READ(name1);

if(NULL==PolyHead[name1-'a']){

printf("此多项式不存在!

请先创建\n");

break;

}

printf("请输入减式的名称:

");

READ(name2);

if(NULL==PolyHead[name2-'a']){

printf("此多项式不存在!

请先创建\n");

break;

}

printf("请输入要创建的差式的名称:

");

READ(name);

if(NULL!

=PolyHead[name-'a']){

printf("此多项式已经存在!

\n");

break;

}

DecPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']);

OutP_Poly(PolyHead[name-'a']);

break;

}

case'5':

{

printf("请输入要删除的多项式名称:

");

READ(name);

if(NULL==PolyHead[name-'a']){

printf("此多项式不存在!

\n");

break;

}

DelPoly(&PolyHead[name-'a']);

printf("多项式%c已删除!

\n",name);

break;

}

case'6':

{

tuichu=1;break;//选择退出***

}

}

if(tuichu==1)break;

}

returnOK;

}

//1一元多项式链表创建函数

statusCreatPoly(P_Poly*P_PolyHead,intn)//P_PolyHead是指向指针的指针***

{

//为确保其他子函数正常运行,入口参数要求不含同类项、指数递减****

inti;

P_Polyp,tail;

*P_PolyHead=(Poly*)malloc(sizeof(Poly));

(*P_PolyHead)->expn=n;

tail=*P_PolyHead;

printf("*请按照指数递减序输入最简形式的多项式*\n");

for(i=0;i

{

p=(Poly*)malloc(sizeof(Poly));

printf("*请输入第%d项(系数,指数)(输完按空格):

",i+1);

cscanf("%f,%d",&(p->coef),&(p

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1