C++枚举取彩球练习

#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;
}

猜你喜欢

转载自www.cnblogs.com/hyby/p/13401605.html