枚举的应用

自学类容:枚举的应用

2016.09.17

为了装装逼,正值中秋放假之际,书带着哥来到了图书馆,看数据结构时,发现用的是C语言版,可是哥学C已经过去三年了,哥全忘了啊。

于是去外面买了一本谭老师的C程序设计。以题入手来看,就看了一下使用枚举类型。

所谓“枚举”就是指把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。

声明枚举用enum开头。例如:

enum Weekday{sun,mon,tue,wed,thu,fri,sat};

一般形式为枚举名应遵循标识符的命名规则。

enum [枚举名] {枚举元素列表};

其中

例:

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

解题思路:球只能是5种颜色之一,而且要判断各球是否同色,可以用枚举类型变量处理。

设某次取出的3个球的颜色分别为i,j,k。根据题意,i,j,k分别是5种色球之一,并要求3球颜色各不相同,即:i!=j,i!=k,j!=k。可以用穷举法,即把每一种组合都试一下,看哪种符合条件,就输出i,j,k。

算法如下图1所示。



 

 为了输出3个球的颜色,显然应经过三次循环,第一次输出i的颜色,第二次输出jd1颜色,第三次输出k的颜色。在三次循环中先后将i,j,k赋值给pri。然后根据pri的值输出颜色信息。

如图2



 

#include<stdio.h>
int main(){
    enum Color {red,yellow,blue,white,black};//声明枚举类型enum Color
	enum Color pri;                      //定义枚举变量i,j,k,pri
    int i,j,k,n,loop;
	n=0;
	for(i=red;i<=black;i++)              //外循环使i的值从red变到black
		for(j=red;j<=black;j++)      //中循环使j的值从red变到black
			if(Color(i)!=Color(j))
			{
				for(k=red;k<=black;k++)
					if((Color(k)!=Color(i))&&(Color(k)!=Color(j)))
					{
					n=n+1;
					printf("%-4d",n);//输出当前是第几个符合条件的组合
					for(loop=1;loop<=3;loop++){
						switch(loop){
						case 1:pri=Color(i);break;
						case 2:pri=Color(j);break;
						case 3:pri=Color(k);break;
						default:break;
						}
						switch(pri){
                      //根据球的颜色输出响应的文字
						case red:printf("%-10s","red");break;

						case yellow:printf("%-10s","yellow");break;

						case blue:printf("%-10s","blue");break;

						case white:printf("%-10s","white");break;

						case black:printf("%-10s","black");break;

						default: break;
						}
					}
					printf("\n");
					}
			}
			printf("\ntotal:%5d\n",n);
			return 0;
}

 值得注意的是:enum类型是不能执行i++,j++,k++的,所以先定义int i,j,k, 用 color强制转化成enum类型 (color)i, (color)j,(color)k。

运行结果:



 

猜你喜欢

转载自3056434592.iteye.com/blog/2324672
今日推荐