| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 965 人关注过本帖
标题:求助!!设计一个基于DOS菜单的应用程序
只看楼主 加入收藏
lcpwwj
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-5-25
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:5 
求助!!设计一个基于DOS菜单的应用程序
    设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。内容如下:
1.    无向图的基本操作及应用
    创建无向图的邻接矩阵
    创建无向图的邻接表
    无向图的深度优先遍历
    无向图的广度优先遍历
2.    无向网的基本操作及应用
    创建无向网的邻接矩阵
    创建无向网的邻接表
    求最小生成树
3.    有向图的基本操作及应用
    创建有向图的邻接矩阵
    创建有向图的邻接表
    拓扑排序
4.    有向网的基本操作及应用
    创建有向网的邻接矩阵
    创建有向网的邻接表
    关键路径
    单源最短路径
    每对顶点之间的最短路径
三.设计指导
第一步:根据设计任务,设计DOS菜单。例如
 
选择1之后应该类似于
 

第二步:设计菜单
    void ShowMainMenu()
{
    cout<<"\n";
    cout<<"  ***************图的基本操作及应用******************\n";
    cout<<"  *  1 无向图的基本操作及应用                      *\n";
    cout<<"  *  2 无向网的基本操作及应用                      *\n";
     cout<<"  *  3 有向图的基本操作及应用                      *\n";
    cout<<"  *  4 有向网的基本操作及应用                      *\n";
    cout<<"  *  5 退出                                        *\n";
    cout<<"  ***************************************************\n";
}

void UDG()
{
    MGraph MG;
    ALGraph ALG;
    int n;
    do
    {
        cout<<"\n";
        cout<<"  ***************无向图的基本操作及应用***************\n";
         cout<<"  *  1 创建无向图的邻接矩阵                         *\n";
        cout<<"  *  2 创建无向图的邻接表                           *\n";
         cout<<"  *  3 无向图的深度优先遍历                         *\n";
         cout<<"  *  4 无向图的广度优先遍历                         *\n";
        cout<<"  *  5 退出                                         *\n";
         cout<<"  ****************************************************\n";
        cin>>n;
        switch(n){
            case 1:
                CreatUDG_M(MG);
                break;
            case 2:
                CreatUDG_ALG(ALG);
                dispgraph(ALG);
                break;
            case 3:
                break;
            case 4:
                break;
            default:
                if (n!=5)
                    cout<<"错误,重新输入\n";
        }
    }while(n!=5);
}

void UDN()
{
    MGraph MN;
    ALGraph ALN;
    int n;
    do{
        cout<<"\n";
        cout<<"  ***************无向网的基本操作及应用***************\n";
         cout<<"  *  1 创建无向网的邻接矩阵                         *\n";
        cout<<"  *  2 创建无向网的邻接表                           *\n";
         cout<<"  *  3 prim算法求最小生成树                         *\n";
        cout<<"  *  4 kraskal算法求最小生成树                      *\n";
        cout<<"  *  5 退出                                         *\n";
         cout<<"  ****************************************************\n";
        cin>>n;
        switch(n){
            case 1:
                CreatUDN_M(MN);
                break;
            case 2:
                CreatUDN_ALG(ALN);
                dispgraph_N(ALN);
                break;
            case 3:
                break;
            case 4:
                break;
            default:
                if (n!=5)
                    cout<<"错误,重新输入\n";
        }
    }while(n!=5);
   
}

void DG()
{

    int n;
    do
    {
        cout<<"\n";
        cout<<"  ***************有向图的基本操作及应用***************\n";
         cout<<"  *  1 创建有向图的邻接矩阵                         *\n";
        cout<<"  *  2 创建有向图的邻接表                           *\n";
         cout<<"  *  3 拓扑排序                                     *\n";
        cout<<"  *  4 退出                                         *\n";
         cout<<"  ****************************************************\n";
        cin>>n;
        switch(n){
            case 1:
               
                break;
            case 2:

                break;
            case 3:
                break;
            default:
                if (n!=4)
                    cout<<"错误,重新输入\n";
        }
    }while(n!=4);
}

void DN()
{

    int n;
    do{
        cout<<"\n";
        cout<<"  ***************有向网的基本操作及应用***************\n";
         cout<<"  *  1 创建有向网的邻接矩阵                         *\n";
        cout<<"  *  2 创建有向网的邻接表                           *\n";
         cout<<"  *  3 关键路径                                     *\n";
        cout<<"  *  4 单源顶点最短路径问题                         *\n";
        cout<<"  *  5 每对顶点间最短路径问题                       *\n";
        cout<<"  *  6 退出                                         *\n";
         cout<<"  ****************************************************\n";
        cin>>n;
        switch(n){
            case 1:
                break;
            case 2:
                break;
            case 3:
                break;
            case 4:
                break;
            case 5:
                break;
            default:
                if (n!=6)
                    cout<<"错误,重新输入\n";
        }
    }while(n!=6);
   
}

