枚举类型:枚举类型的定义是:在这种类型中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。
枚举类型是一个钟基本数据类型和int,float double这种基本类型一样,而不是一种构造类型,因为他不能再分解为任何基本类型
枚举类型的定义和枚举变量的说明:
枚举类型的定义的一般形式为;
enum 枚举名{枚举表};// 在枚举表中应该罗列出所用可用的值。这些值也被称为枚举元素
2.枚举变量的说明:
如同结构和联合一样,枚举变量也可以用不同的方式说明,即先定义后说明,同时定义说明或者直接说明
例如:
enum weekday{sun,mon,tue,wed,thu,fri,sat};
enum weekday a, b, c;
或者:
enum weekday{Sun,Mon,Tue,Wed,The,Fri,Sat} a,b,c;//a,b,c为枚举变量
或者:
enum {Sun,Mon,Tue,Wed,The,Fri,Sat};
枚举变量的赋值和使用:
枚举类型在使用中有以下规定:
1.枚举值是常量不是变量。不能再程序中用赋值语句再对他赋值
2.枚举元素本身有系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2,3,4....
例子1:
int main()
{
enum weekday
{
Sun,Mon,Tue,Wed,Thu,Fri,Sat
}a,b,c;
a = Sun;
b = Mon;
c = Tue;
printf("%d,%d,%d\n", a, b, c);
return 0;
}
我们只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量;如果一定要把数值赋予给枚举变量则必须强制转换类型
如:a =(enum weekday)2;
枚举元素不是字符常量也不是字符串常量,使用时不要加单,双引号
例子2
enum body
{
a, b, c, d
}month[31], j;
int main()
{
int i;
j = a;
for (i = 1; i <= 30; i++)
{
month[i] = j;
j++;//对这个枚举类型变量j执行j++操作,想要指向下一个枚举元素,在vs中无法实现,需要自己编写一个函数
if (j > d) j = a;
}
for (i = 1; i <= 30; i++)
{
switch (month[i])
{
case a:printf("%2d %c\t", i, 'a'); break;
case b:printf("%2d %c\t", i, 'b'); break;
case c:printf("%2d %c\t", i, 'c'); break;
case d:printf("%2d %c\t", i, 'd'); break;
default:break;
}
}
printf("\n");
return 0;
}
例子3:
int main()
{
enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun}day;
int i = 0;
while (1) {
printf("请输入一个数值:\n");
scanf_s("%d", &day);
if (day == 0)break;
switch (day)
{
case Mon:puts("Monday"); break;
case Tues:puts("Thuesday"); break;
case Wed:puts("Wednesday"); break;
case Thurs:puts("Thursday"); break;
case Fri:puts("Friday"); break;
case Sat:puts("Saturday"); break;
case Sun:puts("Sunday"); break;
default:puts("Error");
}
printf("如果想退出请输入0\n");
}
return 0;
}
1.需要注意的是Mon,Tues,Wed这些标识的作用是范围的全局变量(严格来说就是main主函数内部),不能再定义与他们名字
相同的变量。
2.Mon,Tues,Wed等都是常量,不能对他们赋值,只能将他们的值赋给其他变量
例子4:
``int main()
{
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun }day;
int i = 0;
while (1) {
printf("请输入一个数值:\n");
scanf_s("%d", &day);
if (day == 0)break;
switch (day)
{
case 1:puts("Monday"); break;
case 2:puts("Thuesday"); break;
case 3:puts("Wednesday"); break;
case 4:puts("Thursday"); break;
case 5:puts("Friday"); break;
case 6:puts("Saturday"); break;
case 7:puts("Sunday"); break;
default:puts("Error");
}
printf("如果想退出请输入0\n");
}
return 0;
}
枚举类型变量需要存放的是一个整数,那么他的长度和int长度应该是相同的
例子:
int main()
{
enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun}day = Mon;
printf("%d,%d,%d,%d,%d\n", sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed),sizeof(int));
return 0;
}
例子5枚举类型的排列组合
enum yaunsu
{
a,b,c,d,e,f,g
};
int main()
{
int i = 0,j = 0, k = 0;
void pailie(int, int, int);
pailie(i, j, k);
return 0;
}
void pailie(int i, int j, int k)
{
int sum = 0, loop = 0, loop1;
for (i = a; i <= g; i++)
{
for (j = a; j <= g; j++)
{
if (i != j)
{
for (k = a; k <= g; k++)
{
if (k != i && k != j)
{
sum++;
printf("第%d中组合方式为:", sum);
for (loop = 0; loop < 3; loop++)
{
switch (loop)
{
case 0:loop1 = i;
break;
case 1:loop1 = j;
break;
case 2:loop1 = k;
break;
default:
break;
}
switch (loop1)
{
case 0:printf("a ");
break;
case 1:printf("b ");
break;
case 2:printf("c ");
break;
case 3:printf("d ");
break;
case 4:printf("e ");
break;
case 5:printf("f ");
break;
case 6:printf("g ");
break;
default:break;
}
}
//Sleep(1000);
printf("\n");
}
}
}
}
}
}