数据结构与算法课程设计.docx
- 文档编号:14468543
- 上传时间:2023-04-23
- 格式:DOCX
- 页数:15
- 大小:19.49KB
数据结构与算法课程设计.docx
《数据结构与算法课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构与算法课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构与算法课程设计
高校LOGO位置
课程设计报告
课程设计题目:
一元多项式的加减计算
学生姓名:
星毅
专业:
自定义
班级:
自定义
指导教师:
邹老师
2015年7月2日
高校名称
课程设计评分表
学生姓名:
星毅班级:
自定义学号:
自定义
课程设计题目:
项目内容
满分
实评
选
题
能结合所学课程知识、有一定的能力训练。
符合选题要求
(5人一题)
10
工作量适中,难易度合理
10
能
力
水
平
能熟练应用所学知识,有一定查阅文献及运用文献资料能力
10
理论依据充分,数据准确,公式推导正确
10
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
10
能体现创造性思维,或有独特见解
10
成
果
质
量
总体设计正确、合理,各项技术指标符合要求。
10
说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰
10
设计说明书栏目齐全、合理,符号统一、编号齐全。
格式、绘图、表格、插图等规范准确,符合国家标准
10
有一定篇幅,字符数不少于5000
10
总分
100
指导教师评语:
指导教师签名:
年月日
课程设计报告要求:
结构要求:
1、问题分析:
要求用自己的话概括出本课题的内容、功能结构
2、结构分析:
根据问题分析的结果,进一步分析出系统的类结构及相互关系
3、实现流程分析:
概述自己的实现过程:
如工程建立流程、类创建流程等
4、个性功能介绍:
应介绍自己在系统中的程序改进与新增的功能模块的意义、价值
5、课程设计小结:
简述自己课程设计的收获
格式要求:
中文正文使用五号字体,英文及代码使用小五号字体
1、问题分析
◆能够按照指数降序排列建立多项式;
◆能够完成两个多项式的相加和相减,并将结果输出。
2、结构分析
这个程序的关键是多项式的创建和排列,相同指数的系数相加、相减时相同指数的系数相减。
由于多项式拥有指数和系数(假设基数已定),所以可以定义一个包含指数系数的结构体,用单链表存储多项式的数据,所以结构体包含next指针。
数据插入时比较两数的指数,按照降序排序,从表头的next开始,直至找到合适的位置,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。
输入完数据后选择计算方式(相加、相减),多项式运算时要循环遍历整个多项式,多项式的每一组数据都要和另一个多项式整组数据相运算(每一个运算值都存储到新建的“多项式”链表中),直到两个多项式都遍历完结束。
3、实现流程分析
●存储结构类型:
单链表。
在模拟多项式对象时,为了简化处理,只取最核心的两个数据:
多项式的系数和指数。
前面提到,要用单链表操作,所以要加上个next指针,再由该结构体定义一个结点类型和指针类型。
具体数据结构定义如下:
typedefstructnode{
intxs;/*系数*/
intzs;/*指数*/
structnode*next;/*next指针*/
}Dnode,*Dnodelist;
●多项式相加的基本过程的算法
Ø链表初始化函数Creat_node()
带有头结点的头指针D指向空(NULL)。
Ø多项式数据的创建函数Creat_Dmeth()
当链表初始化成功后,开始创建多项式。
分别循环输入两个多项式的系数和指数,其中要用到插入函数。
Ø数据的插入函数Insert_node()
当创建多项式时,要用到此函数,即利用插入的方式将多项式的数据连接起来。
再输入一组数据后,程序自动调用此函数,插入时也进行着排序,从表头的next开始,一一比较指数大小,直到大于或等于当前指向的数据或遍历完所有数据时停止,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。
Ø多项式的运算函数:
新建链表存储计算后的多项式
Ø多项式相加Addresult()
创建两个指针分别指向两个多项式表头的next,分别使用两个while函数独自循环,遍历各自的每一组数据,每遍历一次都将系数与指数存储到新建多项式的链表中。
因为存储时利用到插入函数,而插入函数中有相同指数的系数相加功能,所以直接将两个多项式的数据依次插入到新的多项式中即可完成多项式相加。
Ø多项式相减Subresult()
创建两个指针分别指向两个多项式表头的next,以两个指针同时不为空为条件循环遍历,如果当前多项式1的指数小于多项式2,则将当前多项式2的系数置负,指数不变,存入新建多项式中,指向多项式2的指针指向下一个;如果如果当前多项式1的指数大于多项式2,则将当前多项式1的系数指数不变,存入新建多项式中,指向多项式1的指针指向下一个;否则将多项式1的系数减去2的系数后存入新建多项式中,指数不变存入,再将两个指针同时指向下一个。
结束循环后判断是哪一个多项式遍历完了,将未遍历完的多项式剩下的数据全部插入到新建多项式中。
Ø选择运算方式的函数select()
两种选择:
1为相加,2为相减;每一种选择调用相应的运算函数。
Ø多项式的显示函数Show()
从多项式表头的next开始,直到指向空(NULL),将系数与指数一一显示。
Ø主函数main()
创建两个多项式的链表并且初始化,分别调用相应的多项式创建函数,创建成功后选择运算方式,再将运算结果输出显示。
●源程序
#include
#include
typedefstructnode{
intxs;
intzs;
structnode*next;
}Dnode,*Dnodelist;/*定义结构体*/
DnodelistCreat_node(void)/*链表初始化*/
{
DnodelistD;
D=(Dnodelist)malloc(sizeof(Dnode));
if(D)
D->next=NULL;
returnD;
}
intInsert_node(DnodelistD,intxs,intzs)/*插入函数*/
{
Dnodelistp;
Dnodelistq;
Dnodelistr;
p=D;
while(p->next)
{
r=p;
p=p->next;
if(zs==p->zs)/*指数相等,系数直接相加,结束*/
{
p->xs=p->xs+xs;
return1;
}
elseif(zs>p->zs)/*指数大于当前数据的,将数据插入当前数据之前,结束*/
{
q=Creat_node();
q->xs=xs;
q->zs=zs;
r->next=q;
q->next=p;
return1;
}
}/*while(p->next)*/
q=Creat_node();/*要插入的数据指数最小,直接插入至链表最后*/
q->xs=xs;
q->zs=zs;
q->next=p->next;
p->next=q;
return1;
free(p);
free(q);
free(r);
}
DnodelistCreat_Dmeth(intlength)/*创建多项式*/
{
inti,m,n;
DnodelistD;
D=Creat_node();
for(i=0;i { scanf("%d,%d",&m,&n); Insert_node(D,m,n);/*调用插入函数,将输入的系数指数插入链表*/ } returnD; } DnodelistAddresult(DnodelistD1,DnodelistD2)/*多项式相加*/ { DnodelistD; Dnodelistp,q; intx,z; D=Creat_node(); p=D1->next; q=D2->next; while(q) { x=q->xs; z=q->zs; Insert_node(D,x,z); q=q->next; } while(p) { x=p->xs; z=p->zs; Insert_node(D,x,z); p=p->next;/*直接插入数据,利用插入函数可完成该功能*/ } returnD; } DnodelistSubresult(DnodelistD1,DnodelistD2)/*多项式相减*/ { DnodelistD; Dnodelistp,q; intx,z; D=Creat_node(); p=D1->next; q=D2->next; while(p&&q) { if((p->zs)<(q->zs))/*指数小(1的数据在2中不存在),直接插入*/ { x=-(q->xs);/*由于是式1减式2,所以系数置负*/ z=q->zs; Insert_node(D,x,z); q=q->next; } elseif((p->zs)>(q->zs))/*指数大(2的数据在1中不存在),直接插入*/ { x=p->xs; z=p->zs; Insert_node(D,x,z); p=p->next; } else/*指数相同的先将系数相减,再插入*/ { z=q->zs; x=(p->xs)-(q->xs); Insert_node(D,x,z); p=p->next; q=q->next; } }/*while(p&&q)*/ while(p) { x=p->xs; z=p->zs; Insert_node(D,x,z); p=p->next; } while(q) { x=-(q->zs); z=q->zs; Insert_node(D,x,z); q=q->next; }/*将未遍历完的数据直接插入*/ returnD; } Dnodelistselect(DnodelistD1,DnodelistD2)/*选择函数*/ { DnodelistD; ints; printf("\n*****请选择: \n1: 相加\n2: 相减\n"); printf("\n你的选择是: %d: \n",&s); scanf("%d",&s); switch(s) { case1: D=Addresult(D1,D2);/*调用相加函数*/ printf("相加结果(系数,指数): \n"); break; case2: D=Subresult(D1,D2);/*调用相减函数*/ printf("相减结果(系数,指数): \n"); break; default: printf("无此选项\n"); break; } returnD; } voidShow(DnodelistD)/*显示(输出)函数*/ { Dnodelistr; r=D->next; while(r) { printf("\n(%d,%d)+",r->xs,r->zs); r=r->next; } printf("\n"); } voidmain() { DnodelistD1,D2,D; intlength; D1=Creat_node(); D2=Creat_node();/*D1为多项式1,D2为多项式2,初始化*/ printf("格式说明: \n********先输入系数,再输入指数。 \n********系数与指数之间使用英文逗号隔开\n********同一多项式中,子项之间使用空格隔开\n********按下回车键进入下一步\n”); printf("\n输入多项式1的组数: \n”); scanf(“%d”,&length); printf("\n输入多项式1系数,指数: (%d组)\n",length); D1=Creat_Dmeth(length);/*创建多项式1*/ printf("\n输入多项式2的组数: \n”); scanf(“%d”,&length); printf("\n输入多项式2系数,指数: (%d组)\n",length); D2=Creat_Dmeth(length);/*创建多项式2*/ D=select(D1,D2);/*选择运算方式*/ Show(D);/*输出显示*/ printf("\n*****按任意键退出程序*****\n"); } ●测试数据与结果 格式说明: ********先输入系数,再输入指数。 ********系数与指数之间使用英文逗号隔开 ********同一多项式中,子项之间使用空格隔开 ********按下回车键进入下一步 输入多项式1的组数: 2 输入多项式1系数,指数: 1,22,3 输入多项式2的组数: 3 输入多项式2系数,指数: 1,33,23,1 请选择: 1: 相加 2: 相减 你的选择是: 1 相加结果(系数,指数): (3,3)+(4,2)+(3,1)+ *****按任意键退出程序***** Pressanykeytocontince 4、个性功能介绍 相比最初的程序设计,有以下特色 ✧增加了程序运行的格式说明; ✧在源程序中增加了必要的中文注释; ✧增加了退出程序时的中文提示; ✧增加了选择相加/相减函数时,输入错误的提示; ✧增加了选择相加/相减函数时,选择结果的返回; ✧增加了换行字符,使运行界面更宽敞、舒适; ✧增加了多项式组数的自定义功能以及当前输入的多项式组数限制提示; 5、课程设计小结 通过设计这个程序,我对数据结构与算法这门课程的掌握更进一步,对它的程序设计思想也有了进一步的认识。 在设计这个函数的过程中,我修正了各种运行中错误,比如输出结果时出现随机数,后来发现是没有为计算结果的多项式定义空间。 此外,我还增加了输入函数、选择函数和显示(输出)函数,重新排布了功能函数与主函数,使主函数更加简洁美观。 在这次的程序设计中,我对功能函数与主函数的模块排布有了更清晰的认识,对程序运行界面的人性化设计有了更高的追求。 PS: 本页面不是A4版面,如需打印请重新排版
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 课程设计