void main()
{
    int n;
    do{
        ShowMainMenu();
        cin>>n;
        switch(n){
            case 1:
                UDG();
                break;
            case 2:
                UDN();
                break;
            case 3:
                DG();
                break;
            case 4:
                DN();
                break;
            default:
                if (n!=5)
                    cout<<"错误,重新输入\n";
        }
    }while(n!=5);
}
无论多少级菜单,都可以用这种模式实现,并且当前菜单不用担心前面的问题,只需编写当前的功能函数。
第三步:添加功能函数。
对于使用类来做的同学,根据实际使用,我们知道菜单类的主要功能就是显示菜单项与响应用户选项。所以我们可以这样设计一个菜单基类:
class CMenuBase
{
public:
    CMenuBase(void);
    ~CMenuBase(void);
    virtual void ShowMenu()=0;
    virtual void Event(int EvenID)=0;
protected:
    CMenuBase* m_pParent;
};
在此基础上,所有菜单类都继承这个类,以此来实现“显示”与“响应事件”的多态性。例如,主菜单类的设计为:
class CMainMenu:public CMenuBase
{
public:
    CMainMenu(void);
    ~CMainMenu(void);
    virtual void ShowMenu();
    virtual void Event(int EvenID);

};
和基类基本没有区别。其实现可能为
void CMainMenu::ShowMenu(){
    cout<<"\n **************《数据结构课程设计》*****************\n";
    cout<<"  *  1 线性表  2 栈与队列  3 串、数组和广义表       *\n";
    cout<<"  *  4 树      5 图        6 查找                   *\n";
    cout<<"  *  7 排序    8 退出                               *\n";
    cout<<"  ***************************************************\n";
}
void CMainMenu::Event(int EvenID){
    CMenuBase*tmp;
    switch(EvenID){
        case ID_LIST:
            
            break;
        case ID_STACK_QUEUE:
            SUBMENU(CStackAndQueueMenu)
            break;
//…………………
        case ID_EXIT:
            MAIN_EXIT=true;
            break;
        default:
            InvalidateAction();
            break;
    }
}
注意:这里的关键是如何进入子菜单,我们用了一个宏命令,例如SUBMENU(CListMenu),其定义为:
#define SUBMENU(submenu)            tmp=pBase;\
            pBase=new submenu(tmp);\
            pBase->ShowMenu();
通过构造函数,将当前菜单对象作为子菜单的父菜单,以后推出子菜单时,子菜单将将显示权让给其父菜单:
#define EXIT_SUBMENU tmp=m_pParent;\
            delete pBase;\
            pBase=tmp;\
            pBase->ShowMenu();
这样设计,无论有多少级菜单,其编程风格都是一样的,只需管理当前的菜单交接,而无需知道它是从哪儿来的。

搜索更多相关主题的帖子: 应用程序 
2011-06-16 23:01
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:7 
顶一下

命令行程序菜单确实很麻烦

—>〉Sun〈<—
2011-06-16 23:10
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:7 
学习!!!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-06-16 23:15
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
没看懂怎么实现

—>〉Sun〈<—
2011-06-16 23:29
lcpwwj
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-5-25
收藏
得分:0 
就这样,编写程序把这个步骤实现
求助!!设计一个基于DOS菜单的应用程序
    设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。内容如下:
1.    无向图的基本操作及应用
    创建无向图的邻接矩阵
    创建无向图的邻接表
    无向图的深度优先遍历
    无向图的广度优先遍历
2.    无向网的基本操作及应用
    创建无向网的邻接矩阵
    创建无向网的邻接表
    求最小生成树
3.    有向图的基本操作及应用
    创建有向图的邻接矩阵
    创建有向图的邻接表
    拓扑排序
4.    有向网的基本操作及应用
    创建有向网的邻接矩阵
    创建有向网的邻接表
    关键路径
    单源最短路径
    每对顶点之间的最短路径
2011-06-17 14:14
a389326125
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-5-24
收藏
得分:0 
新手求帮忙
2013-06-18 19:33
快速回复:求助!!设计一个基于DOS菜单的应用程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033780 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved