口袋中有红、黄、蓝、白、黑5种颜色的球若干。每次从口袋中任意取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况

        如果一个变量只能有几种可能的值,可以定义为枚举(enumeration)类型。所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。

        声明枚举类型用enum开头。例如:
        enum weekday{sun,mon,tue,wed,thu,fri,sat};
上面声明了一个枚举类型weekday,花括号中sun,mon,…,sat等称为枚举元素枚举常量。表示这个类型的变量的值只能是以上7个值之一,它们是用户自己定义的标识符。
        声明枚举类型的一般形式为
        enum 枚举类型名 {枚举常量表};
在声明了枚举类型之后,可以用它来定义变量。如
        weekday workday,week_end;
这样,workday和weck_end被定义为枚举类型weekday的变量。
        在C语言中,枚举类型名包括关键字enum,以上的定义可写为
        enum weekday workday,week_end;
在C++中允许不写enum,但保留了C的用法。
        根据以上对枚举类型weekday的声明,枚举变量的值只能是sun~sat。例如:
        workday=mon;
        week_end=sun;
是正确的。也可以在声明枚举类型的同时定义枚举变量,如
        enum{sun,mon,tue,wed,thu,fri,sat} workday,week_end;
        需要指出的是:枚举元素的名字本身并没有特定的含义。例如不因写成sun或sunday就自动代表"星期天",它只是一个符号,究竟用来代表什么含义,完全由程序员考虑,并在程序中对它们作相应的处理。
        说明:
        (1)枚举元素按常量处理,故称枚举常量。它们不是变量,不能对它们赋值,即枚举元素的值是固定的。例如:
        sum=0;mon=0;         //错误,不能用赋值语句对枚举常量赋值
        (2)枚举元素作为常量,它们是有值的,其值是一个整数,编译系统按定义时的顺序对它们赋值为0,1,2,3,…。在上面的声明中,sum的值为0,mon的值为1,……,sat的值为6。如果有赋值语句:
        workday=mon;          //把枚举常量mon的值赋给枚举变量workday, workday的值等于1
这个值是可以输出的。如
        cout<<workday;        //输出整数1,而不是字符mon
也可以在声明枚举类型时自己指定枚举元素的值,如
        enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};

指定 sun 为 7,mon=1,以后按顺序加1,sat为6。

        (3)枚举值可以用来做判断比较,按整数比较规则进行比较。如
        if(workday==mon)...        //判定workday的值是否等于mon
        if(workday>sun)...           //判定workday的值是否大于 sun
        按其在声明枚举类型时的顺序号比较。如果定义时未另行指定,则第1个枚举元素
的值为0。故mon>sun,sat>fri。
        (4)不能把一个整数直接赋给一个枚举变量,枚举变量只能接受枚举类型数据。如                        workday=tue;        //正确,把枚举常量赋给枚举变量
        workday=2;           //错误,它们属于不同的类型
应先进行强制类型转换才能赋值。如
        workday=(weekday)2;        //这是从C语言继承下来的强制类型转换形式

        workday=weekday(2);        //这是C++风格的强制类型转换形式
以上语句的作用是将顺序号为2的枚举元素赋给workday。相当于
        workday=tue;

解题思路:

        球的颜色只有5种,每一个球的颜色只能是这5种之一,因此可以用枚举类型变量来处理。设某一次取出的球的颜色为i,j,k。显然,i,j,k都是以上5种颜色之一,根据题意,要求i,j,k三者互不相等。可以用穷举法,对每一种可能分别进行测试,看哪一组符合条件。
编写程序:

运行结果:

程序分析:

        用n累计得到3种不同色球、不同排列的次数。外循环使第1个球i从red变到black。中循环使第2个球j也从red变到black。如果i和j同色则不可取,只有i,j不同色(i≠j)时才需要继续找第3个球,此时第3个球k也有5种可能(red到black),但要求第3个球不能与第1个球或第2个球同色,即k≠i,k≠j。满足此条件就得到3种不同色的球。使n加1,输出n和这组3色组合方案。

        问题是如何根据i,j,k的值输出red,blue等单词。不能写成"cout<<red;"来输出"red"字符串。为了输出3个球的颜色,显然应经过3次循环,第1次输出i的颜色,第2次输出j的颜色,第3次输出k的颜色。在3次循环中先后将i,j,k的值赋予pri。然后根据pri的值输出相应的颜色信息。前面已指出:枚举常量只是一个符号,本身并无任何含义,必须由程序编制者在程序中对它作相应的处理,以体现人们心目中的含义。在第1次循环时,pri的值为i,如果i的值为red,则输出字符串"red",表示我们心目中以枚举常量red代表"红色",以此类推。执行程序第12~29行输出一组信息,外循环全部执行完后,全部方案就已输出完了。最后输出总数n。
        有人说,不用枚举常量而用常数0代表"红",1代表"黄"……不也可以吗?是的,完全可以。但显然用枚举变量更直观,因为枚举元素都选用了令人"见名知意"的标识符,而且枚举变量的值限制在定义时规定的几个枚举元素范围内,如果赋予它一个其他值,就会出现出错信息,便于检查。

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值