#include<iostream> #include<iomanip> //setw()函数的头文件 using namespace std; int main() { enum color_set {red,yellow,blue,white,black}; //声明枚举类型color color_set color; int i,j,k,counter=0,loop; //counter是累计不同颜色的组合数 for(i=red;i<=black;i++) { for(j=red;j<=black;j++) { if(i!=j) { //前两个球颜色不同 for(k=red;k<=black;k++) if(k!=i&&k!=j) { //第三个球不同于前两个,满足要求 counter++; if((counter)%22==0) { //每屏显示22行 cout<<"请按回车键继续"; cin.get(); //键入回车后继续 } cout<<setw(15)<<counter; //设置输出的域宽,n表示字段宽度。只对紧接着的输出有效,紧接着的输出结束后又变回默认的域宽 /*下面输出每种取法,一行为一种取法的三个颜色*/ for(loop=1;loop<=3;loop++) { switch(loop) { case 1: color=(color_set) i; break; //第一个是i //枚举可以通过例化名 = (枚举名) 变量名 将变量值的位数赋值给枚举数组,在枚举数组中查询位置即可有对应的数值 case 2: color=(color_set) j; break; //第二个是j case 3: color=(color_set) k; break; //第三个是k } switch(color) { case red: cout<<setw(15)<<"red"; break; case yellow:cout<<setw(15)<<"yellow";break; case blue: cout<<setw(15)<<"blue"; break; case white: cout<<setw(15)<<"white"; break; case black: cout<<setw(15)<<"black"; break; } } cout<<endl; //输出一种取法后换行 } } } } cout<<"共有:"<<counter<<"种取法"<<endl; return 0; }
这样的话需要多一步转义才能让color输出枚举体内的标识符;
所以运用双重宏来做一个改进:
#include<iostream> #include<iomanip> //setw()函数的头文件 using namespace std; #define show(x) case x: return(#x); enum color_set { red, yellow, blue, white, black }; //声明枚举类型color static inline const char *display(enum color_set type) { switch (type){ show(red) show(yellow) show(blue) show(white) show(black) } } int main() { color_set color; int i,j,k,counter=0,loop; //counter是累计不同颜色的组合数 for(i=red;i<=black;i++) { for(j=red;j<=black;j++) { if(i!=j) { //前两个球颜色不同 for(k=red;k<=black;k++) if(k!=i&&k!=j) { //第三个球不同于前两个,满足要求 counter++; if((counter)%22==0) { //每屏显示22行 cout<<"请按回车键继续"; cin.get(); //键入回车后继续 不按回车程序就会等待 } cout<<setw(15)<<counter; //设置输出的域宽,n表示字段宽度。只对紧接着的输出有效,紧接着的输出结束后又变回默认的域宽 /*下面输出每种取法,一行为一种取法的三个颜色*/ for(loop=0;loop<3;loop++) { switch(loop) { case 0: { color=(color_set) i; //第一个是i //枚举可以通过例化名 = (枚举名) 变量名 将变量值的位数赋值给枚举数组,在枚举数组中查询位置即可有对应的数值 cout<<setw(15)<<display(color); } break; case 1: //第二个是j { color=(color_set) j; cout<<setw(15)<<display(color); } break; case 2: //第三个是k { color=(color_set) k; cout<<setw(15)<<display(color); } break; } } cout<<endl; //输出一种取法后换行 } } } } cout<<"共有:"<<counter<<"种取法"<<endl; return 0; }