枚举类型的探究

一.在探究枚举类型之前,我们来探求一下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);

               }

        }

       }

}


     




    


    


    

       


    

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值