牛逼!再也不用长长的Switch语句了

2022-06-16 14:47:18 浏览数 (1)

一提到switch,难免出来许多case,代码长而不爽,工程效率也大大下降

举例说明:

一个学生管理系统,定义各种菜单栏,用户在控制台进行输入,由输入自主选择菜单。

1. 菜单栏声明如下,具体实现略去

代码语言:javascript复制
class Menu
{
    public:
        void Welcome();
        void TypeIn(Data *&d);
        void DeletaData(Data *&d);
        void ADDData(Data *&d);
        void FindData(Data *&d);
        void SortData(Data *&d);
        void Statistics(Data *&d);
        void Modification(Data *&d);
        bool Modification_data(Data *&h,int i);
        void DisplyData(Data *&d);
        void Save(Data *&d);
     }

2. 用户进行菜单选择

Switch-Case常规写法:

代码语言:javascript复制
Menu MM;
void MenuSelect(Data *&d)
{
    int input=0;
    while(scanf("%d",&input)!=EOF)
    {
        if(input <1 || input>9)
        {
            cout<<"输入范围在1~9,请重新输入"<<endl;
            continue;
        }
        //进行菜单选择
        switch(input)
        {
            case 1:
            {
                MM.TypeIn(d);
                break;
            }
            case 2:
            {
                MM.SortData(d);
                break;
            }
            case 3:
            {
                MM.ADDData(d);
                break;
            }
            case 4:
            {
                MM.FindData(d);
                break;
            }
            case 5:
            {
                MM.DeletaData(d);
                break;
            }
            case 6:
            {
               MM.Statistics(d);
                break;
            }
            case 7:
            {
               MM.Modification(d);
                break;
            }
            case 8:
            {
                MM.DisplyData(d);
                break;
            }
             case 9:
            {
                MM.Save(d);
                return;//退出
            }
        }
       MM.Welcome();
    }
}

再也不用Switch之一:

代码语言:javascript复制
//定义的函数类型,返回值与形参与Menu中一致
typedef void(Menu::*Fun_Name)(Data*&);
typedef struct Selet
{
    int choice_input;
    Fun_Name fun_name;

}_Select;

_Select SS[9]=
{
    {1,&Menu::TypeIn},
    {2,&Menu::SortData},
    {3,&Menu::ADDData},
    {4,&Menu::FindData},
    {5,&Menu::DeletaData},
    {6,&Menu::Statistics},
    {7,&Menu::Modification},
    {8,&Menu::DisplyData},
    {9,&Menu::Save}
};
int _leng=sizeof(SS)/sizeof(SS[0]);

void MenuSelect(Data *&d)
{
    int input=0;
    while(scanf("%d",&input)!=EOF)
    {
        if(input <1 || input>9)
        {
            cout<<"输入范围在1~9,请重新输入"<<endl;
            continue;
        }
      for(int i=0;i<_leng;i  )
        {
            if(input  == SS[i].choice_input)
            {   
                (MM.*SS[i].fun_name)(d);
            }   
        }
       MM.Welcome();
    }
}

再也不用Switch之二:

代码语言:javascript复制
typedef void (Menu::*Select_Fun)(Data *&d);
Select_Fun  _SSL[]=
{   
    &Menu::TypeIn,
    &Menu::TypeIn,//从0开始,输入从1开始
    &Menu::SortData,
    &Menu::ADDData,
    &Menu::FindData,
    &Menu::DeletaData,
    &Menu::Statistics,
    &Menu::Modification,
    &Menu::DisplyData,
    &Menu::Save
};

void _Fun(Data *&d,int flag)
{
  Select_Fun  _funselect = _SSL[flag];
   (MM.*_funselect)(d);
}

void MenuSelect(Data *&d)
{
    int input=0;
    while(scanf("%d",&input)!=EOF)
    {
        if(input <1 || input>9)
        {
            cout<<"输入范围在1~9,请重新输入"<<endl;
            continue;
        }
        _Fun(d,input);
        MM.Welcome();
    }
}

0 人点赞