数据结构与算法应用课程设计.docx

上传人:b****7 文档编号:23863845 上传时间:2023-05-21 格式:DOCX 页数:46 大小:286.06KB
下载 相关 举报
数据结构与算法应用课程设计.docx_第1页
第1页 / 共46页
数据结构与算法应用课程设计.docx_第2页
第2页 / 共46页
数据结构与算法应用课程设计.docx_第3页
第3页 / 共46页
数据结构与算法应用课程设计.docx_第4页
第4页 / 共46页
数据结构与算法应用课程设计.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

数据结构与算法应用课程设计.docx

《数据结构与算法应用课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构与算法应用课程设计.docx(46页珍藏版)》请在冰豆网上搜索。

数据结构与算法应用课程设计.docx

数据结构与算法应用课程设计

数据结构与算法应用综合课程设计要求与指导

数据结构是一门实践性很强的课程,只靠读书和做习题是不能提高实践能力的,尤其是在数据结构中要解决的问题更接近于实际。

所以要求学生在学习过程中,结合实际问题进行相应的课程设计与实践,自己分析问题、设计数据结构和算法,再编写代码上机调试和测试程序,以达到解决实际问题,培养数据结构的应用能力与实践能力。

一、课程设计的要求

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;i

cin>>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;i

infor>>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

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

当前位置:首页 > 初中教育 > 语文

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

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