一提到switch,难免出来许多case,代码长而不爽,工程效率也大大下降。
举例说明:
一个学生管理系统,定义各种菜单栏,用户在控制台进行输入,由输入自主选择菜单。
1. 菜单栏声明如下,具体实现略去
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常规写法:
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之一:
//定义的函数类型,返回值与形参与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之二:
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();
}
}