数据结构与算法应用课程设计.docx
《数据结构与算法应用课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构与算法应用课程设计.docx(46页珍藏版)》请在冰豆网上搜索。
![数据结构与算法应用课程设计.docx](https://file1.bdocx.com/fileroot1/2023-5/21/8669eac3-d7a7-4411-b75f-196865a035f5/8669eac3-d7a7-4411-b75f-196865a035f51.gif)
数据结构与算法应用课程设计
数据结构与算法应用综合课程设计要求与指导
数据结构是一门实践性很强的课程,只靠读书和做习题是不能提高实践能力的,尤其是在数据结构中要解决的问题更接近于实际。
所以要求学生在学习过程中,结合实际问题进行相应的课程设计与实践,自己分析问题、设计数据结构和算法,再编写代码上机调试和测试程序,以达到解决实际问题,培养数据结构的应用能力与实践能力。
一、课程设计的要求
1、熟练掌握各种数据结构的逻辑结构特性、存储结构与常用操作算法;
2、能分析课程设计的相应题目,结合理论学习考虑用一种或多种数据结构来解决问题;
3、能分析并设计在某种数据结构下解决问题的步骤即算法;
4、熟练掌握面向对象程序设计思想方法与编译系统的使用方法,能较好地编写程序实现数据结构与算法,解决实际问题
5、能较好地进行程序的静态检查与动态调试与测试
6、能按要求写好课程设计报告
二、课程设计的目的
1、深入理解和掌握书本上的理论知识,将书本上的知识变“活”
2、理论与实践相结合,学会如何把书本上的数据结构和算法的知识用于解决实际问题,培养数据结构的应用能力和软件工程所需要的实践能力
3、进行软件工作的规范训练,初次体会软件开发的一般简单过程
4、培养团队合作精神和良好的科学作风以及沟通能力
三、课程设计的工作步骤
1、明确课程设计小组构成与分工
每一小组由2人组成,各同学可自由组合。
每小组选择后面课程设计备选题目中的一个,共同完成问题分析和任务定义、数据类型和系统设计后,2人协商分工进行程序设计与调试。
每个同学必须有明确而又互不相同的工作任务,并保证工作量一致。
在课程设计中还要注意两人的协调与合作。
2、问题分析和任务定义
首先充分分析和理解问题,明确问题要求做什么,限制条件是什么,即明确“做什么”。
如:
输入数据的类型、值的范围以及输入的形式;输出数据的类型、值的范围及输出的形式;若是会话式的输入,则结束标志是什么,是否接受非法的输入,对非法输入的回答方式是什么等等
2、数据类型和系统设计
1)逻辑设计:
对问题描述中涉及的操作对象定义相应的数据类型,并定义主程序模块和各抽象数据类型,画出模块之间调用关系图
2)详细设计:
定义相应的存储结构(写出数据存储结构的类型定义)并写出各过程和函数的算法
3、3、编码实现和静态检查
1)编码实现:
把算法设计的结果用程序设计语言程序写出来。
每个函数体,即不计首部和规格说明部分,一般不要超过40行,最长不得超过60行,否则应分成更小的函数。
要控制IF语句连续嵌套的深度。
首先可以在一个程序文件中实现,然后做成头文件形式的软件模块,随着工作的积累,这些成熟的软件模块也会越来越丰富,当常用的数据结构都以抽象数据类型的形式实现以后,其他问题编程的工作也就会比较顺手了。
抽象数据类型的实现作为头文件必须包含进工程文件。
2)静态检查:
通过阅读或给别人讲解自己的程序深入全面理解程序逻辑,检查是否有明显错误,加入一些注释。
可用简单的数据试人工运行程序,此时数据规模应比较小,而且考虑到各种情况,如空表、空二叉树、一个结点二叉树、两个结点二叉树等各种情况。
应访遍程序的各条路径(即各分支的情况)。
通过静态检查程序由于疏漏而产生的错误,也可为接下去的动态调试找到一种“程序感觉”
4、上机准备和上机调试
首先,应熟悉MicrosoftVisualC++5.0/6.0的开发环境。
在运行时可能发生以下三种类型的错误:
语法错误、连接错误、运行错误
前两种错误一般由系统提示指出,一般按语言的语法和系统的环境要求加以改正即可。
第三种错误与算法和程序有关,大致又有两种情况:
一种是因为存储结构使用不当引起的,例如最常见的无效指针和数组下标越界等;另一种是纯粹的逻辑性错误,如程序不能正常终止、输出与问题的要求有出入等,在很大程度上是由于控制条件考虑不周所至。
这类错误是初学数据结构编程者最易犯的毛病,而当运行出现这类错误时又往往感到束手无策。
为了从程序中忙地排除这类错误,首要是能对错误的出处准确定位,常用的简便办法是利用集成环境提供的Debug功能加以定位。
在程序中适当位置临时加入一些反映调试信息的输出语句,以此来反映动态运行善有时也比较有效。
调试中出现的警告性提示,也不能轻易放过,必须究其原因排除之。
对某一组数据运行成功,并不意味程序正确。
在进行整个程序的联调时,要特别注意对多组数据模型进行试验,并分别选择几种具有一般性和特殊性的数据进行调试,用测试数据(包括正确的数据和错误的数据)测试程序是否能得到正确结果,程序健壮性(容错处理)怎样等?
因为本材料不是讲解MicrosoftVisualC++的专门手册性读物,有关VisualC++本身的知识内容的讲解,请读者参考相关的书籍。
可带一本C++程序设计教材或VisualC++操作手册,进行调试。
5、总结和整理课程设计报告
课程设计报告应包括以下几部分内容
1)题目、姓名、学号、完成日期,见封面附件
2)问题描述
包括题目内容,基本要求,测试数据
3)需求分析:
▪输入的形式和输入值的范围
▪输出的形式
▪程序所能达到的功能
▪测试数据要求
4)概要设计:
抽象数据类型的定义,各程序模块之间的调用关系,各类之间的继承关系
5)详细设计
定义所有类,写出每个操作的算法,主程序也可按需要写出算法,函数调用关系图
6)调试分析:
▪遇到的问题及解决的方法
▪经验与体会
7)用户使用说明
简单说明怎样使用你的程序,特别是对使用中应注意的问题加以说明
8)测试结果:
列出输入输出结果
附录:
源程序
本示例中的分析、描述与实现均是在以C语言的形式,用到了C++对C的扩展,代码是在VC++6.0中调试成功的。
有些同学反映主程序不会写,大家可在示例程序中了解简单主程序的写法,并在这里通过两个例子体会主函数如何调用各模块,从而统一协调地完成要求的。
需要强调的是决不是仅有此一种方法,事实上,在主函数中常作的类似的事情都还可以在主程序中写成其他函数,以让主函数所作的主要工作能更清晰。
9)总结:
详细注明小组中每位同学负责的工作、课程设计过程的收获、遇到问题以及解决问题的思路和方法、程序调试能力的思考、对数据结构这门课程的思考、在课程设计过程中对《数据结构》课程的认识等内容
10)附录:
将程序清单及程序附上
四、评分办法:
课程设计成绩=上机考勤10%+程序及其调试40%(程序的规范性10%、功能实现情况20%、程序调试能力10%)+设计报告质量50%(流程规范15%,设计合理15%,报告撰写15%,分工合理5%)
程序的规范:
应养成良好的程序书写规范,需要注意:
注释,命名规则,格式等。
源代码作为设计报告附件提交。
流程规范性:
报告中显示出来的设计过程按规范的步骤进行:
问题分析、系统设计、代码编写、测试与调试,每个步骤均在报告中描述清楚。
设计合理性:
在查询参考文献、问题分析的基础上,认真完成系统的设计,模块设计合理、数据类型设计合理、类的设计合理、算法设计合理
报告撰写:
认真书写设计报告,要求:
逻辑合理、内容翔实、格式规范、排版工整、语句通顺。
无设计报告者以及严重抄袭他人设计者,成绩为不及格。
五、课程设计报告示例:
本材料以一个简单的题目来说明课程设计报告的格式与内容,每一个题目都不同,每个同学课程设计后的心得体会与收获与不同,请注意准确完整地描述课程设计的步骤与成果。
数据结构课程设计报告
封面(见封面模板)
一、问题描述
1、题目内容:
利用链表表示家电信息,实现链表的初始化、创建表、插入、删除、更新数据、打印、查询以及链式结构的有序表与文件之间的数据转换。
2、基本要求:
由用户输入一组数据包括家电名称、品牌型号、单价、及数量,以结点中单价值的非减序列体现着有序性。
3、测试数据:
链表初始数据为{{彩电、TCL超平29英寸、2100元、234台},{冰箱、海尔、1800元、302台},{洗衣机、小鸭、1200元、105台}}
二、需求分析
1、本程序用以实现家电信息的初始化、创建表、插入、删除、更新数据、打印、查询以及有序表与文件之间的数据转换。
2、程序运行后显示提示信息,由用户输入家电相关信息来创建有序链表。
3、在创建好后,用户可根据需要选择所要的操作。
4、数据信息应包含家电名称、品牌型号、单价、及数量。
三、概要设计
为实现上述程序功能,应以有序链表表示家电信息。
为此需要有序表和结构体两个抽象数据类型。
1、结构体的抽象数据类型定义为:
ADTgoods{
数据对象:
d={charname[10];
charsname[10];
intprice;
intnum;
}ADTgoods
2、有序表的抽象数据类型定义为:
ADTOrderedList{
lnode*listcreate_l(goods*a,intn)
初始条件:
运行结果:
}ADTOrderedList
数据关系:
同属于一个结点
基本操作:
lnode*listcreate_l(goods*a,intn)
操作结果:
构造一个有序链表。
node*listinsert_l(lnode*l,goodsa)
初始条件:
有序链表已经存在。
操作结果:
插入一个结点,此结点信息为a。
lnode*listdelete_l(lnode*l,goodse)
初始条件:
有序链表已经存在。
操作结果:
删除e结点。
lnode*listchange_l(lnode*l,goodse)
初始条件:
有序链表已经存在。
操作结果:
用e的信息更换有序表中与e同名的结点的信息。
voidlistsearch_l(lnode*l,char*sname)
初始条件:
有序链表已经存在。
操作结果:
查询结点中名为sname的结点的相关信息。
voidlisttraverse_l(lnode*l)
初始条件:
有序链表已经存在。
操作结果:
打印有序链表中的信息。
}
3、本程序包含三个模块:
主程序模块:
进行简要说明
结构体模块:
进行简要说明
有序表模块:
进行简要说明
模块之间的关系如图所示:
(加一模块结构图)
四、详细设计
1、元素类型、结点类型、指针类型。
typedefstruct{
charname[20];
charsname[20];
intprice;
intnum;
}goods;
2、有序表类型。
typedefstructlnode{
goodsdata;
structlnode*next;
}lnode,*linklist;
部分操作实现的伪代码算法如下:
1)lnode*listcreate_l(goods*a,intn)
{
for(intk=0;k{
for(intj=0;j{
if(a[j].price{goodsb;
strcpy(b.name,a[j].name);
strcpy(b.sname,a[j].sname);
b.price=a[j].price;
b.num=a[j].num;
strcpy(a[j].name,a[j+1].name);
strcpy(a[j].sname,a[j+1].sname);
a[j].price=a[j+1].price;
a[j].num=a[j+1].num;
strcpy(a[j+1].name,b.name);
strcpy(a[j+1].sname,b.sname);
a[j+1].price=b.price;
a[j+1].num=b.num;
}//if
}//for
}//倒用起泡法对结构体数组以price为关键字进行排序
lnode*l=NULL;
lnode*s;
for(inti=0;i{
s=newlnode;
strcpy(s->data.name,a[i].name);
strcpy(s->data.sname,a[i].sname);
s->data.price=a[i].price;
s->data.num=a[i].num;
s->next=l;l=s;
}returnl;//创建链表并返回头指针
}//listcreate_l()
2)lnode*listinsert_l(lnode*l,goodsa)
{
lnode*q=l;
lnode*r=l;
lnode*p=newlnode;
strcpy(p->data.name,a.name);
strcpy(p->data.sname,a.sname);
p->data.price=a.price;
p->data.num=a.num;//把goods结构体的内容复制给结点指针p
while(a.price>q->data.price&&q)
{
r=q;
q=q->next;
}
if(q==l)
{p->next=l;l=p;}//p插在头结点之前
else
{
if(q==NULL){r->next=p;p->next=NULL;}//p插在最后一个结点后面
else{r->next=p;p->next=q;}//p插在中间的一般情况
}
returnl;
}//listinsert_l()
3)lnode*listdelete_l(lnode*l,goodse)
{
lnode*p=l;
lnode*r=l;
while(strcmp(p->data.sname,e.sname)&&p)
{
r=p;
p=p->next;
}
if(p==l)
l=p->next;//删除结点为头结点
else
{
if(p->next==NULL)r->next=NULL;//删除结点为最后一个结点
elser->next=p->next;//删除结点为一般情形
}
if(!
p)cout<<"删除项目不在产品信息中,请确认后在输入,谢谢!
"<returnl;
}//listdelete_l()
4)lnode*listchange_l(lnode*l,goodse)
{
lnode*p=l;
while(p&&(strcmp(e.sname,p->data.sname)))
{
p=p->next;
}
if(p)
{
strcpy(p->data.name,e.name);
strcpy(p->data.sname,e.sname);
p->data.price=e.price;
p->data.num=e.num;
}//用e的信息替换结点p的信息
elsecout<<"更新信息与产品信息中的所有规格都不匹配,确认后在输入,谢谢!
"<;
returnl;
}//listchange_l()
5)voidlistsearch_l(lnode*l,char*sname)
{
lnode*p=l;
while(strcmp(sname,p->data.sname))
p=p->next;
cout<data.name<<""<data.sname<<""
<data.price<<""<data.num<}//listsearch_l()查询信息
6)voidlisttraverse_l(lnode*l)
{
ofstreaminf("d:
\\information.txt");
inti=0;
lnode*p=l;
while(p)
{
p=p->next;
i++;
}//用i记录产品总类个数
inf<
while(l)
{
cout<data.name<<""<data.sname<<""<data.price<<"yuan"
<data.num<<"台"<inf<data.name<<""<data.sname<<""<data.price<<""
<data.num<<""<l=l->next;//打开d:
\information并从中写入信息
}
}//listtraverse_l()打印信息
4、主函数的算法:
voidmain()
{
cout<<"进入程序请按1,退出请按0"<intm;
cin>>m;
while(m)
{
cout<<"创建请按1;其它操作请按2"<intn;cin>>n;
switch(n)
{
case1:
{
cout<<"请输入产品种类数量和相关信息:
"<intn;goods*a;
cin>>n;
a=newgoods[n];
for(inti=0;icin>>a[i].name>>a[i].sname
>>a[i].price>>a[i].num;
lnode*l;
l=listcreate_l(a,n);
listtraverse_l(l);break;
}
case2:
{
cout<<"插入请按3;删除请按4;更新请按5;查询请按6;打印请按7."<ifstreaminfor("d:
\\information.txt");
intn;goods*a;
infor>>n;
a=newgoods[n];
for(inti=0;iinfor>>a[i].name>>a[i].sname
>>a[i].price>>a[i].num;//利用文件流创建文件流对象以读方式
lnode*l;//打开d:
\information并从中读入信息
l=listcreate_l(a,n);
intj;
cin>>j;
switch(j)
{
case3:
{
cout<<"请输入要插入产品的相关信息:
"<goodsm;cin>>m.name>>m.sname>>m.price>>m.num;
lnode*p=listinsert_l(l,m);listtraverse_l(p);break;
}
case4:
{
cout<<"请输入要删除项目的相关信息:
"<goodsm;cin>>m.name>>m.sname>>m.price>>m.num;
lnode*p=listdelete_l(l,m);listtraverse_l(p);break;
}
case5:
{
cout<<"请输入要更改项目的相关信息:
"<goodsm;cin>>m.name>>m.sname>>m.price>>m.num;
lnode*p=listchange_l(l,m);listtraverse_l(p);break;
}
case6:
{
cout<<"请输入要查询项目的名称:
"<charm[20];cin>>m;listsearch_l(l,m);break;
}
case7:
{
cout<<"公司库存产品相关信息如下:
"<break;
}
}//switch()
}//switch()
}//while()
cout<<"进入程序请按1,退出请按0"<cin>>m;
}
cout<<"查看最新产品信息请到d:
\\information
(2)."<}//main()
五、调试分析:
调试过程中经常出现运行时出现错误提示而没有结果的情况,经检查是指针处理的问题
六、使用说明
程序运行后用户根据提示信息输入产品信息,按照提示运行就可以了。
七、测试结果
所采用的测试数据和测试结果如下:
进入程序请按1,退出请按0
1
创建请按1;其它操作请按2
1
请输入产品种类数量和相关信息:
3
冰箱海尔1800302
彩电TCL超平29英寸2100234
洗衣机小鸭1200105
此是d盘的information的内容为:
3
洗衣机小鸭1200yuan105台
洗衣机小鸭1200105
冰箱海尔1800yuan302台
冰箱海尔1800302
彩电TCL超平29英寸2100yuan234台
彩电TCL超平29英寸2100234
进入程序请按1,退出请按0
1
创建请按1;其它操作请按2
2
插入请按3;删除请按4;更新请按5;查询请按6;打印请按7.
3
请输入要插入产品的相关信息:
DVD康佳1350169
此是d盘的information的内容为:
4
洗衣机小鸭1200yuan105台
洗衣机小鸭1200105
DVD康佳1350yuan169台
DVD康佳1350169
冰箱海尔1800yuan302台
冰箱海尔1800302
彩电TCL超平29英寸2100yuan234台
彩电TCL超平29英寸2100234
进入程序请按1,退出请按0
1
创建请按1;其它操作请按2
2
插入请按3;删除请按4;更新请按5;查询请按6;打印请按7.
4
请输入要删除项目的相关信息:
DVD康佳1350169
此是d盘的information的内容为:
3
洗衣机小鸭1200yuan105台
洗衣机小鸭1200105
冰箱海尔1800yuan302台
冰箱海尔1800302
彩电TCL超平29英寸2100yuan234台
彩电TCL超平29英寸2100234
进入程序请按1,退出请按0
1
创建请按1;其它操作请按2
2
插入请按3;删除请按4;更新请按5;查询请按6;打印请按7.
5
请输入要更改项目的相关信息:
彩电TCL超平29英寸2000153
此是d盘的info