精华内容
下载资源
问答
  • 微信配置VIEW类型的菜单,点击菜单,直接进入三方系统
  • 菜单管理系统

    2017-12-17 18:51:10
    前台采用jspjs技术,展示菜单餐桌订单,后台可以进行菜单的管理,订单的管理以及菜种的管理
  • 对后台框架AdminLTE-2.3.0进行改造,可以从后端动态加载系统菜单,后端只需要提供菜单列表的json数据即可。
  • Android 系统菜单与自定义菜单

    热门讨论 2012-07-25 16:28:02
    简单实用的Android系统菜单与自定义菜单的实现方法,并对菜单的调用机制进行了全面验证。 开发环境:XP3+Eclipse+Android2.2+JDK6.0 测试环境:Android2.2模拟器
  • 按钮资源使用的是自定义标签进行显示或隐藏的!我用的是mysql数据库,我也把数据库导出,方便网友操作查看效果图! 我这个项目有缺点就是权限按钮时,我把它放进了session,方便取出,没有放进缓存! 亲爱的网友们,...
  • C++习题(系统菜单设计)

    千次阅读 多人点赞 2021-02-13 11:22:15
    根据“实践项目1、2“Q题的内容进入实质性设计内容如下: 1、现有学生信息包含三部分:学号(10位数字组成的字符串)、姓名(10位英文字母组成的字符串)、成绩(0~100整数)。 2、按照功能菜单对应的功能完成一个班...

    题目1:

    系统菜单的设计
    界面要求:
    1、 要求每次进入各级菜单时清屏
    2、 “主菜单”标题:学生信息管理系统
    3、 以“主菜单”形式显示内容

    a) “1.学生信息增加”

    b) “2.学生信息显示”

    c) “3.学生信息查找”

    d) “4.学生信息修改”

    e) “5.学生信息删除”

    f) “0.退出”

    4、 选择操作上述菜单项时进入相应“二级菜单”功能界面,界面要求

    a) 清屏

    b) 标题:“学生信息XX”

    c) 显示“该功能未实现,按任意键返回上一级。”

    d) 按任意键返回到主菜单,主菜单显示要求按3要求。

    5、 在“主菜单”界面时,按0键结束程序。

    对于该菜单的实现比较简单,这里小编只提供一些思路。首先我们要将基本的菜单内容输出出来:
    只需要代码:

       printf("1.学生信息增加\n\n2.学生信息显示\n\n3.学生信息查找\n\n4.学生信息修改\n\n5.学生信息删除\n\n0.退出\n");
    

    即可。
    接下来是进行菜单选项,这一功能的实现需要我们用条件判断语句实现。但如果使用if语句会使代码量增加并且变得繁琐。所以我们可以改用switch语句进行操作。如这样:

           int a;
           cin>>a;
            switch(a)
            {
            case 1:
                printf("学生信息增加\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 2:
                printf("学生信息显示\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 3:
                printf("学生信息查找\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 4:
                printf("学生信息修改\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 5:
                printf("学生信息删除\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 0:
    			printf("退出");
            }
    

    这里要注意,如果在每个判断语句结尾处不加break的话会使程序继续向下读取,如在case 1:语句结尾不加break的话,那么在输出完“学生信息增加\n该功能未实现,按任意键返回上一级。\n”内容后还会继续输出“学生信息显示\n该功能未实现,按任意键返回上一级。”直到遇到break或末尾处才会结束。switch语句的功能其实类似于goto,只是将程序立刻带到标记处,而这里我们采用case的形式来标记。

    为了让程序不断的运行,直到我们选择的退出选项才终止,我们可以将程序放入循环中如:

    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #include<conio.h>
    using namespace std;
    int main()
    {
        int a;
        while(a!=0)
        {
            printf("1.学生信息增加\n\n2.学生信息显示\n\n3.学生信息查找\n\n4.学生信息修改\n\n5.学生信息删除\n\n0.退出\n");
            cin>>a;
            switch(a)
            {
            case 1:
                printf("学生信息增加\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 2:
                printf("学生信息显示\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 3:
                printf("学生信息查找\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 4:
                printf("学生信息修改\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 5:
                printf("学生信息删除\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 0:
                printf("退出");
    
            }
        }
        return 0;
    }
    

    但这样的循环会出现问题:
    变量a我们是在循环外面定义的,而输入却是在循环中,也就是说初始化的变量a是随机值,这就有种可能,即我们还没输入循环就结束了。这样的菜单显然是失败的。那么为了解决这个问题我们需要使用do-while循环:

    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #include<conio.h>
    using namespace std;
    int main()
    {
        int a;
        do
        {
            printf("1.学生信息增加\n\n2.学生信息显示\n\n3.学生信息查找\n\n4.学生信息修改\n\n5.学生信息删除\n\n0.退出\n");
            cin>>a;
            switch(a)
            {
            case 1:
                printf("学生信息增加\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 2:
                printf("学生信息显示\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 3:
                printf("学生信息查找\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 4:
                printf("学生信息修改\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 5:
                printf("学生信息删除\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 0:
                printf("退出");
    
            }
        }while(a!=0);
        return 0;
    }
    

    这样无论如何程序都会将循环中的内容执行一次,就解决了上述问题。
    但是现在这个菜单还有很多缺点,如:在输入菜单选项后选项中内容会在菜单下面显示,而不是出现一个新画面
    在这里插入图片描述
    这样会使画面很杂乱,所以还需要加上我们之前说过的清屏程序:

    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #include<conio.h>
    using namespace std;
    int main()
    {
        int a;
        do
        {
            system("cls");
            printf("1.学生信息增加\n\n2.学生信息显示\n\n3.学生信息查找\n\n4.学生信息修改\n\n5.学生信息删除\n\n0.退出\n");
            cin>>a;
            switch(a)
            {
            case 1:
                system("cls");
                printf("学生信息增加\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 2:
                system("cls");
                printf("学生信息显示\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 3:
                system("cls");
                printf("学生信息查找\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 4:
                system("cls");
                printf("学生信息修改\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 5:
                system("cls");
                printf("学生信息删除\n该功能未实现,按任意键返回上一级。\n");
                break;
            case 0:
                system("cls");
    
            }
        }while(a!=0);
        return 0;
    }
    
    

    好了,加上了system(“cls”);程序后又出现了新问题:在我们选择了菜单选项后会发现屏闪了一下又恢复了原来界面。这正是清屏程序造成的。我们现在需要让画面在菜单选项后的界面停滞,当我们输入任意键后再返回。只需要加上getch()即可,该程序即解决了需要停滞的问题,又解决了输入任意键返回上一级的问题。最终完整代码如下:

    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #include<conio.h>
    using namespace std;
    int main()
    {
        int a;
        char t;
        do
        {
            system("cls");
            printf("1.学生信息增加\n\n2.学生信息显示\n\n3.学生信息查找\n\n4.学生信息修改\n\n5.学生信息删除\n\n0.退出\n");
            scanf("%d",&a);
            switch(a)
            {
            case 1:
                system("cls");
                printf("学生信息增加\n该功能未实现,按任意键返回上一级。\n");
                t=getch();
                break;
            case 2:
                system("cls");
                printf("学生信息显示\n该功能未实现,按任意键返回上一级。\n");
                t=getch();
                break;
            case 3:
                system("cls");
                printf("学生信息查找\n该功能未实现,按任意键返回上一级。\n");
                t=getch();
                break;
            case 4:
                system("cls");
                printf("学生信息修改\n该功能未实现,按任意键返回上一级。\n");
                t=getch();
                break;
            case 5:
                system("cls");
                printf("学生信息删除\n该功能未实现,按任意键返回上一级。\n");
                t=getch();
                break;
            case 0:
                system("cls");
    
            }
        }
        while(a!=0);
        return 0;
    }
    

    这只是小编做的一个简洁版的思路,当然完成一个菜单的方法还有很多,欢迎大家来一起讨论。至于让你的菜单更精致一些,只需要改改细节就好了。

    题目2:

    根据“实践项目1、2“Q题的内容进入实质性设计内容如下:
    1、现有学生信息包含三部分:学号(10位数字组成的字符串)、姓名(10位英文字母组成的字符串)、成绩(0~100整数)。
    2、按照功能菜单对应的功能完成一个班的数据信息的输入Add、显示Display、查找Locate、修改Modify、删除Delete。其中学号是每名学生的关键字。
    3、输入信息时按照关键字先查找是否存在,如不存在,提示输入信息
    4、显示信息时按照两种显示方式(两种方式可以设计子菜单):一种是输入学生的关键字,显示特定学生,找到显示,找不到提示“未曾找到,无法操作!”;另一种是把当前所有学生的信息显示出来,要注意数据最好是按照每屏显示若干条信息。
    5、查找信息时按照4的第一种方式进行
    6、修改信息时先输入要修改学生的关键字,如找到,显示信息,然后提示是否修改,确认修改后进行修改,取消修改后退出;如没有找到要修改的学生,提示“未曾找到,无法操作!”
    7、删除信息是先输入要删除学生的关键字,如找到,显示信息,然后提示是否删除,确认删除后进行删除,取消删除后退出;如没有找到要删除的学生,提示“未曾找到,无法操作!”

    8、所实现的各个功能可参考由实践2最后一道题设计的函数中实现。注意各个函数时候需要传递参数,传递参数的类型与个数要确定。
    ExitSystem();
    AddInfo();
    DisplayInfo();
    LocateInfo();
    ModifyInfo();
    DeleteInfo();

    这个菜单的难度较上一个菜单的难度有了很大的提升。我们需要运用函数、结构体等功能来完成。首先我们明确各个函数的功能然后逐渐完善各个函数最后再用主函数来连接。

    结构体部分

    由于我们需要储存学生的名字,学号,成绩。所以干脆建立一个结构体:

    const int N = 1e5+7;
    struct book
    {
        string name,num;//名字、学号
        int grade;//成绩
    } s[N];//结构体数组
    

    这里注意,结构体由于在各个函数中都需要使用,所以需要定义为全局变量。

    ExitSystem()

    该函数意为储存系统,但是我不太明白它具体存些啥,所以我就用它来存了一些初始的学生信息:

    void ExitSystem()
    {
        s[1].name="Jake";
        s[1].num="2004020201";
        s[1].grade=59;
        s[2].name="Tom";
        s[2].num="2004020202";
        s[2].grade=62;
        s[3].name="Make";
        s[3].num="2004020203";
        s[3].grade=73;
    }
    

    先存三个学生信息,”杰克“、“汤姆”、“梅克”。

    AddInfo()

    该函数为输入系统,根据题目要求“输入信息时按照关键字先查找是否存在,如不存在,提示输入信息”。所以先根据”关键字“进行一次查找,信息存在时将信息输出,不存在时进行输入:

    void AddInfo()
    {
        cout<<"请输入关键字:";
        string t;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            i++;
            cout<<"信息不存在,请输入:"<<endl;
            cout<<"姓名:";
            cin>>s[i].name;
            cout<<"\n学号:";
            cin>>s[i].num;
            cout<<"\n成绩:";
            cin>>s[i].grade;
        }
        else
        {
            cout<<s[j].num<<"信息已存在!!!"<<endl;
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
        }
    }
    

    这里为了简单,直接采取了循环的方法来进行查找信息,所以在最前面我们还要定义一个全局变量i,并且初始化值为3(因为我们事先储存了三名同学的信息,如果你事先储存了n名同学的信息,那么这里i的值就要初始化为n)

    DisplayInfo()

    该函数功能为显示,根据要求“显示信息时按照两种显示方式(两种方式可以设计子菜单):一种是输入学生的关键字,显示特定学生,找到显示,找不到提示“未曾找到,无法操作!”;另一种是把当前所有学生的信息显示出来,要注意数据最好是按照每屏显示若干条信息。”
    做出:

    void DisplayInfo()
    {
        int a,j;
        cout<<"1.显示全部信息"<<endl;
        cout<<"2.查找关键字"<<endl;
        cout<<"请输入数字键选择菜单选项:";
        cin>>a;
        system("cls");
        if(a==1)
        {
            for(int j=1; j<=i; j++)
            {
                cout<<"Name:"<<s[j].name<<endl;
                cout<<"Num:"<<s[j].num<<endl;
                cout<<"Grade:"<<s[j].grade<<endl;
            }
        }
        else if(a==2)
        {
            cout<<"请输入关键字:";
            string t;
            cin>>t;
            int x=0;
            for(j=1; j<=i; j++)
            {
                if(s[j].num==t)
                {
                    x++;
                    break;
                }
            }
            if(x==0)
            {
                cout<<"未曾找到,无法操作!"<<endl;
            }
            else
            {
                cout<<"Name:"<<s[j].name<<endl;
                cout<<"Num:"<<s[j].num<<endl;
                cout<<"Grade:"<<s[j].grade<<endl;
            }
        }
    }
    

    这里比较好理解,显示全部依然是用循环所有进行的。

    LocateInfo()

    该功能为查找,与显示的功能一样

    void LocateInfo()
    {
        cout<<"请输入关键字:";
        string t;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            cout<<"未曾找到,无法操作!"<<endl;
        }
        else
        {
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
        }
    }
    

    下面是最难的两个功能了

    ModifyInfo()

    首先来说修改功能,这比删除信息要容易点,我们要通过遍历的方法来找到你想修改的信息的关键字,然后将该关键字的信息全部展示出来,再询问使用者是否修改。这里需要一个间接的变量来标记找到的信息所在的结构体数组的位置,然后将其信息进行修改:

    void ModifyInfo()
    {
        cout<<"请输入关键字:";
        string t,b;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)//j即是用来标记的间接变量
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            cout<<"未曾找到,无法操作!"<<endl;
        }
        else
        {
            cout<<s[j].num<<"关键字已找到"<<endl;
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
            cout<<"请问是否更改?(Y/N)";
            cin>>b;
            if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
            {
                cout<<"请输入:"<<endl;
                cout<<"姓名:";
                cin>>s[j].name;
                cout<<"\n学号:";
                cin>>s[j].num;
                cout<<"\n成绩:";
                cin>>s[j].grade;
            }
        }
    }
    

    DeleteInfo()

    删除信息也要通过遍历的方法来找到你想删除的信息的关键字,然后将该关键字的信息全部展示出来,再询问使用者是否删除。这里需要一个间接的变量来标记找到的信息所在的结构体数组的位置,然后将其信息进行删除。这里的难点是删除之后结构体数组中被删除的位置会变成空的,这样就会影响整个结构体数组的顺序,从而使我们前面查找显示输入等功能混乱。所以要将删除后的空位置用后面的未删除部分补上:

    void DeleteInfo()
    {
        cout<<"请输入要删除的学生的关键字:";
        string t,b;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            cout<<"未曾找到,无法操作!"<<endl;
        }
        else
        {
            cout<<s[j].num<<"关键字已找到"<<endl;
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
            cout<<"请问是否删除?(Y/N)";
            cin>>b;
            if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
            {
                for(int a=j;a<=i-1;a++)//从被删除位置开始,后面依次向前覆盖
                {
                    s[a].name=s[a+1].name;
                    s[a].num=s[a+1].num;
                    s[a].grade=s[a+1].grade;
                }
                i--;
                cout<<"删除成功!"<<endl;
            }
        }
    }
    

    这样我们就实现了所有功能,最后的代码如下:

    #include<iostream>
    #include<conio.h>
    #include<string.h>
    using namespace std;
    const int N = 1e5+7;
    int i=3;
    struct book
    {
        string name,num;
        int grade;
    } s[N];
    void ExitSystem()
    {
        s[1].name="Jake";
        s[1].num="2004020201";
        s[1].grade=59;
        s[2].name="Tom";
        s[2].num="2004020202";
        s[2].grade=62;
        s[3].name="Make";
        s[3].num="2004020203";
        s[3].grade=73;
    }
    void AddInfo()
    {
        cout<<"请输入关键字:";
        string t;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            i++;
            cout<<"信息不存在,请输入:"<<endl;
            cout<<"姓名:";
            cin>>s[i].name;
            cout<<"\n学号:";
            cin>>s[i].num;
            cout<<"\n成绩:";
            cin>>s[i].grade;
        }
        else
        {
            cout<<s[j].num<<"信息已存在!!!"<<endl;
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
        }
    }
    void DisplayInfo()
    {
        int a,j;
        cout<<"1.显示全部信息"<<endl;
        cout<<"2.查找关键字"<<endl;
        cout<<"请输入数字键选择菜单选项:";
        cin>>a;
        system("cls");
        if(a==1)
        {
            for(int j=1; j<=i; j++)
            {
                cout<<"Name:"<<s[j].name<<endl;
                cout<<"Num:"<<s[j].num<<endl;
                cout<<"Grade:"<<s[j].grade<<endl;
            }
        }
        else if(a==2)
        {
            cout<<"请输入关键字:";
            string t;
            cin>>t;
            int x=0;
            for(j=1; j<=i; j++)
            {
                if(s[j].num==t)
                {
                    x++;
                    break;
                }
            }
            if(x==0)
            {
                cout<<"未曾找到,无法操作!"<<endl;
            }
            else
            {
                cout<<"Name:"<<s[j].name<<endl;
                cout<<"Num:"<<s[j].num<<endl;
                cout<<"Grade:"<<s[j].grade<<endl;
            }
        }
    }
    void LocateInfo()
    {
        cout<<"请输入关键字:";
        string t;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            cout<<"未曾找到,无法操作!"<<endl;
        }
        else
        {
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
        }
    }
    void ModifyInfo()
    {
        cout<<"请输入关键字:";
        string t,b;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            cout<<"未曾找到,无法操作!"<<endl;
        }
        else
        {
            cout<<s[j].num<<"关键字已找到"<<endl;
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
            cout<<"请问是否更改?(Y/N)";
            cin>>b;
            if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
            {
                cout<<"请输入:"<<endl;
                cout<<"姓名:";
                cin>>s[j].name;
                cout<<"\n学号:";
                cin>>s[j].num;
                cout<<"\n成绩:";
                cin>>s[j].grade;
            }
        }
    }
    void DeleteInfo()
    {
        cout<<"请输入要删除的学生的关键字:";
        string t,b;
        cin>>t;
        int x=0,j;
        for(j=1; j<=i; j++)
        {
            if(s[j].num==t)
            {
                x++;
                break;
            }
        }
        if(x==0)
        {
            cout<<"未曾找到,无法操作!"<<endl;
        }
        else
        {
            cout<<s[j].num<<"关键字已找到"<<endl;
            cout<<"Name:"<<s[j].name<<endl;
            cout<<"Num:"<<s[j].num<<endl;
            cout<<"Grade:"<<s[j].grade<<endl;
            cout<<"请问是否删除?(Y/N)";
            cin>>b;
            if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
            {
                for(int a=j;a<=i-1;a++)
                {
                    s[a].name=s[a+1].name;
                    s[a].num=s[a+1].num;
                    s[a].grade=s[a+1].grade;
                }
                i--;
                cout<<"删除成功!"<<endl;
            }
        }
    }
    int main()
    {
        int a;
        char t;
        ExitSystem();
        do
        {
            system("cls");
            cout<<"\n\n          学生信息的管理与统计";
            cout<<"\n          1.信息输入";
            cout<<"\n          2.信息显示";
            cout<<"\n          3.信息查找";
            cout<<"\n          4.信息修改";
            cout<<"\n          5.信息删除";
            cout<<"\n          0.退出\n\n\n";
            cout<<"请按数字键选择菜单选项:";
            cin>>a;
            switch(a)
            {
            case 1:
                system("cls");
                AddInfo();
                printf("按任意键返回上一级。\n");
                t=getch();
                break;
            case 2:
                system("cls");
                DisplayInfo();
                printf("按任意键返回上一级。\n");
                t=getch();
                break;
            case 3:
                system("cls");
                LocateInfo();
                printf("按任意键返回上一级。\n");
                t=getch();
                break;
            case 4:
                system("cls");
                ModifyInfo();
                printf("按任意键返回上一级。\n");
                t=getch();
                break;
            case 5:
                system("cls");
                DeleteInfo();
                printf("按任意键返回上一级。\n");
                t=getch();
                break;
            case 0:
                system("cls");
    
            }
        }
        while(a!=0);
    }
    
    

    运行一下试试看:
    运行后会先显示初始菜单
    在这里插入图片描述
    输入2:
    在这里插入图片描述
    显示一下全部信息
    在这里插入图片描述
    我们事先储存的信息就会显示出来
    在这里插入图片描述

    现在让我们输入一个同学的信息
    在这里插入图片描述
    名字和学号成绩如下:
    在这里插入图片描述
    再次查看全部信息,发现我们输入进去的新信息已经被录入
    在这里插入图片描述
    将杰克的信息删除试试
    在这里插入图片描述
    再次查找时杰克已经不见了(可怜的杰克)
    在这里插入图片描述
    好啦,今天的内容就这么多,总之做这种实践类的代码方法有很多,这里只是提供一种小编的思路,大家可以一起讨论,尝试。

    展开全文
  • 如何进入Windows8系统启动选项菜单.docx
  • 一个典型的C++/MFC对话框程序,设置了EX_WM_TOOLWINDOW 扩展式样,因此在标题栏左上角看不到系统...例子程序对系统菜单进行了定制,在原有菜单基础上添加了两个菜单命令:一个是显示“关于”对话框;另一个是“退出”。
  • c语言学生管理系统菜单

    千次阅读 2018-09-03 10:18:51
    int Menu(void) //兼容型菜单 {  int i;  system("title 学生成绩管理系统V4.0 Create By Lu Tong");  printf("\n\n");  printf(" ...

    int   Menu(void)                                                                //兼容型菜单
    {
        int i;
        system("title 学生成绩管理系统V4.0  Create By Lu Tong");
        printf("\n\n");
        printf("                 学生成绩管理系统(V18.8.30版本)\n");
        printf("*******************************************************************************************\n");
        printf("Made By LuTong                                                                                                  *\n");
        printf("1.  录入每个学生的基本信息                                                                                 *\n");
        printf("2.  按平均分从高到低输出学生成绩                                                                      *\n");
        printf("3.  按单门学科成绩从高到低输出学生信息;                                                           *\n");
        printf("4.  按学号从小到大顺序输出学生基本信息                                                             *\n");
        printf("5.  按字典从小到大顺序输出学生基本信息                                                             *\n");
        printf("6.  按年龄和性别查找学生的基本信息                                                                     *\n");
        printf("7.  查找某门课成绩最高的学生的基本信息,某门课成绩最高的可能不只一名学生 *\n");
        printf("8.  查找某门课成绩在某个分数段内的学生人数和学生基本信息                             *\n");
        printf("9.  按学号查找学生基本信息,对学生信息进行修改后保存                                     *\n");
        printf("10. 按学号删除学生信息                                                                                          *\n");
        printf("11. 插入一名新的学生信息                                                                                        *\n");
        printf("12. 将学生信息写入文件                                                                                           *\n");
        printf("13. 从文件读取学生信息                                                                                           *\n");
        printf("0.  退出程序                                                                                                               *\n");
        printf("**********************************************************************************************\n");
        printf("\n");
        printf("\n");
        printf("\n");
        printf("\n");
        printf("*****************Please Input your choice:");
        scanf("%d", &i);
        return i;

    }

    展开全文
  • Qt之定制个性化系统托盘菜单

    千次阅读 2017-11-14 11:13:59
    导读  一款流行的软件,往往会在功能渐趋完善的时候,通过...这篇博文仍然以Qt的使用为主旨,探讨一下在Qt中如何进行系统托盘的个性化定制。 介绍  首先我们看看几款知名软件的系统托盘设计:  上

    导读

        一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验。毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满。界面设计需综合考虑审美学、心理学、设计学等多因素,是一份精细活。这篇博文仍然以Qt的使用为主旨,探讨一下在Qt中如何进行系统托盘的个性化定制。

    介绍

        首先我们看看几款知名软件的系统托盘设计:

        上图是金山卫士的系统托盘菜单设计。我们稍作分析:整个托盘菜单窗口是个半透明的设计,窗口边框进行了圆角处理。底部的菜单项包含三个Button,倒数第二、三个菜单项的右部还加上了一个自定义的单选按钮。顶部菜单项则包含一个评级组件;其他菜单项则没有什么特别,加上对应的图标即可完成设计。但是可能由于整个背景色的缘故,导致整体效果看起来灰蒙蒙的,不太亮堂。

         上图是360安全卫士的托盘菜单。顶部和底部的两个菜单项都将背景色设置成了360安全卫士的主题色,加上了两个标签和按钮。其他菜单项保持不变。另外,菜单的背景色也被设置成了白色。整个菜单的设计较为简洁、清爽。虽然并不喜欢用360安全卫士,但是并不妨碍我对其产品外观设计的赞赏。

    原型设计

         既然有了上述两款产品的参考,我们也可以试着设计下自己的系统托盘。首先我们需要一个原型设计工具,将草图绘制好我们才能用代码将最终结果显示出来。这里推荐一个原型设计工具:Balsqmiq mockup。这款工具使用简单,其提供的原型组件非常丰富,使用会觉得非常方便。

         根据初步设想,我设计了如下的一个原型草图:

          在布局方面基本上综合了金山卫士和360安全卫士的设计特点。顶部菜单项部署两个Label, 一个用来显示应用程序的窗口标题或产品名称,另一个显示为go to visit,可以响应鼠标点击事件。底部菜单项和金山卫士一样,设置了三个按钮:Update, about, exit,使用水平均匀布局。其他的菜单项则和普通菜单项没有区别。 基本上,一个自定义的托盘菜单已经跃然而出。

    代码实现

          根据上述的原型设计,我们要做的准备工作显然就是准备好图片。对于没有美工技能的程序员来说,寻找界面图片素材显然是一大难题。做不出图片显然只好去网上搜索了。本人在网上下载了一堆的图片压缩包,有一个值得推荐:异次元图标。另外还有一个图片搜索网站也值得推荐。在这里我准备的图片如下:

          每个图片都取了一个别名,这样在代码中我们直接使用图片别名,从而消除与图片具体名称的藕合性。资源准备好之后我们需要开始编码了。参考本人曾经写过的一篇博文(使用Qt创建系统托盘),可以实现一个默认主题的系统托盘菜单。但是这里我们要实现自定义托盘菜单,我们从QSystemTray派生一个子类,并定义好相关的类成员变量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    QMenu* m_trayMenu;
     
    QWidget* m_topWidget;
    QWidgetAction* m_topWidgetAction;
    QLabel* m_topLabel;
    QLabel* m_homeBtn;
     
    QWidget* m_bottomWidget;
    QWidgetAction* m_bottomWidgetAction;
    QPushButton* m_updateBtn;
    QPushButton* m_aboutBtn;
    QPushButton* m_exitBtn;
     
    QAction* m_runOnSystemBoot;
    QAction* m_helpOnline;
    QAction* m_homePage;
    QAction* m_notification;
    QAction* m_settings;

      显然,我们注意到一个平时没有接触到的:QWidgetAction。这个类自Qt 4.2引入,继承自QAction。根据类名也可以推测出其含义:使用QWidget来充当Menu的Action。于是,我们似乎明白了自定义菜单的精髓:用Widget来做Action。这里我们主要定义顶部菜单项和底部菜单项。因此我们定义了两个QWidgetAction。另外,我们还有一个疑问就是:布局好的Widget如何"伪装"成Action插入到菜单项中去呢?我们可以使用QWidgetAction的setDefaultWidget()方法来完成这项工作。后面的代码将会有说明。

          此外,我们还注意到:360安全卫士的底部菜单项和顶部菜单项的背景色都是绿色的这又该如何实现呢?一种可行的方法是,安装一个事件过滤器(Event Filter)。当过滤到绘制事件并且绘制的组件是顶部菜单项和底部菜单项时,我们改变绘制方式。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool  SystemTray::eventFilter(QObject *obj, QEvent *event)
    {
         if  (obj == m_topWidget && event->type() == QEvent::Paint)
         {
             QPainter painter(m_topWidget);
             painter.setPen(Qt::NoPen);
             painter.setBrush(QColor(42, 120, 192));
             painter.drawRect(m_topWidget->rect());
         }
         return  QSystemTrayIcon::eventFilter(obj, event);
    }

      在完成了我们自己的绘制工作之后,还得再调用父类的事件过滤器,以免漏掉其他过滤工作。eventFilter()是一个protected方法,我们要在头文件中进行重写。

          接下来要做的工作就是完成顶部和底部菜单项的绘制工作。先看看顶部菜单项如何绘制:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void  SystemTray::createTopWidget()
    {
         m_topWidget =  new  QWidget();
         m_topWidgetAction =  new  QWidgetAction(m_trayMenu);
         m_topLabel =  new  QLabel(QStringLiteral( "HUST Information Security Lab" ));
         m_topLabel->setObjectName(QStringLiteral( "WhiteLabel" ));
         m_homeBtn =  new  QLabel(QStringLiteral( "Visit" ));
         m_homeBtn->setCursor(Qt::PointingHandCursor);
         m_homeBtn->setObjectName(QStringLiteral( "WhiteLabel" ));
     
         QVBoxLayout* m_topLayout =  new  QVBoxLayout();
         m_topLayout->addWidget(m_topLabel, 0, Qt::AlignLeft|Qt::AlignVCenter);
         m_topLayout->addWidget(m_homeBtn, 0, Qt::AlignRight|Qt::AlignVCenter);
     
         m_topLayout->setSpacing(5);
         m_topLayout->setContentsMargins(5, 5, 5, 5);
     
         m_topWidget->setLayout(m_topLayout);
         m_topWidget->installEventFilter( this );
         m_topWidgetAction->setDefaultWidget(m_topWidget);
    }

      我们声明了两个Label标签,作用在上文已说明。然后用垂直布局管理器将两个标签分左右放置。注意语句:m_topWidget->installEventFilter(this)。这条语句完成了过滤器的安装。指针this表明窗口事件将先发往当前类的eventFilter()方法进行处理,如果不处理再发往其他类的过滤器进行处理。底部菜单项的初始化大致类似:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    void  SystemTray::createBottomWidget()
    {
         m_bottomWidget =  new  QWidget();
         m_bottomWidgetAction =  new  QWidgetAction(m_trayMenu);
     
         m_updateBtn =  new  QPushButton(QIcon( ":/menu/update" ), QStringLiteral( "Update" ));
         m_updateBtn->setObjectName(QStringLiteral( "TrayButton" ));
         m_updateBtn->setFixedSize(60, 25);
     
         m_aboutBtn =  new  QPushButton(QIcon( ":/menu/about" ), QStringLiteral( "About" ));
         m_aboutBtn->setObjectName(QStringLiteral( "TrayButton" ));
         m_aboutBtn->setFixedSize(60, 25);
     
         m_exitBtn =  new  QPushButton(QIcon( ":/menu/quit" ), QStringLiteral( "Exit" ));
         m_exitBtn->setObjectName(QStringLiteral( "TrayButton" ));
         m_exitBtn->setFixedSize(60, 25);
     
         QHBoxLayout* m_bottomLayout =  new  QHBoxLayout();
         m_bottomLayout->addWidget(m_updateBtn, 0, Qt::AlignCenter);
         m_bottomLayout->addWidget(m_aboutBtn, 0, Qt::AlignCenter);
         m_bottomLayout->addWidget(m_exitBtn, 0, Qt::AlignCenter);
     
         m_bottomLayout->setSpacing(5);
         m_bottomLayout->setContentsMargins(5,5,5,5);
     
         m_bottomWidget->setLayout(m_bottomLayout);
         m_bottomWidgetAction->setDefaultWidget(m_bottomWidget);
    }

      分别对三个按钮设置了大小和图标。具体的外观样式则使用了QSS来进行控制,因此我们还为每个按钮设置了一个Object Name。这个Object Name在QSS中充当ID选择器,便于样式控制。那么样式文件该如何编写呢?具体参看如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    QMenu{
         background : white ;
         border : 1px  solid  lightgray; # 边框为灰色
    }
     
    QMenu::item{
         padding : 0px  20px  0px  20px ;
         margin-left 5px ;
         height : 25px ;
    }
     
    QMenu::item:selected:enabled{
         background : lightgray;   # 菜单项选中时背景色设置为浅灰色
         color white ;            # 文本颜色设置为白色,否则看不清文本内容了
    }
     
    QMenu::separator{
         height : 1px ;
         background : lightgray;   # 菜单分割线也设置为浅灰色
         margin : 2px  0px  2px  0px ;
    }
     
    QMenu::item:selected:!enabled{
         background : transparent ;
    }
     
    QPushButton#TrayButton {
         border none ;    # 无边框按钮
         background transparent ;  # 按钮背景设置为透明,这样不会受到默认主题颜色干扰
    }
     
    QPushButton#TrayButton:hover {
         background rgb ( 233 237 252 );  # 鼠标悬停时,按钮背景色设为淡色
         color rgb ( 42 120 192 );    # 鼠标悬停时,文本颜色不变
    }

      基本上,使用上面的样式设置就可完成基本样式设置。其他代码就不再详细叙述。到此,我们的托盘菜单就完成了个性化定制工作。

    效果图

          根据上述代码,我们实现的最终效果图如下:

           前面也说过:界面设计是一门学问,综合了设计学、心理学、审美学等多学科。要设计出让人耳目一新的产品界面,需要设计师具备相当的设计功力。但不管最终设计的怎么样,我们已经知道了,如何实现具备个人特点的托盘菜单!


    原文链接:http://www.cnblogs.com/csuftzzk/p/CustomSystemTray.html

    展开全文
  • C语言实现树形菜单的管理系统

    千次阅读 2020-06-20 01:06:32
    C语言简单实现菜单管理系统 一、开发环境 vc6.0 二、功能介绍 创建一个树形菜单以及对该菜单进行增删改查,还包含了将一个树结构的菜单存储到文件中,从文件中读取一个树结构的菜单并显示等。 三、代码实现 1、定义...

    源代码下载请点击下方链接,里面还包含学生信息管理系统和成绩管理系统,都是在vc6.0下用c语言完成的,一共三份。
    下载源代码请点击这里

    一、开发环境

    vc6.0

    二、功能介绍

    创建一个树形菜单以及对该菜单进行增删改查,还包含了将一个树结构的菜单存储到文件中,从文件中读取一个树结构的菜单并显示等。

    三、代码实现

    1、定义树形菜单的结构体

    typedef struct TreeNode{//定义树结点的结构体
    	char menu_name[20];//菜单名称
    	time_t t;//采用时间为每个菜单生成唯一编号
    	struct TreeNode *firstchild,*nextbrother,*parent;
    	int level;//菜单的级数
    }node;
    
    

    树形结构是转化成对应的二叉树存储的,方式如下:
    在这里插入图片描述
    树转化为二叉树规则:每个结点左指针指向它的第一个孩子结点,右指针指向它在树中的相邻兄弟结点,可表示为“左孩子右兄弟”。
    由于我不会用c语言生成唯一序列号,暂且就用当前时间来代替。

    "time_t t"得到的是从1970.1.1 00:00:00到现在的秒数;

    firstchild指向该结点的第一个孩子结点,nextbrother指向相邻兄弟结点(右侧兄弟),parent指向父菜单也就是上层菜单结点,注意不是转化后在对应二叉树中的父结点,而是树中的父结点。如上图的结点C,C结点的firstchild(第一个孩子结点)指向H,因为H是结点C的孩子结点也是唯一的孩子结点,如果有多个孩子结点,则最左侧的为第一个;C结点的nextbrother(相邻兄弟结点)指向D,D是它右侧的兄弟,如果C右侧没兄弟则指向一个空领域;C结点的parent(上层菜单结点)指向A,不是B,因为A是C的上层菜单,而B只是C在菜单树转化为对应二叉树上的父结点,它们实际上并没有上下级的关系,而是平级。

    level表示当前菜单项是几级菜单。

    2、定义栈的结构体和相关操作

    #define Maxsize 100//定义栈的大小
    
    typedef struct{//定义栈的结构体
    	node *data[Maxsize];
    	int top;
    }SqStack;
    
    void InitStack(SqStack &s){//初始化栈
    	s.top = -1;
    }
    
    bool StackEmpty(SqStack s){//判栈空
    	if(s.top == -1){
    		return true;
    	}else{
    		return false;
    	}
    }
    
    bool Push(SqStack &s,node *x){//进栈
    	if(s.top == Maxsize-1){
    		return false;
    	}else{
    		s.data[++s.top] = x;
    		return true;
    	}
    }
    
    node *Pop(SqStack &s){//出栈
    	if(s.top == -1){
    		return NULL;
    	}else{
    		return s.data[s.top--];
    	}
    }
    
    

    因为要对二叉树进行非递归的遍历,需要借助于栈来实现

    3、功能的实现

    准备工作已做好,接下来就开始实现各个功能了

    1、创建菜单树并返回根结点

    node *creat_Tree(){//创建菜单树
    	node *T,*p;
    	char menu_id[20];
    	T = (node *)malloc(sizeof(node));
    	T->nextbrother = NULL;
    	T->parent = NULL;
    	T->firstchild = NULL;
    	T->t = time(NULL);
    	T->level = 0;
    	strcpy(T->menu_name,"主菜单(隐藏)");
    	while(1){
    		printf("建立菜单,请输入父菜单编号(一级菜单输入:%d),退出输入#\n",T->t);
    		scanf("%s",menu_id);
    		if(strcmp(menu_id,"#")==0){
    			break;
    		}else{
    			p = Inorder(T,strtol(menu_id,NULL,0));
    			if(p == NULL){
    				printf("请输入正确的编号!\n");
    				continue;
    			}
    			Insert_node(p);
    			printf("\n");
    			printf("当前菜单如下:\n");
    			display_menu(T->firstchild);
    		}
    	}
    	getchar();
    	return T;
    }
    

    根结点当做一个隐藏的主菜单,不显示,其底下的子菜单是一级菜单。创建菜单是选定一个父菜单的编号并在其下创建子菜单。

    2、新增一个菜单项

    void add_menu(node *T){//添加子菜单
    	char menu_id[20];
    	node *p;
    	printf("添加菜单,请输入父菜单编号(一级菜单输入:%d):",T->t);
    	scanf("%s",menu_id);
    	getchar();
    	p = Inorder(T,strtol(menu_id,NULL,0));
    	if(p == NULL){
    		printf("不存在该编号!\n");
    		return;
    	}
    	Insert_node(p);
    	printf("\n");
    	//printf("当前菜单如下:\n");
    	//display_menu(T->firstchild);
    }
    

    3、删除子菜单,当被删除菜单有下级菜单不能删除

    void delete_menu(node *T){//删除子菜单
    	char id[20];
    	node *p,*parent,*q;
    	printf("请输入要删除菜单的编号:");
    	scanf("%s",id);
    	getchar();
    	p = Inorder(T,strtol(id,NULL,0));
    	if(p!=NULL){
    		if(p->firstchild != NULL){
    			printf("\n");
    			printf("该菜单下有子菜单,无法删除!\n");
    		}else{
    			parent = p->parent;//获取父菜单结点的指针
    
    			if(parent->firstchild == p){//如果该菜单是父菜单的第一个孩子结点
    				parent->firstchild = p->nextbrother;
    				free(p);
    				printf("\n");
    				printf("删除成功!\n");
    			}else{
    				q = parent->firstchild;
    				while(q&&q->nextbrother!=p){
    					q = q->nextbrother;
    				}
    				q->nextbrother = p->nextbrother;
    				free(p);
    				printf("删除成功!\n");
    			}
    
    		}
    	}else{
    		printf("无此菜单!\n");
    	}
    }
    
    

    4、修改菜单的名称

    void edit_menu_name(node *T){//修改菜单名称
    	char id[20];
    	node *p;
    	printf("请输入要修改菜单的编号:");
    	scanf("%s",id);
    	p = Inorder(T,strtol(id,NULL,0));
    	if(p!=NULL){
    		printf("请输入菜单名称(原名称为:%s):",p->menu_name);
    		scanf("%s",p->menu_name);
    		printf("修改成功!\n");
    	}else{
    		printf("无此菜单!\n");
    	}
    	getchar();
    }
    

    5、显示菜单

    void display_menu(node *T){//递归方式实现先序遍历来显示菜单,菜单树转化为对应的二叉树只有先序遍历能将菜单很好展示出来
    	if(T!=NULL){
    		printf("\n");
    		print_str(' ',(T->level)*3);
    		printf("%s(%ld)\n",T->menu_name,T->t);
    		printf("\n");
    		display_menu(T->firstchild);
    		display_menu(T->nextbrother);
    	}
    }
    

    注意,只有对转化后的二叉树进行先序遍历才能将对应的菜单按层次展示出来,代码中的print_str(char c,int n)函数表示打印n个字符c,通过每个菜单对应不同级别在它前面打印不同个数的空格,这样才能更好的将菜单层次展示出来。

    6、利用栈对二叉树遍历查找对应编号的结点

    node *Inorder(node *T,long id){//采用非递归算法(利用栈)方式实现中序遍历查找结点并返回
    	SqStack s;
    	InitStack(s);
    	node *p = T;
    	while(p||!StackEmpty(s)){
    		if(p){
    			Push(s,p);
    			p = p->firstchild;
    		}else{
    			p = Pop(s);
    			if(p->t == id){
    				return p;
    			}
    			p = p->nextbrother;
    		}
    	}
    	return NULL;
    }
    

    7、向父菜单的结点T中插入子菜单项

    void Insert_node(node *T){//向父菜单的结点T中插入子菜单项
    	node *p,*q;
    	p = (node *)malloc(sizeof(node));
    	printf("\n");
    	printf("请输入菜单名称:");
    	scanf("%s",p->menu_name);
    	getchar();
    	p->t = time(NULL);
    	p->parent = T;
    	p->firstchild = NULL;
    	p->nextbrother = NULL;
    	p->level = T->level+1;
    
    	if(T->firstchild == NULL){
    		T->firstchild = p;
    	}else{
    		q = T->firstchild;
    		while(q->nextbrother != NULL){
    			q= q->nextbrother;
    		}
    		q->nextbrother = p;
    	}
    	printf("\n");
    	printf("添加成功!\n");
    
    }
    

    8、将当前编辑好的菜单保存到文件中,采用先序保持菜单顺序

    void savebypro(node *T,FILE *fp){//采用先序遍历存储
    	if(T!=NULL){
    		long firstchild_t,nextbrother_t,parent_t;
    		if(T->firstchild == NULL){
    			firstchild_t = 0;
    		}else{
    			firstchild_t = T->firstchild->t;
    		}
    
    		if(T->nextbrother == NULL){
    			nextbrother_t = 0;
    		}else{
    			nextbrother_t = T->nextbrother->t;
    		}
    
    		if(T->parent == NULL){
    			parent_t = 0;
    		}else{
    			parent_t = T->parent->t;
    		}
    
    		fprintf(fp,"%s %ld %ld %ld %ld %d\n",T->menu_name,T->t,firstchild_t,nextbrother_t,parent_t,T->level);
    		//指针地址均采用长整型存储,时间t也是,它是1970-1-1 00:00:00到现在的秒数
    		savebypro(T->firstchild,fp);
    		savebypro(T->nextbrother,fp);
    	}
    }
    
    
    void save_menu(node *T){//将菜单保存到文件中
    	FILE *fp;
    	if((fp = fopen("e:\\myProject_file\\menu.txt","w"))==NULL){
    		printf("文件打开失败!\n");
    		exit(1);
    	}
    	savebypro(T,fp);
    	fclose(fp);
    	printf("\n");
    	printf("保存成功!\n");
    }
    

    9、从文件中读取菜单,并返回根结点

    node *read_file(){//读取文件数据并将其还原成菜单树返回其根结点
    	FILE *fp;
    	node *T=NULL,tree,*p,*temp,*q;
    	if((fp = fopen("e:\\myProject_file\\menu.txt","r"))==NULL){
    		printf("文件读取失败!请先将数据保存到文件中!\n");
    		return NULL;
    	}
    	while(fscanf(fp,"%s%ld%ld%ld%ld%d",tree.menu_name,&tree.t,&tree.firstchild,&tree.nextbrother,&tree.parent,&tree.level)!=EOF){
    		//这里的firstchild、nextbrother、parent存储的是对应结点的编号,而不是它的地址,因为地址会改变,再根据它们之间对应关系用地址链接成一个树
    		if(T == NULL){//第一个读取到的数据为根节点的数据
    			T = (node *)malloc(sizeof(node));
    			T->firstchild = NULL;
    			T->level = tree.level;
    			strcpy(T->menu_name,tree.menu_name);
    			T->nextbrother = NULL;
    			T->parent = NULL;
    			T->t = tree.t;
    		}else{//根据firstchild、nextbrother、parent中存储的第一个孩子结点,下一个兄弟结点以及父菜单结点的编号构建菜单树
    			p = (node *)malloc(sizeof(node));
    			p->firstchild = NULL;
    			p->level = tree.level;
    			strcpy(p->menu_name,tree.menu_name);
    			p->nextbrother = NULL;
    			p->t = tree.t;
    			temp = Inorder(T,(int)tree.parent);
    			p->parent = temp;
    			if(temp->firstchild == NULL){
    				temp->firstchild = p;
    			}else{
    				q = temp->firstchild;
    				while(q->nextbrother!=NULL){
    					q = q->nextbrother;
    				}
    				q->nextbrother = p;
    			}
    
    			
    		}
    	}
    	printf("\n");
    	printf("文件读取成功!\n");
    	printf("\n");
    	return T;
    }
    

    这一功能花费时间最长,也是感觉最难的部分,将树的结构存到文件中要存下各个结点之间的关系,然后要通过这些关系来恢复之前存储的二叉树。将它们之间的关系存到文件中我是利用结点中的firstchild、nextbrother和parent这三个指针,三个指针本来是存结点地址的,但是重新构造二叉树结点的地址和之间存储的地址不一定相同,此方法行不通,我就不存该结点的地址,而是存它的唯一编号,这样下来,firstchild、nextbrother和parent存储的分别是第一个孩子结点的编号、右侧兄弟的编号以及上层菜单结点的编号,再通过对应关系来恢复二叉树。

    10、最后一个功能,查找菜单相关信息以及它的上层菜单和子菜单

    void search_menu(node *T){//根据菜单编号查询菜单,显示该菜单相关信息并显示上层菜单以及子菜单
    	char menu_id[20];
    	node *p,*q;
    	printf("\n");
    	printf("请输入要查询的菜单编号:");
    	scanf("%s",menu_id);
    	getchar();
    	p = Inorder(T,strtol(menu_id,NULL,0));
    	if(p == NULL){
    		printf("无此菜单项!\n");
    		return;
    	}
    	printf("\n");
    	printf("菜单名称:%s,菜单级数:%d级菜单\n",p->menu_name,p->level);
    	printf("\n");
    	if(p->parent!=NULL&&p->parent!=T){
    		printf("上层菜单:%s\n",p->parent->menu_name);
    		printf("\n");
    	}
    	if(p->firstchild != NULL){
    		printf("其子菜单:\n");
    		printf("\n");
    		q = p->firstchild;
    		while(q){
    			print_str(' ',10);
    			printf("%s\n",q->menu_name);
    			printf("\n");
    			q = q->nextbrother;
    		}
    	}
    }
    

    11、主函数

    void main(){
    	node *T = read_file();//程序默认从文件中读取菜单
    	char chioce;
    	while(1){
    		if(T==NULL){//如果文件不存在或从文件中读取失败,就新建一个菜单
    			printf("\n现重新建立菜单!\n");
    			printf("\n");
    			T = creat_Tree();
    		}
    		printf("\n");
    		print_str(' ',10);
    		printf("菜单管理系统");
    		print_str(' ',10);
    		printf("\n");
    		print_str('*',40);
    		printf("\n");
    		print_str(' ',10);
    		printf("1、新建菜单\n");//重新建立一个菜单
    		print_str(' ',10);
    		printf("2、读取菜单\n");//从文件中读取菜单并显示
    		print_str(' ',10);
    		printf("3、添加菜单\n");
    		print_str(' ',10);
    		printf("4、删除菜单\n");
    		print_str(' ',10);
    		printf("5、修改菜单\n");
    		print_str(' ',10);
    		printf("6、查询菜单\n");
    		print_str(' ',10);
    		printf("7、保存菜单\n");//将当前编辑之后的菜单保存到文件中
    		print_str(' ',10);
    		printf("8、退出程序\n");
    		print_str('*',40);
    		printf("\n");
    		printf("\n");
    		printf("当前菜单如下:\n");
    		printf("\n");
    		display_menu(T->firstchild);
    		printf("\n");
    		printf("请输入编号选择<1-8>:");
    		scanf("%c",&chioce);
    		getchar();
    		switch(chioce){
    			case '1':T = creat_Tree();break;
    			case '2':T = read_file();break;
    			case '3':add_menu(T);break;
    			case '4':delete_menu(T);break;
    			case '5':edit_menu_name(T);break;
    			case '6':search_menu(T);break;
    			case '7':save_menu(T);break;
    			case '8':return;
    			default:continue;
    		}
    	}
    }
    
    

    至此,程序的各个功能都已经实现了,在程序中你会发现使用了大量的一个单独的getchar(),这有什么用呢?getchar()它是用来接收键盘缓冲区的第一个字符,如果你输入“iejgoei”并按下回车,getchar()就会接收到第一个字符 i 。

    		while(1){
    			printf("请输入编号选择<1-8>:");
    			scanf("%c",&chioce);
    			getchar();
    		}
    

    如上述代码,你输入一个数字并按下回车,此时键盘缓冲区中会有两个字符,一个是数字,一个是回车符“\n”,要是没有getchar(),首先数字会被chioce接收,第二次循环时,回车符会直接被chioce接收,不会等待你输入数字的,因为键盘缓冲区中已经有了字符它会自动接收。所以getchar()起到了清除缓存的作用,它将键盘缓冲区中的回车符给吸收了,让scanf函数能起到想要的作用。
    还有一个函数和getchar()很想,它是getch()函数,这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,它这样的特性就可以用来实现“按任意键继续的。。。”这一功能,将它放在函数末尾,程序会等待你输入一个字符才会接着执行。

    4、效果展示

    程序默认从文件中读取菜单并显示,若文件并不存在,则要求重新建立一个菜单

    新建之后的效果,括号中的为菜单对应编号
    在这里插入图片描述
    在这里插入图片描述

    这是从文件中读取后显示的效果
    在这里插入图片描述
    文件中格式
    在这里插入图片描述

    查询效果
    在这里插入图片描述

    其他的就没什么好演示的了,注意,在新建菜单完成之后,再去读取文件中的菜单,文件存在就会显示文件中的菜单,你也只能在这个菜单上进行相关操作了,之前你新建好的菜单会被覆盖掉,因为不管是从文件中读取还是自己新建菜单都会返回一个根结点,而此程序所有操作都会基于根结点来,你根结点变了,所操作的对象也就变了;文件要是不存在又会让你重新建了。同样,从文件中读取的菜单状态下去选择新建也只能操作新建的菜单了,但是你新建好后还可以在读取文件中信息,因为文件中数据还在。

    好了,到这里也就结束了,我c语言学的不深,代码质量就这样,也欢迎各位对代码的纠正。

    展开全文
  • 参数: hWvd:拥有窗口菜单拷贝的窗口的句柄。 BPevert:指定将执行的操作。如果此参数为FALSE,GetSystemMenu返回当前使用窗口菜单的拷贝的句柄。该拷贝初始时与窗口菜单相同,但可以被修改。 如果此参数为TRUE,...
  • STM32 OLED多级菜单显示

    2018-04-03 16:02:23
    基于STM32单片机,使OLED液晶显示屏进行多级菜单显示。
  • 一台电脑安装了两个操作系统(不管都是 Windows,还是 Windows 跟 Linux),每次开机会显示一个双系统启动菜单等用户选择启动那一个;在默认情况下,后安装的系统排在先,等待27-30秒后自动选择第一个启动;当然,也...
  • 权限管理系统中的根据用户角色动态生成用户权限菜单树 源码地址https://github.com/dabai-cai/thesis 暑假在工作室学习了基于RBAC的权限管理系统,学的比较浅显,记录下方便以后学习可以看。 一、首先讲讲我...
  • 右侧菜单的html 代码,使用了Thymeleaf 模版,这是左测的菜单栏,左侧的所有菜单最外层是一个div; &lt;li class="nav-item"&gt; &lt;a href="javascript:;"&gt;&lt;i ...
  • 编写的是一个菜单驱动的学生成绩管理系统。 •能输入并显示n个学生的m门考试科目的成绩,总分和平均分。 •能按总分高低进行排序 •任意输入一个学号,能显示学生的姓名,各门功课的成绩 •在使用过程中,用户...
  • 前言:我们项目的菜单权限主要是由后台控制,前台根据后台提供的menuList进行页面展示,根据用户登录账号的不同,从而显示分配不同的权限菜单。 1,利用elementui 导航菜单组件书写结构(我们项目要求的权限菜单是三...
  • Android项目点击系统菜单项失效

    千次阅读 2016-01-22 13:30:52
    今天在做一个小的Android案例,需要使用系统菜单键来进行一些的相关的设置,但是吧,在小案例做完之后,发现系统菜单无论如何点击都没有效果(系统菜单列表不显示)。  系统菜单的设置及点击事件的响应代码如下:...
  • MFC如何定制对话框系统菜单

    千次阅读 2013-08-25 16:49:32
    系统菜单是每个 Windows 程序的标准特性。通常系统菜单由 Windows 系统来管理,所以我们平时编成时很少去碰它。但是,有的时候,我们确实想定制自己的系统菜单项。这样就涉及到定制菜单的处理问题,因为 Windows ...
  • 其实就是双系统的问题,具体设置如下 右键我的电脑 属性 高级 *启动和故障恢复 设置 系统启动 选择默认操作系统
  • 实现顶部一级菜单和左侧二级菜单进行响应,选哪个一级菜单时,左侧菜单栏有相对应下的二级菜单,产生联动效果。然后选不同的二级菜单,主体内容区域展示对应内容。 二、效果图 三、具体操作实现 1、用 vue-...
  • 默纳克系统小键盘各菜单功能详述

    千次阅读 2021-08-13 06:38:57
    小键盘各菜单功能详述如下F0(楼层及运行方向信息):上电...在系统出现故障情况下(原来系统无故障),数码管自动切换为故障代码闪烁显示,如果故障自动消失则进入F0的菜单显示。F1(运行楼层命令输入):通过PRG、UP、S...
  • 代码通过改写Windows的注册表扩展操作系统的右键菜单功能,可在Windows操作系统桌面点击右键进行测试。
  • 学生成绩管理系统菜单界面)

    万次阅读 2018-04-29 13:35:03
    下面是菜单界面的代码: #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include"qtsm.h" extern int read_dir, write_dir; void log_in() { read_account();...
  • 编辑xfce4系统菜单

    千次阅读 2018-11-14 08:06:23
    编辑xfce4系统菜单
  • 前言:这周看到菜单部分,以前也对菜单有过使用,但并没有系统的对菜单进行梳理。这次借着这个机会,对菜单进行梳理。...1、《Menu详解(一):代码实现系统菜单及子菜单》 2、《Menu详解(二):利用XML生成...
  • 系统权限设计实现_精确菜单和按钮

    千次阅读 2019-01-03 13:02:40
    每个系统都离不开权限控制,这里来说说页面上控制到按钮的思路,仅提供思路: 使用 角色 + 资源(菜单菜单对应页面上的按钮)+ 授权的方式。 1 定义角色与用户;  假定这里我们只控制到角色这一层次,一个用户...
  • android电子菜单点菜系统

    热门讨论 2011-04-11 13:35:08
    电子菜单软件可与餐厅原有IT支撑系统通过接口进行无缝的信息传递,让客人用餐的整个信息流程通畅无阻。本系统可大大提升餐厅菜单的更新效率,将传统菜单与信息化自然融合,省去了酒店菜单、明档制作的时间和费用,...
  • 系统菜单怎么添加一个菜单我就不说了,网上比较多,但是也比较笼统,后面会有代码放出。这里主要说的是怎么添加子菜单,使用AppendMenu和InsertMenu都可以,然后在处理的时候判断ID就可以了,只要ID不一样就可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 581,835
精华内容 232,734
关键字:

怎么进入系统菜单