基于DOS菜单的应用程序.docx
- 文档编号:26103266
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:16
- 大小:62.94KB
基于DOS菜单的应用程序.docx
《基于DOS菜单的应用程序.docx》由会员分享,可在线阅读,更多相关《基于DOS菜单的应用程序.docx(16页珍藏版)》请在冰豆网上搜索。
基于DOS菜单的应用程序
算法与数据结构课程设计报告
系(院):
计算机科学学院
专业班级:
计科11005
姓名:
学号:
指导教师:
设计时间:
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< returnOK; } 插入元素: StatusCListMenu: : ListInsert_L(inti,ElemTypee){ LinkListp,s; p=L;intj=0; while(p&&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&&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< 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 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、这是最后,也是最重要的一点,编的程序还不够多,所谓熟能生巧嘛。 综上所述,我还是要好好努力,继续历练的,以提高编程能力目标而继续热情的奋斗! 指导老师意见: 成绩: 教师签名: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DOS 菜单 应用程序