数据结构课程设计报告含菜单Word格式.docx
《数据结构课程设计报告含菜单Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告含菜单Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3.初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5.培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二.设计任务及要求
根据《算法与数据结构》课程的结构体系,设计一个基于DOS菜单的应用程序。
要利用多级菜单实现各种功能。
比如,主界面是大项,主要是学过的各章的名字诸如线性表、栈与队列、串与数组及广义表等,子菜单这些章中的节或者子节。
要求所有子菜单退出到他的父菜单。
编程实现时,要用到C++的面向对象的功能。
三.需求分析
菜单运用极其广泛,应用于各行各业。
菜单运用起来极其方便。
随着社会的发展,社会的行业出现多样化,也就需要各式各样的菜单。
这就需要设计人员十分精细的设计。
进一步了解《算法与数据结构》课程的知识结构体系,绘制整个课程的知识结构逻辑示意图,类似于:
根据算法与数据及结构的课程安排,可以设计如上所示的菜单。
在主菜单里可以有“线性表”、“栈和队列”、“串、数组、广义表”、“树”、“图”、“查找”、“排序”。
然后要在线性表里创建一个子菜单实现“创建链表”、“插入元素”、“删除元素”、“查找元素”的功能。
并且可以退出这个子菜单回到上一级菜单。
栈和队列创建一个子菜单,包含进制转换和括号匹配的功能。
进制转换里又分为十进制转八进制、十进制转二进制。
串、数组、广义表里可以创建子菜单包含矩阵乘法、矩阵转置的功能。
树里创建子菜单,有树的创建、先序遍历、中序遍历、后序遍历、树的高度、叶子数这几个选项。
这些子菜单都能退出回到上一级菜单。
四.总体设计
设计菜单类
根据实际使用,我们知道菜单类的主要功能就是显示菜单项与响应用户选项。
所以我们可以这样设计一个菜单基类:
classCMenuBase
{
public:
CMenuBase(void);
~CMenuBase(void);
virtualvoidShowMenu()=0;
virtualvoidEvent(intEvenID)=0;
protected:
CMenuBase*m_pParent;
};
根据所绘制的知识结构图,设计DOS菜单。
例如
在此基础上,所有菜单类都继承这个类,以此来实现“显示”与“响应事件”的多态性。
例如,主菜单类的设计为:
classCMainMenu:
publicCMenuBase
CMainMenu(void);
~CMainMenu(void);
virtualvoidShowMenu();
virtualvoidEvent(intEvenID);
和基类基本没有区别。
其实现可以为
voidCMainMenu:
:
ShowMenu(){
cout<
<
"
\n**************《数据结构课程设计》*****************\n"
;
*1线性表2栈与队列3串、数组和广义表*\n"
*4树5图6查找*\n"
*7排序8退出*\n"
***************************************************\n"
}
Event(intEvenID){
CMenuBase*tmp;
switch(EvenID){
caseID_LIST:
SUBMENU(CListMenu)
break;
caseID_STACK_QUEUE:
SUBMENU(CStackMenu)
caseID_EXIT:
MAIN_EXIT=true;
default:
InvalidateAction();
}
注意:
这里的关键是如何进入子菜单,我们用了一个宏命令,例如SUBMENU(CListMenu),其定义为:
#defineSUBMENU(submenu)tmp=pBase;
\
pBase=newsubmenu(tmp);
pBase->
ShowMenu();
通过构造函数,将当前菜单对象作为子菜单的父菜单,以后退出子菜单时,子菜单将将显示权让给其父菜单:
#defineEXIT_SUBMENUtmp=m_pParent;
deletepBase;
pBase=tmp;
这样设计,无论有多少级菜单,其编程风格都是一样的,只需管理当前的菜单交接,而无需知道它是从哪儿来的。
还定义了线性表、栈和队列、数组串和广义表、树等模板类。
线性表的类如下:
classCListMenu:
CListMenu(CMenuBase*);
~CListMenu(void);
voidCreateList_L(intn);
StatusListInsert_L(inti,ElemTypee);
StatusListOut_L();
StatusListDelete_L(inti,ElemType&
e);
StatusGetElem_L(inti,ElemType&
LinkListL;
栈和队列的类如下
classCStackMenu:
charname[20];
CStackMenu(CMenuBase*);
~CStackMenu(void){}
virtualvoidShowMenu();
virtualvoidEvent(intEvenID);
StatusInitStack();
StatusPush(SElemTypee);
StatusPop(SElemType&
voidKuohao();
SqStackS;
进制转换的类定义如下
classCJinzhiMenu:
charname[20];
CJinzhiMenu(CMenuBase*);
~CJinzhiMenu(void){}
voidconversion_8();
voidconversion_2();
StatusInitStack();
StatusPush(JElemTypex);
StatusPop(JElemType&
x);
JSqStacks;
数组的类定义如下:
classCShuzuMenu:
charname[200];
CShuzuMenu(CMenuBase*);
~CShuzuMenu(void){}
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:
CShuMenu(CMenuBase*);
~CShuMenu(void){}
StatussVisit(TElemTypee);
StatussCreateBiTree(BiTree&
T1);
StatussxianOrderTraverse(BiTreeT1);
StatussZhongOrderTraverse(BiTreeT1);
StatussHouOrderTraverse(BiTreeT1);
intDepth(BiTreeT1);
intcountleaf(BiTreeT1);
BiTreeT;
每一级的菜单函数都可以根据以上类的模板来写。
方便且不容易遗漏出错。
五.详细设计与实现
线性表菜单显示如下:
线性链表菜单的设计则可能为
其实现则类似于
CListMenu:
CListMenu(CMenuBase*parent){
m_pParent=parent;
voidCListMenu:
************《线性表》*************\n"
*1创建线性表2插入元素*\n"
*3查找元素4删除元素*\n"
*5浏览6退出*\n"
***********************************\n"
caseID_CREATE_LIST:
cout<
创建几个元素的链表"
cin>
>
n;
list.CreateList_L(n);
当前链表元素为"
endl;
list.ListOut_L();
system("
pause"
);
caseID_LIST_INSERT:
输入插入元素位置"
i;
cout<
请输插入元素的值"
e;
list.ListInsert_L