题目:
口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中先后取出3个球,问得到3种不同颜色的球的可能取法,输出每种排列的情况。要求声明枚举类型来表示红、黄、蓝、白、黑5种颜色。
分析:
首先例举情况,注意是先后有顺序要求。一个一个情况的去试也就是穷举法是计算机最擅长的,for循环做起来之后考虑不能同色if switch 语句条件判断之后作输出。
代码展示:
#include <stdio.h>
int main()
{
enum Color {
red,yellow,blue,white,black}; //声明枚举类型enum Color 注意其中所含均为常量是可以赋值给定义的变量(别被其名称混淆)
enum Color i,j,k,pri; //定义枚举变量i,j,k,pri
int n,loop;
n=0;
printf("Output:\n");
for (i=red;i<=black;i++) //外循环使i的值从red变到black
for (j=red;j<=black;j++) //中循环使j的值从red变到black
if (i!=j) //如果二球不同色
{
for (k=red;k<=black;k++) //內循环使k的值从red变到black
if ((k!=i) && (k!=j)) //如果3球不同色
{
n=n+1; //符合条件的次数加1
printf("%-4d",n); //输出当前是第几个符合条件的组合
for (loop=1;loop<=3;loop++) //先后对三个球分别处理
{
switch (loop) //loop的值从1变到3
{
case 1: pri=i;break; //loop的值为1时,把第1球的颜色赋给pri
case 2: pri=j;break; //loop的值为2时,把第2球的颜色赋给pri
case 3: pri=k;break; //loop的值为3时,把第3球的颜色赋给pri
default:break;
}
switch (pri) //根据球的颜色输出相应的文字
{
case red:printf("%-10s","red"); break; //pri的值等于枚举常量red时输出“red”
case yellow: printf("%-10s","yellow"); break; //pri的值等于枚举常量yellowd时输出“yellow”
case blue: printf("%-10s","blue"); break; //pri的值等于枚举常量blue时输出“blue”
case white: printf("%-10s","white"); break; //pri的值等于枚举常量white时输出“white”
case black: printf("%-10s","black"); break; //pri的值等于枚举常量black时输出“black”
default :break;
}
}
printf("\n");
}
}
printf("\ntotal:%5d\n",n);
return 0;
}
枚举类型的好处据我所见在于它可以把看似为字符串变量的名称作为常量且可赋值给变量便于输出。