首页 理论教育 C语言程序设计中的枚举类型及其应用

C语言程序设计中的枚举类型及其应用

时间:2026-01-27 理论教育 蝴蝶 版权反馈
【摘要】:如:enum weekday{sun,mon,tue,wed,thu,fri,sat};定义了一个枚举类型weekday,其中sun~sat称为枚举元素或枚举常量,说明该类型只有这7个常量值。定义枚举类型时列举出的枚举常量是有值的,一般系统按定义时的顺序从0依次给枚举常量一个唯一的顺序编号。也可以由程序员在定义枚举类型时给枚举常量指定值。枚举变量可以被枚举常量赋值,这是枚举类型中最基本的运算,如w=tue。

在日常使用中,有些数据取值范围非常小,其中仅有有限的几种取值可能,比如一年中的月份,只能是1~12月,一周中的日期只能是星期一到星期日,但如果将月份或一周中的日期定义为int类型,则其取值范围就是-3276783648~3276783647,这远远超出了原有的取值范围。为了解决这一问题,C语言中允许用户自己定义一种数据类型,定义时将此类型中所有可以用到的值一个个列举出来,这就是所谓的枚举类型。

1.枚举类型定义

其一般定义形式为:

enum枚举类型名{常量列表};

其enum是枚举类型标识符,枚举类型名由用户自己定义,花括号中的常量列表是该类型值的集合,一一枚举出该类型中可以使用到的所有的值,是该类型中可以使用的常量。如:

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

定义了一个枚举类型weekday,其中sun~sat称为枚举元素或枚举常量,说明该类型只有这7个常量值。

2.枚举类型变量的定义

有了枚举类型名字后,可以使用该类型名来定义枚举类型的变量,如:

enum weekday w;

则w是weekday类型的一个变量,该变量只能保存sun~sat中的任意一个值,如:

w=tue;

这是一个正确的用法。需要注意的是,在使用枚举类型常量时,必须严格按照定义中的常量值使用,如:

w=tuesday;

这是一个错误的用法,计算机不会自动理解tue和Tuesday代表同一天,它只是严格地按照枚举类型定义中列出的常量来使用。

使用枚举类型时,应注意以下几点:

(1)枚举类型只适用于可能取值非常少的情况,否则列举出所有可能值也是一个非常烦琐的工作

(2)定义枚举类型时列举出的枚举常量是有值的,一般系统按定义时的顺序从0依次给枚举常量一个唯一的顺序编号。例如weekday类型中,sun的值为0,mon的值唯一,以此类推。

也可以由程序员在定义枚举类型时给枚举常量指定值。如:

enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};

此处指定sun的值为7,mon的值为1,对于没有指定值的枚举常量,系统从左边最近的编号开始向后自动编号,如tue的值此处为2。若将定义修改如下:

enum weekday{sun=7,mon,tue,wed,thu,fri,sat};

则mon、tue等常量的值依次为8、9…等。

(3)枚举变量可以被枚举常量赋值,这是枚举类型中最基本的运算,如w=tue。但是应注意,虽然每一个枚举常量有一个整型值,但此值是系统中使用,在赋值时,不能给枚举常量直接赋整型值,如:

w=3;

这是一个错误的用法,因为3是整型值,而w是枚举类型变量,赋值号两边类型不匹配。可以使用强制类型转换:

w=(enum weekday)3;

此时将整型数据3强制转换成其对应的枚举常量wed赋给w,这是正确的。

(4)枚举类型可以做关系运算,比较两个枚举类型的变量的大小时,系统是按照枚举常量的顺序号比较大小,如:

输出值为0,因为没有指定顺序号时,系统从0开始编号,此时sun<mon。

若将定义修改为:

则:

输出结果为1。

虽然枚举类型也能进行一些其他的运算,但在编程时一般很少用到,主要用的也就是赋值和比较两类。

在例8-11中,可以将数据表定义形式修改如下:(https://www.xing528.com)

程序中可以使用枚举常量进行身份判断,如:

请大家体会枚举类型在这里的用法并依照此思想修改例8-11。

综合实训

1.用动态数组定义学生信息表,并按照给定的学号或姓名分别查询指定学生的信息。

2.用单链表定义学生信息表,并按照给定的学号或姓名分别查询指定学生的信息。

课后习题

一、单项选择题

1.当定义一个结构体变量时,系统为它分配的内存空间是(  )。

A.结构体中的第一个成员所需的内存容量

B.结构体中占内存最大的成员所需的内存容量

C.结构体中每一个成员所需内存容量之和

D.大于等于结构体中每一个成员所需内存容量之和

2.如有定义:

以下输入语句中正确的是(  )。

A.scanf(”%d”,&s)B.scanf(”%d”,&s.num)

C.scanf(”%d”,s)D.scanf(”%s”,&s)

3.如有定义:

则执行printf("%d",s[0].x*s[1].x)语句后输出的值是(  )。

A.2 B.6    C.12     D.3

4.如有定义:

则以下引用中不正确的是(  )。

A.p.id B.n.id C.p->data D.(*p).data

5.有定义如下:

则执行语句printf(“%d%s\n”,p->num,p++->name)后,输出结果为(  )。

A.2 Tom B.3 John C.3 Karl D.2 John

二、程序设计题

1.定义一个表示日期的结构体变量(包含年、月、日三个成员),计算该日是本年中的第几天。

2.每一个学生的信息中包含学号、姓名和三门课的成绩,在主函数中输入n和n个学生的信息,并定义一个print函数,打印出这n个学生的信息。

3.每一个学生的信息中包含学号、姓名和三门课的成绩,在主函数中输入n和n个学生的信息,并定义一个search函数,按学号查找某个学生是否存在,若找到则返回该学生在结构体数组中的地址,否则返回“Not Found”。

4.每一个学生的信息中包含学号、姓名和三门课的成绩,在主函数中输入n和n个学生的信息,并定义一个sort函数和一个print函数,用sort函数按总成绩从高到低排序,若总成绩相等则按姓名从小到大排序,并用print函数打印出排序后的结果。

5.请输入n和n个整数,用前插法建立一带有头结点的单链表,并输出该链表。

6.假设有一个带有头结点的单链表,请编程完成单链表的就地逆置。所谓就地逆置是指不允许重新开辟结点。

7.有两个按照值递增排序的单链表,请编写程序将两个单链表合并成一个单链表,要求合并后仍按值递增排序,并且链表中不允许出现重复数据。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