共同体以及枚举类型 C语言 |
§10.8 共用体 一、共用体的概念当需要把不同类型的变量存放到同一段内存单元,或对同一段内存单元的数据按不同类型处理,则需要使用“共用体”数据结构。 例、把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。 共用体的定义形式: union 共用体名 { 成员列表; }变量列表; 例、
“共用体”:各成员占相同的起始地址,所占内存长度等于最长的成员所占内存。 “结构体”:各成员占不同的地址,所占内存长度等于全部成员所占内存之和。 二、共用体变量的引用 只能引用共用体变量的成员,如、 union data a; a.i; a.ch; a.f; 三、共用体类型数据的特点 1、共用体变量中的值是最后一次存放的成员的值,如、 a.i = 1; a.ch = 'a'; a.f = 1.5; 完成以上三个赋值语句后,共用体边量的值是1.5,而a.i=1和a.ch='a'已无意义。 2、共用体变量不能初始化,例、 union data { int i; char ch; float f; }a={1,'a', 1.5}; [例10.11] 设有若干个人员的数据,其中有学生和教师。学生数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、职务。如图、 要求输入人员数据,然后输出。 分析:学生数据的class(班级)和教师数据的position(职务)类型不同,但在同一表格中,使用“共用体”数据结构。 struct { int num; char name[10]; char sex; char job; union { int class; /* 班级 */ char position[10]; /* 职务 */ }category; }person[2]; /* 2个人员数据 */ void main() { int i; for(i=0;i<2;i++) /* 输入2个人员的数据 */ { scanf("%d %s %c %c", &person.num, &person.name, &person.sex, &person.job); if(person.job == 'S') /* 学生 */ scanf("%d", &person.category.class); /* 输入班级 */ else if(person.job == 'T') /* 教师 */ scanf("%s", person.category.position); /* 输入职务 */ else printf("Input error!"); } printf("\n"); printf("No. name sex job class/position\n"); for(i=0;i<2;i++) /* 输出 */ { if (person.job == 'S') printf("%-6d%-10s%-3c%-3c%-6d\n",person.num, person.name, person.sex, person.job, person.category.class); else printf("%-6d%-10s%-3c%-3c%-6s\n",person.num, person.name, person.sex, person.job, person.category.position); } }
§10.9 枚举类型 如果一个变量只有几种可能的值,可以定义为枚举类型。“枚举”:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。 用关键字enum定义枚举类型:例、 enum weekday {sun, mon, tue, wed, thu, fri, sat}; weekday是枚举类型名,可以用于定义变量,如、 enum weekday workday, week_end; 定义了两个枚举变量:workday,week_end, 它们只能取sun到sat之一,如、 weekday = mon; week_end = sun; sun、mon、....、sat称为“枚举元素”或“枚举常量”。 说明: 1、枚举元素是常量。在C编译器中,按定义的顺序取值0、1、2、...。 例、 weekday = mon; printf("%d", weekday); 输出整数1。 2、枚举元素是常量,不是变量,因此不能赋值。 sun = 0; mon = 1; 但在定义枚举类型时,可以指定枚举常量的值,如、 enum weekday {sun=7, mon=1, tue, wed, thu, fri, sat}; 此时,tue、wed、...的值从mon的值顺序加1。如,tue=2。 3、枚举值可以作判断,例、 if (weekday == mon).... if (weekday > sun).... 4、整型与枚举类型是不同的数据类型,不能直接赋值,如、 workday = 2; /* workday是枚举类型 */ 但可以通过强制类型转换赋值,如、 workday = (enum weekday)2; [例10.12] 口袋里有红、黄、蓝、白、黑五种颜色的球若干个。每次从口袋中取出三个球,打印出三种不同颜色球的可能取法。 分析:球的颜色只可能取五种值,用枚举类型变量处理。 #i nclude "stdio.h" void main() { enum color {red, yellow, blue, white, black}; /* 枚举类型 */ enum color i,j,k,pri; int n,loop; n = 0; /* 不同颜色的组合序号 */ for(i=red; i<=black; i++) for(j=red; j<=black; j++) if (i != j) { for(k=red; k<=black; k++) if ((k != i) && (k != j)) { n = n + 1; printf("%-4d",n); /* 组合序号 */ for(loop = 1;loop<=3; loop++) /* 循环输出三个球的颜色 */ { switch(loop) { case 1: pri = i; break; /* 第1个球 */ case 2: pri = j; break; /* 第2个球 */ case 3: pri = k; break; /* 第3个球 */ default: break; } switch(pri) { case red: printf("%-10s","red"); break; case yellow: printf("%-10s","yellow"); break; case blue: printf("%-10s","blue"); break; case white: printf("%-10s","white"); break; case black: printf("%-10s","black"); break; default: break; } } printf("\n"); } } printf("\n total:%5d\n", n); |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |