




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
No:1、课程设计目的1.1、本次课程设计的主要目的是设计一个一元多项式简单计算器,体会链式存存储结构和顺序存储结构各自的优缺点和适用性;1.2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能 力;1.3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技1.4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;1.5、加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。2、课程设计的准备和功能要求 2.1、需求环境本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:硬件要求:一台计算机。 软件配置:windows XP或windows 7、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)结构体: 当许多项都与某一项相关联时(如本程序:多项式的项数,项的系数和指数都与某多项式的名称有关联),如果将系数,指数分别定义为互相独立的简单变量,则难以反映他们之间的关系,于是便利用数据结构中的结构体把他们组织成一个组合项,这种方法相当于高级语言的“记录”。其中,声明一个结构体类型的一般形式为: typedef struct PolyNode float coef; (各项系数) int expn; (各项指数) struct PolyNode *next;(各项的后一项所对应的下一项的地址) ;(2)指针数组:(顺序存储结构)考虑到指针数组比较适合用来指向若干个字符串,使字符串处理更加方便更加灵活,因此我们选择用顺序结构的指针数组来描述一个多项式。分别定义一些多项式头指针而头指针后面可以根据需要创建并接上更多单项,如果想对已经创建的各个头指针进行随机存取,不必改动各头指针的位置,只需改动指针数组中各元素的指向(即改变各元素的值,这些值都是各头指针的首地址)。这样,各多项式的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花的时间要少得多。采用自定义类型typedef,同时建立一个新的结构体类型名和结构体指针类型名。 代码表示为:typedef struct PolyNode float coef; int expn; PolyNode *next; Poly,*P_Poly; 定义结构体指针数组:P_Poly PolyHead26=0;/定义结构体指针数组,一元多项式的名称结构体指针数组的应用:READ_CHAR(name); printf ( *n); if (NULL!=PolyHeadname-a) /限制多项式名称只能为26个小写字母之一 printf ( * 此多项式名不合法! *n); break; (3)线性链表 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这存储单元可以是连续的,也可以是不连续的)。用线性链表表示线性表的时候,数据元素之间的逻辑关系是由结点中的指针指示的。也就是说,指针为数据元素中间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求相邻。考虑到一元多项式的项数不确定性,我们放弃采用顺序结构线性表大量初始化存储单元的方式,而选择线性链表从而能够使设计的程序灵活的对多项式进行加项、减项、删除等操作。实现代码如下:for (i=0;icoef),&(p-expn); printf ( *); printf ( ); tail-next=p; tail=p; 3.4、多项式创建功能的设计 (1)多项式创建功能的实现,采用函数: int CreatPoly(P_Poly*,int);(2)多项式输出功能的实现,采用函数: void OutP_Poly(P_Poly PolyHead)(3) 求多项式和的功能的实现,采用函数: void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) (4) 求多项式差的功能的实现,采用函数: void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) (5) 删除多项式功能的实现,采用函数: void DelPoly(P_Poly* P_PolyHead) (6) 计算器退出操作,实现代码: case 6: tuichu=1;break; /选择退出* if(tuichu=1)break; return OK;4、程序设计问题的解决 程序设计过程中遇到的*号输入问题case 1: int n; printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); printf ( * 请输入要创建的多项式的名称(单个小写字母表示)); cscanf(%c,&name); printf ( *n); if (NULL!=PolyHeadname-a) /限制多项式名称只能为26个小写字母之一 printf ( * 此多项式名不合法! *n); break; printf ( * 请输入项数(输入数字后按空格):); cscanf (%d,&n); printf ( *n); if(CreatPoly(&PolyHeadname-a,n) printf ( * 多项式%c创建完毕! *n,name); printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); break; case 2: printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); printf ( * 请输入要输出的多项式的名称:); cscanf(%c,&name); printf ( *n); printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); if (NULL=PolyHeadname-a) printf (此多项式不存在!n); break; OutP_Poly(PolyHeadname-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读数据,混合使用出现了问题。因而我们通过建立一个新函数:void READ_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-512 严蔚敏,吴伟民 数据结构(C语言版) M. 清华大学出版社 2007:27-633 陈文博,朱青. 数据结构与算法M. 机械工业出版社,1996.5:3:47-514 李邦几,王敬华. 最新C语言实用教程M. 化学工业出版社,1996.3:66-685 杨明:数据结构知识点与典型例题解析M. 清华大学出版社,2005.9:19-766 徐孝凯,魏荣.数据结构 M. 机械工业出版社, 1996.1:26-1037 陆松年.数据结构教程 M.北京:科学出版社,2002:121-124. 8 苏小红, 陈惠鹏, 温东新,李秀坤C语言程序设计教程M北京:电子工业出版社,20041(3):123-133.代码清单:/一元多项式计算器 #include #include #include #define OK 1; #define READ(I) while (I=getchar()=n); /读入合法字符* typedef int status; typedef struct PolyNode float coef; int expn; struct PolyNode *next; Poly,*P_Poly; void READ_CHAR (char& c) do cscanf(%c,&c); while(c=n | c= | c=t);status CreatPoly(P_Poly*,int); /创建多项式链表 void OutP_Poly(P_Poly); /输出多项式 void AddPoly(P_Poly*,P_Poly,P_Poly); /求和 void DecPoly(P_Poly*,P_Poly,P_Poly); /求差 void DelPoly(P_Poly*); /删除并释放多项式 status main() P_Poly PolyHead26=0;/定义结构体指针数组,一元多项式的名称 char menu,name; int tuichu=0,j; for (j=0;j+) if(j!=0)printf(nnn再次选择: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: int n; printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); printf ( * 请输入要创建的多项式的名称(单个小写字母表示)); cscanf(%c,&name); printf ( *n); if (NULL!=PolyHeadname-a) /限制多项式名称只能为26个小写字母之一 printf ( * 此多项式名不合法! *n); break; printf ( * 请输入项数(输入数字后按空格):); cscanf (%d,&n); printf ( *n); if(CreatPoly(&PolyHeadname-a,n) printf ( * 多项式%c创建完毕! *n,name); printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); break; case 2: printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); printf ( * 请输入要输出的多项式的名称:); READ_CHAR(name); printf ( *n); printf ( * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n); if (NULL=PolyHeadname-a) printf (此多项式不存在!n); break; OutP_Poly(PolyHeadname-a); break; case 3: char name1,name2; printf (请输入加式一的名称:); READ(name1); if (NULL=PolyHeadname1-a) printf (此多项式不存在!请先创建n); break; printf (请输入加式二的名称:); READ(name2); if (NULL=PolyHeadname2-a) printf (此多项式不存在!请先创建n); break; printf (请输入要创建的和式的名称:); READ(name); if (NULL!=PolyHeadname-a) printf (此多项式名不合法!n); break; AddPoly(&PolyHeadname-a,PolyHeadname1-a,PolyHeadname2-a); OutP_Poly(PolyHeadname-a); break; case 4: char name1,name2; printf (请输入被减式的名称:); READ(name1) ; if (NULL=PolyHeadname1-a) printf (此多项式不存在!请先创建n); break; printf (请输入减式的名称:); READ(name2) ; if (NULL=PolyHeadname2-a) printf (此多项式不存在!请先创建n); break; printf (请输入要创建的差式的名称:); READ(name) ; if (NULL!=PolyHeadname-a) printf (此多项式已经存在!n); break; DecPoly(&PolyHeadname-a,PolyHeadname1-a,PolyHeadname2-a); OutP_Poly(PolyHeadname-a); break; case 5: printf (请输入要删除的多项式名称:); READ(name) ; if (NULL=PolyHeadname-a) printf (此多项式不存在!n); break; DelPoly(&PolyHeadname-a); printf (多项式%c已删除!n,name); break; case 6: tuichu=1;break; /选择退出* if(tuichu=1)break; return OK; /1 一元多项式链表创建函数status CreatPoly(P_Poly* P_PolyHead,int n)/ P_PolyHead是指向指针的指针* /为确保其他子函数正常运行,入口参数要求不含同类项、指数递减 * int i; P_Poly p,tail; *P_PolyHead=(Poly*)malloc(sizeof(Poly); (*P_PolyHead)-expn=n; tail=*P_PolyHead; printf ( * 请按照指数递减序输入最简形式的多项式 *n); for (i=0;icoef),&(p-expn); printf ( *); printf ( ); tail-next=p; tail=p; tail-next=NULL; /确定链尾指针 return OK; /2 多项式输出函数void OutP_Poly(P_Poly PolyHead) int i; P_Poly p; printf (n总项数为:%dn ,PolyHead-expn);/链表头数据域* p=PolyHead-next; for (i=0;iexpn;i+) if(i=0) printf (%f*x%d,p-coef,p-expn); else if(p-coef=0) printf (+%f*x%d,p-coef,p-expn); else printf (%f*x%d,p-coef,p-expn); p=p-next; printf (n); /3 求多项式的和的函数void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) int i=0; P_Poly p1,p2,p,tail; p1=PolyHead1-next; p2=PolyHead2-next; *P_PolyHead=(P_Poly)malloc(sizeof(Poly); /给新创建的链表分配动态存储空间做链头 p=tail=*P_PolyHead; while(p1&p2) int e1,e2; e1=p1-expn; e2=p2-expn; if (e1e2) p=(P_Poly)malloc(sizeof(Poly); tail-next=p; tail=p; *p=*p1; p1=p1-next; i+; else if(e1=e2) float sum_c=p1-coef+p2-coef; if (sum_c!=0.0) p=(P_Poly)malloc(sizeof(Poly); tail-next=p; tail=p; p-coef=sum_c; p-expn=e1; i+; p1=p1-next; p2=p2-next; else if (e1next=p; tail=p; *p=*p2; p2=p2-next; i+; while (p1) /将p1中p2多出的想补充道新建多项式链表的后面 p=(Poly*)malloc(sizeof(Poly); *p=*p1; tail-next=p; tail=p; p1=p1-next; i+; while (p2) /将p2中p1多出的想补充道新建多项式链表的后面 p=(Poly*)malloc(sizeof(Poly); *p=*p2; tail-next
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 时机与技术选择在软件开发中的重要性试题及答案
- 进程与线程管理测试题及答案
- 品牌影响力提升的创意方式计划
- 江西省宜春市2025届七年级数学第二学期期末联考模拟试题含解析
- 风险管理与决策制定研究试题及答案
- 年度数字营销策略的制定计划
- 关注学生多元智能发展的教学活动计划
- 组织班级心理健康专题讲座计划
- 2024年陕西省统计局下属事业单位真题
- 有效设置前台文员的工作优先级计划
- 少女乙女的恋爱革命全中文攻略
- 生鲜仓库管理制度
- 施工机具检查评分表
- 患者发生过敏性休克应急预案演练脚本模板
- 南京医科大学招聘考试《综合能力测试》真题及答案
- 《触不可及》影视鉴赏课件
- 中学生交通安全教育公开课一等奖市赛课获奖课件
- “财政大脑”系统集成项目需求
- 二次元影像测量仪作业指导书
- GB/T 679-2002化学试剂乙醇(95%)
- GB/T 6184-20001型全金属六角锁紧螺母
评论
0/150
提交评论