数据结构课程设计报告含菜单doc.docx

上传人:b****7 文档编号:9605281 上传时间:2023-02-05 格式:DOCX 页数:19 大小:181.46KB
下载 相关 举报
数据结构课程设计报告含菜单doc.docx_第1页
第1页 / 共19页
数据结构课程设计报告含菜单doc.docx_第2页
第2页 / 共19页
数据结构课程设计报告含菜单doc.docx_第3页
第3页 / 共19页
数据结构课程设计报告含菜单doc.docx_第4页
第4页 / 共19页
数据结构课程设计报告含菜单doc.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告含菜单doc.docx

《数据结构课程设计报告含菜单doc.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告含菜单doc.docx(19页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告含菜单doc.docx

数据结构课程设计报告含菜单doc

算法与数据结构课程设计报告

系(院):

计算机科学学院

专业班级:

计科11005

姓名:

张林峰

学号:

201003784

指导教师:

詹泽梅

设计时间:

2012.6.11-2012.6.18

设计地点:

12教机房

 

一.设计目的

1.能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。

2.提高程序设计和调试能力。

学生通过上机实习,验证自己设计的算法的正确性。

学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

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

4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

5.培养根据选题需要选择学习书籍,查阅文献资料的自学能力。

二.设计任务及要求

根据《算法与数据结构》课程的结构体系,设计一个基于DOS菜单的应用程序。

要利用多级菜单实现各种功能。

比如,主界面是大项,主要是学过的各章的名字诸如线性表、栈与队列、串与数组及广义表等,子菜单这些章中的节或者子节。

要求所有子菜单退出到他的父菜单。

编程实现时,要用到C++的面向对象的功能。

3.需求分析

菜单运用极其广泛,应用于各行各业。

菜单运用起来极其方便。

随着社会的发展,社会的行业出现多样化,也就需要各式各样的菜单。

这就需要设计人员十分精细的设计。

进一步了解《算法与数据结构》课程的知识结构体系,绘制整个课程的知识结构逻辑示意图,类似于:

 

根据算法与数据及结构的课程安排,可以设计如上所示的菜单。

在主菜单里可以有“线性表”、“栈和队列”、“串、数组、广义表”、“树”、“图”、“查找”、“排序”。

然后要在线性表里创建一个子菜单实现“创建链表”、“插入元素”、“删除元素”、“查找元素”的功能。

并且可以退出这个子菜单回到上一级菜单。

栈和队列创建一个子菜单,包含进制转换和括号匹配的功能。

进制转换里又分为十进制转八进制、十进制转二进制。

串、数组、广义表里可以创建子菜单包含矩阵乘法、矩阵转置的功能。

树里创建子菜单,有树的创建、先序遍历、中序遍历、后序遍历、树的高度、叶子数这几个选项。

这些子菜单都能退出回到上一级菜单。

四.总体设计

设计菜单类

根据实际使用,我们知道菜单类的主要功能就是显示菜单项与响应用户选项。

所以我们可以这样设计一个菜单基类:

classCMenuBase

{

public:

CMenuBase(void);

~CMenuBase(void);

virtualvoidShowMenu()=0;

virtualvoidEvent(intEvenID)=0;

protected:

CMenuBase*m_pParent;

};

根据所绘制的知识结构图,设计DOS菜单。

例如

在此基础上,所有菜单类都继承这个类,以此来实现“显示”与“响应事件”的多态性。

例如,主菜单类的设计为:

classCMainMenu:

publicCMenuBase

{

public:

CMainMenu(void);

~CMainMenu(void);

virtualvoidShowMenu();

virtualvoidEvent(intEvenID);

};

和基类基本没有区别。

其实现可以为

voidCMainMenu:

:

ShowMenu(){

cout<<"\n**************《数据结构课程设计》*****************\n";

cout<<"*1线性表2栈与队列3串、数组和广义表*\n";

cout<<"*4树5图6查找*\n";

cout<<"*7排序8退出*\n";

cout<<"***************************************************\n";

}

voidCMainMenu:

:

Event(intEvenID){

CMenuBase*tmp;

switch(EvenID){

caseID_LIST:

SUBMENU(CListMenu)

break;

caseID_STACK_QUEUE:

SUBMENU(CStackMenu)

break;

caseID_EXIT:

MAIN_EXIT=true;

break;

default:

InvalidateAction();

break;}

}

注意:

这里的关键是如何进入子菜单,我们用了一个宏命令,例如SUBMENU(CListMenu),其定义为:

#defineSUBMENU(submenu)tmp=pBase;\

pBase=newsubmenu(tmp);\

pBase->ShowMenu();

通过构造函数,将当前菜单对象作为子菜单的父菜单,以后退出子菜单时,子菜单将将显示权让给其父菜单:

#defineEXIT_SUBMENUtmp=m_pParent;\

deletepBase;\

pBase=tmp;\

pBase->ShowMenu();

这样设计,无论有多少级菜单,其编程风格都是一样的,只需管理当前的菜单交接,而无需知道它是从哪儿来的。

还定义了线性表、栈和队列、数组串和广义表、树等模板类。

线性表的类如下:

classCListMenu:

publicCMenuBase

{

public:

CListMenu(CMenuBase*);

~CListMenu(void);

virtualvoidShowMenu();

virtualvoidEvent(intEvenID);

protected:

voidCreateList_L(intn);

StatusListInsert_L(inti,ElemTypee);

StatusListOut_L();

StatusListDelete_L(inti,ElemType&e);

StatusGetElem_L(inti,ElemType&e);

LinkListL;};

栈和队列的类如下

classCStackMenu:

publicCMenuBase

{

charname[20];

public:

CStackMenu(CMenuBase*);

~CStackMenu(void){}

virtualvoidShowMenu();

virtualvoidEvent(intEvenID);

protected:

StatusInitStack();

StatusPush(SElemTypee);

StatusPop(SElemType&e);

voidKuohao();SqStackS;};

进制转换的类定义如下

classCJinzhiMenu:

publicCMenuBase

{

charname[20];

public:

CJinzhiMenu(CMenuBase*);

~CJinzhiMenu(void){}

virtualvoidShowMenu();

virtualvoidEvent(intEvenID);

protected:

voidconversion_8();

voidconversion_2();

StatusInitStack();

StatusPush(JElemTypex);

StatusPop(JElemType&x);

JSqStacks;

};

数组的类定义如下:

classCShuzuMenu:

publicCMenuBase

{

charname[200];

public:

CShuzuMenu(CMenuBase*);

~CShuzuMenu(void){}

virtualvoidShowMenu();

virtualvoidEvent(intEvenID);

protected:

StatusCreat_2(RLSMatrix&M,intx,inty);

StatusPutout_2(RLSMatrix&M);

StatusMultSMatrix(RLSMatrix&M,RLSMatrix&N,RLSMatrix&Q);

StatusFastTransposeSMatrix(TSMatrix&M,TSMatrix&T);

voidzhuanzhi();

voidChengfa();

};

树的类定义如下:

classCShuMenu:

publicCMenuBase

{

charname[20];

public:

CShuMenu(CMenuBase*);

~CShuMenu(void){}

virtualvoidShowMenu();

virtualvoidEvent(intEvenID);

protected:

StatussVisit(TElemTypee);

StatussCreateBiTree(BiTree&T1);

StatussxianOrderTraverse(BiTreeT1);

StatussZhongOrderTraverse(BiTreeT1);

StatussHouOrderTraverse(BiTreeT1);

intDepth(BiTreeT1);

intcountleaf(BiTreeT1);

BiTreeT;

};

每一级的菜单函数都可以根据以上类的模板来写。

方便且不容易遗漏出错。

5.详细设计与实现

线性表菜单显示如下:

线性链表菜单的设计则可能为

其实现则类似于

CListMenu:

:

CListMenu(CMenuBase*parent){

m_pParent=parent;

}

 

voidCListMenu:

:

ShowMenu(){

cout<<"************《线性表》*************\n";

cout<<"*1创建线性表2插入元素*\n";

cout<<"*3查找元素4删除元素*\n";

cout<<"*5浏览6退出*\n";

cout<<"***********************************\n";

}

voidCListMenu:

:

Event(intEvenID){

CMenuBase*tmp;

switch(EvenID){

caseID_CREATE_LIST:

cout<<"创建几个元素的链表";cin>>n;

list.CreateList_L(n);

cout<<"当前链表元素为"<

break;

caseID_LIST_INSERT:

cout<<"输入插入元素位置";cin>>i;cout<<"请输插入元素的值";cin>>e;

list.ListInsert_L(i,e);

cout<<"当前链表元素为"<

system("pause");

break;

caseID_LIST_SHOW:

list.ListOut_L();

system("pause");

break;

caseID_LIST_RETURN:

EXIT_SUBMENU

break;

caseID_LIST_DELETE:

cout<<"请输删除元素的位置";cin>>i;

list.ListDelete_L(i,e);

cout<<"当前链表元素为"<

caseID_LIST_FIND:

cout<<"输入查找元素位置";cin>>i;

list.GetElem_L(i,e);system("pause");

break;

default:

InvalidateAction();

break;}

}

线性链表各功能具体实现代码如下:

创建链表:

voidCListMenu:

:

CreateList_L(intn){

inti;

LinkListp;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

for(i=n;i>0;i--){

p=(LinkList)malloc(sizeof(LNode));

cin>>p->data;

p->next=L->next;L->next=p;}

}

界面如下:

查找元素:

StatusCListMenu:

:

GetElem_L(inti,ElemType&e){

intj;

LinkListp;

p=L->next;j=1;

while(p&&j

p=p->next;

j++;}

if(!

p||j>i)returnERROR;

e=p->data;

cout<data<

returnOK;

}

插入元素:

StatusCListMenu:

:

ListInsert_L(inti,ElemTypee){

LinkListp,s;

p=L;intj=0;

while(p&&jnext;++j;}

if(!

p||j>i)return0;

s=(LinkList)malloc(sizeof(LNode));

s->data=e;s->next=p->next;p->next=s;

return1;

}

删除元素:

StatusCListMenu:

:

ListDelete_L(inti,ElemType&e){

LinkListp,q;

intj;

p=L;j=0;

while(p->next&&jnext;j++;}

if(!

(p->next)||j>i-1)return0;

q=p->next;p->next=q->next;e=q->data;free(q);

return1;

}

浏览所有元素:

StatusCListMenu:

:

ListOut_L(){

LinkListp;

p=L->next;

while(p)

{

cout<data<

p=p->next;

}

return0;

}

栈和队列菜单显示界面如下:

栈和队列的菜单设计如下:

其菜单函数为:

voidCStackMenu:

:

ShowMenu(){

system("cls");//清屏

cout<<"************《栈和队列》***************************\n";

cout<<"*1括号匹配2进制转换3迷宫问题4退出*\n";

cout<<"***************************************************\n";

}

CStackMenustack(pBase);

voidCStackMenu:

:

Event(intEvenID){

CMenuBase*tmp;

switch(EvenID){

caseID_KUO_HAO:

stack.Kuohao();system("pause");break;

caseID_JIN_ZHI:

SUBMENU(CJinzhiMenu);break;

caseID_MI_GONG:

cout<<"此小项未完成"<

caseID_STACK_RETURN:

EXIT_SUBMENU

break;

default:

InvalidateAction();break;

}

}

其他项目做法与线性链表类似。

由于字数有限,其他项目功能的具体实现就不一一介绍了。

我们这里定义了一些菜单常量,其定义可以放在一个resource.h文件中:

#defineID_LIST1

#defineID_STACK_QUEUE2

#defineID_STR_ARR_GL3

#defineID_TREE4

#defineID_GRAPH5

#defineID_SEARCH6

#defineID_SORT7

#defineID_EXIT8

#defineID_CREATE_LIST1

#defineID_LIST_INSERT2

#defineID_LIST_FIND3

#defineID_LIST_DELETE4

#defineID_LIST_SHOW5

#defineID_LIST_RETURN6

#defineID_KUO_HAO1

#defineID_JIN_ZHI2

#defineID_MI_GONG3

#defineID_STACK_RETURN4

#defineID_BA1

#defineID_ER2

#defineID_JINZHI_RETURN3

#defineID_CHENG_FA1

#defineID_ZHUAN_ZHI2

#defineID_SHUZU_RETURN3

#defineID_CHUANG_SHU1

#defineID_XIAN2

#defineID_ZHONG3

#defineID_HOU4

#defineID_YE_ZI_SHU5

#defineID_JIAO_HUAN6

#defineID_GAO_DU7

#defineID_SHU_RETURN8

#defineSUBMENU(submenu)tmp=pBase;\

pBase=newsubmenu(tmp);

#defineEXIT_SUBMENUtmp=m_pParent;\

deletepBase;\

pBase=tmp;

voidInvalidateAction();

在主函数中应用菜单对象。

boolMAIN_EXIT;

CMenuBase*pBase;

List*pList;

voidmain()

{

MAIN_EXIT=false;

pBase=newCMainMenu;

pBase->ShowMenu();

intEventID=0;

charCammandLine[255]={0};

while(MAIN_EXIT==false){

cin>>CammandLine;

if(strlen(CammandLine)==0){

cout<<"非法操作,非正常退出\n";

break;

}

EventID=atoi(CammandLine);

pBase->Event(EventID);

}

if(pBase)

deletepBase;

if(pList)

deletepList;

}

在这儿定义了两个全局指针,菜单指针pBase和链表指针pList(要的话还可以添加其他指针)。

 

6.课程设计小节

经过一学期的数据结构课程的学习,我现在编程已经比以前模块化多了,这样既不容易出错,而且出了错也较容易查出,其可读性也加强了。

学会了运用类,知道了继承、多态。

在做数组那个大项时出现了问题,运行处结果了,但同时也弹出了一个debugerror,经过老师的指导,原来是差一个引用字符,也就是要使形参和实参指向同一个字母。

还有树里也出了问题,不能遍历,请教张凡凡同学,也得到了解决,是因为我重复定义了visit。

程序的实用性是很重要的,这就是我的收获。

另外,由于编程的积累,我发现调试程序的速度明显加快了,这是个很好的进步,不过,我编程的速度仍然有待提高,我思考过了,导致慢的原因可能有以下几点:

1、打字速度慢。

(这点的确的克服)

2、算法没有很熟,只是想一想能出来,而远没有应到的境界。

3、编程时精神不能太集中,不过这点一比以前好多了。

4、这是最后,也是最重要的一点,编的程序还不够多,所谓熟能生巧嘛。

综上所述,我还是要好好努力,继续历练的,以提高编程能力目标而继续热情的奋斗!

 

指导老师意见:

 

成绩:

教师签名:

年月日

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

当前位置:首页 > 求职职场 > 简历

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

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