一.在探究枚举类型之前,我们来探求一下C的数据的类型有哪些?
程序的核心就是算法,算法的处理对象就是数据。数据在程序中表现为不同的数据类型,不同的数据类型可以构造出不同的数据结构。处理相同问题时,数据结构不同,算法可能就不同。
C语言的数据类型有:基本类型,构造类型,指针类型,空类型。
基本类型又简单分为:整型,字符型,浮点型。
构造类型分为:数组,结构体,共用体,枚举类型。
二.变量和数据是一个概念吗?
算法的处理对象就是数据,而数据在程序中的表现形式就是变量。这句话不完全正确,数据在程序中有常量与变量之分。算法处理的数据既可以是变量,也可以是常量,也可以同时存在。
变量与变量之间可能会有关联,数据与数据之间也会存在某种关联,这种关联就产生了构造类型的数据类型。我们研究数据类型,主要看它是常量还是变量,这会影响它的存储位置,占用空间的大小,连续性等。而我们研究变量,不仅包括这些,还有变量的作用域,变量的存储类型等。
三.为什么要有枚举类型(enum)?
通常变量的值在程序编写之前我们可以知道他应该是什么类型,也可以预测变量的变化范围,但我们很难预测这个变量具体有哪些值?现在如果有一个变量在程序编写时,就能预测到它的几种可能的值,就可以把它定义为枚举类型。定义成枚举类型的变量,它的取值只限于列举出来的值的范围之内,这个范围相当于一次更精准的预测。枚举通常用来定义一个集合,这个集合更贴近对对象(变量)的描述。
四.声明了一个枚举类型和定义了一个枚举类型的变量是一个概念吗?
不是。
声明一个枚举类型: enum weekday {sun,mon,tue,wed,thu,fri,sat}; (分号勿忘)
用已经声明的枚举类型来定义一个枚举类型的变量: enum weekday workday;
声明时同时定义枚举变量:enum weekday {sun,mon,tue,wed,thu,fri,sat} workday;
enum 枚举名{
枚举元素[=整型常数],
枚举元素[=整型常数],
...
枚举元素[=整型常数] (最后一个成员可省略 ",")
} 枚举变量;
注:枚举元素是用户定义的标识符,其意义完全由程序员决定。
枚举元素在C编译中,按常量处理,这意味着枚举元素在程序运行中不能改变其值。
枚举元素作为常量,它有一个初始值。如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始, 顺次赋给标识符0, 1, 2, ...。但当枚举中的某个成员赋值后, 其后的成员按依次加1的规则确定其值。初始值可以赋负数。
对枚举变量的赋值必须是枚举元素列表中存在的标识符,不可以是一个整型常数。除非用强制类型转换。
五.编程举例
口袋中有红,黄,蓝,白,黑5种颜色的球若干个,每次从口袋中先后取出3个球,问得到3种不同色的球的可能的取法,输出各种排列的情况?
1.第一个问题面对这样的编程需要多少个变量?
从题目中可以看出有3个球,对应的也有三个变量,我们先命名为i,j,k。可能的取法?对应的也有一个变量,我们先命名为n。这些变量是明显可以看出来的,还需要从完成的任务中去思考变量。这里需要完成的任务不仅是找到可能的多少种取法?还有输出的要求?要完成输出的这样的任务,我们还需要多少变量了?首先我们对每种排列要输出3次,这里3次对应一个变量loop,在比较容易忘记的是枚举元素通常是标识符,我们要把这些标识符转换成字符串来输出,我们需要一个变量起中间桥梁的作用。
2.第二个问题各变量应当是什么样的数据类型?
具体变量具体对待。不在分析。
3.第三个问题变量的初值?
具体变量具体对待。不在分析,通常建立变量定义时就赋一个初值。
4.第四个问题变量之间有无明显的关联?
i,j,k;两两互不相等。
5.第五个问题用什么算法可以实现?
穷举法
#include<stdio.h>
enum color {red,yellow,blue,white,black};//对于构造数据类型通常建立是全局性质的
viod EnumToString(enum color pri) //定义一个函数实现枚举元素的字符串显示
{
switch(pri)
{
case red: printf("-10s","red");break;
caseyellow: printf("-10s","yellow");break;
caseblue: printf("-10s","blue");break;
casewhite: printf("-10s","white");break;
caseblack: printf("-10s","black");break;
}
}
void main()
{
enum
color i,j,k;
char n=0,loop=1;
for(i=red;i<=black;i++)
for(j=red;j<=black;j++)
if(i!=j)
{
for(k=red;k<=black;k++)
if((k!=j)&&(k!=i))
{
n=n+1; //找出了可能的取法,这是要完成的任务一,
printf("-4d",n); //完成任务二,输出各种排列的情况。
for(loop=1;loop<=3;loop++)
{
EnumToString(i);
EnumToString(j);
EnumToString(k);
}
}
}
}