【例10.1】高校学生的课程设置中,有些课程是必修课,有些是选修课程,各门课程的考核方式不同,必修课采用百分制,选修课可以采用百分制和五级制(如'A'、'B'、'C'、'D'、'E')两种。学生在完成学校规定的课程的同时,可以根据需要选择自己感兴趣的一些课程。假设某个学期有三门选修课程:统计学(百分制)、电脑维护(百分制)、旅游管理(五级制),每位学生只能选择其中一门。编程实现输入若干个学生的成绩,统计各门选修课的人数并分别输出选修课的成绩。
1.共用体类型
共用体,也叫联合体,是一种用户自定义的构造数据类型,它使几个不同类型的变量共占同一段内存。即在计算机的内存中分配一个特殊的存储空间,该存储空间是由若干个连续的内存单元构成的,各种不同类型的数据均可以存放在该存储空间中。共用体实质上是采用了覆盖技术,使几个变量互相覆盖。
声明一个共用体类型的一般形式为:
union 共用体名
{ 类型名 成员名1;
类型名 成员名2;
……
类型名 成员名n;
};
关键字union是共用体类型的标志,“union 共用体名”共同构成共用体类型。注意括号后的分号是不可少的。
2.共用体变量
声明了共用体类型后就可以用它来定义共用体变量了,和结构变量的定义方法一样,定义共用体变量的方法也有三种:
方法一:先声明共用体类型,然后再定义共用体变量
方法二:声明共用体类型的同时定义共用体变量
方法三:直接定义共用体变量
3.共用体数组和共用体指针变量
声明了共用体类型后,也可以定义共用体数组和共用体指针变量,定义和使用方法同共用体变量。
(1)由于共用体变量只有一个成员起作用,因此对共用体变量的初始化只能有一个初始值,也可以不加花括号。
(2)不能同时对共用体变量的所有成员进行初始化。
(3)共用体变量的初始化操作实际上是对其第一个成员进行的初始化。如果初始值的类型与第一个成员的类型不同,则系统会进行自动类型转换。
1.共用体变量的使用
定义了共用体变量后就能在程序中引用它了,但是不能整体引用共用体变量,而只能引用共用体变量中的成员,并且不能同时引用多个成员,在某一时刻,只能使用其中之一的成员。
对于共用体变量成员的引用也是通过成员运算符“.”进行的,引用方式为:
共用体变量名.成员名
2.共用体变量作为参数
与结构变量类似,共用体变量可以作为参数进行传递。共用体作为实参传递的是共用体变量的值,也可以使用共用体数组或共用体指针传递地址。
3.共用体和结构的嵌套
共用体和结构可以嵌套使用,即结构中的成员可以是共用体,共用体中的成员也可以是结构。引用内部成员的方式如下:
结构变量.共用体变量.成员
共用体变量.结构变量.成员
【例9.10】某餐厅用西瓜、桃子、草莓、香蕉、菠萝、苹果六种水果制作水果拼盘,要求每个拼盘中有四种不同水果。编写程序计算可以制作出多少种这样的水果拼盘。
1.枚举类型
声明一个枚举类型的一般形式为:
enum 枚举名{ 枚举值列表 };
(1)关键字enum是枚举类型的标志,“enum 枚举名”构成枚举类型。
(2)枚举是一个集合,集合中的元素(称为枚举成员或枚举常量)是一些特定的标识符,元素之间用逗号隔开。
(3)在枚举类型中,枚举成员是有值的,第一个枚举成员的默认值为0,后续成员的值依次递增。
(4)枚举成员是常量,不能对它们赋值。如“red=1;”是错误的。但是在定义枚举类型时可以指定枚举成员的值。
(5)同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员。
2.枚举变量
声明了枚举类型后,可以使用它来定义枚举变量,定义的方法与结构、共用体类似,有以下三种形式:
形式一:先定义枚举类型,然后定义枚举变量
形式二:定义枚举类型的同时定义枚举变量
形式三:直接定义枚举变量
使用枚举变量时需注意:
(1)枚举变量的值只能为枚举类型中列举出来的枚举成员。
(2)枚举成员不是字符常量或字符串常量,使用时不能加单引号或双引号。
(3)不能将一个数值直接赋值给枚举变量。
1.枚举类型数据的输入输出
枚举类型的数据不能直接进行输入输出。在输入时应先输入其序号,然后使用强制类型转换完成;输出时应先进行转换才能输出其对应的字符串。
2.枚举类型数据的关系运算
同一种枚举类型数据可以进行关系运算,枚举类型数据的比较是对其序号进行比较。
3.枚举类型与sizeof运算符
在C语言中,枚举类型是被当作整型常量来处理的,因此枚举类型占用内存字节数为2,可以使用sizeof运算符来计算。
C语言不仅提供了丰富的数据类型,还允许用户自己定义类型说明符,即允许用户为数据类型取“别名”,类型定义符typedef可用来实现此功能。
使用typedef定义类型说明符的格式为:
typedef 类型标识符 别名;
其中,类型标识符可以是C语言中的基本数据类型或者是构造数据类型。
使用typedef定义类型的步骤如下:
(1)按定义变量方法写出定义体,如:int i;
(2)将变量名换成新类型名,如:int INTEGER;
(3)最前面加typedef,如:typedef int INTEGER;
(4)用新类型名定义变量,如:INTEGER i,j;