第11章第8节 §11.8共用体 一共用体的概念 1.什么是共用体 将多种类型数据,放在起始位置(首地址)相同的一段存贮单元,即多种数 据共用一段内存。(但同一时刻,只能放一种类型的数据) 2.共用体类型及共用体变量的的定义 )分开定义(先定义类型,后定义变量) union data int i; unIon共用体名 char ch; 成员表列 float f; union共用体名变量表列; nuon data a.b.c 2)同时定义 union data unon共用体名 char cha 成员表列 float f: }变量表列; 3 a, b, c; 3)直接定义 union unIon 成员表列 char ch; float f: }变量表列 3 a, b, c;
第11章第8节 §11.8 共 用 体 一. 共用体的概念 将多种类型数据, 放在起始位置(首地址)相同的一段存贮单元, 即多种数 据共用一段内存。(但同一时刻,只能放一种类型的数据) 1. 什么是共用体 2). 同时定义 union 共用体名 {成员表列 } 变量表列; union data {int i; char ch; float f; } a,b,c; 3). 直接定义 union {int i; char ch; float f; } a,b,c; union {成员表列 } 变量表列; 1). 分开定义(先定义类型,后定义变量) 2. 共用体类型及共用体变量的的定义 union 共用体名 {成员表列 }; union 共用体名 变量表列; union data {int i; char ch; float f; }; nuion data a,b,c;
第11章第8节 3.共用体类型与结构体类型的区别 结构体 种类型数据的组合,成员同时存在; 个结构体变量占内存:成员字节总和。 共用体 员不同时存在,某一时刻只有一个成员占用内存。 个共用体变量占内存:成员中最长字节 struct data union data Hint i; char ch char ch: float f; float f: ,y,2, 占字节数:2+1+4=7字节 占字节数:max{2,1,4}=4字节 共用体变量的引用 只能引用成员,不能引用共用体变量 printf("%d, a. i) printf(°xx 三共用体类型数据的特点 1.某一时刻只能放一种数据;并且是最近一次放入的数据。 2.共用体变量和各成员的地址相同;
第11章第8节 3. 共用体类型与结构体类型的区别 结构体 —— 多种类型数据的组合,成员同时存在; 一个结构体变量占内存:成员字节总和。 共用体 —— 成员不同时存在,某一时刻只有一个成员占用内存。 一个共用体变量占内存:成员中最长字节 union data {int i; char ch; float f; } a,b,c; struct data {int i; char ch; float f; } x,y,z; 占字节数:2+1+4=7字节 占字节数:max{2,1,4}=4字节 二. 共用体变量的引用 只能引用成员,不能引用共用体变量 printf(“%d”,a.i); printf(“%d”,a); 三. 共用体类型数据的特点 1. 某一时刻只能放一种数据;并且是最近一次放入的数据。 2. 共用体变量和各成员的地址相同;
第11章第8节 3.共用体变量不能初始化 union char ch fotf}a={1,a,1.5} 4.共用体变量不能用函数参数(新标准可以) 5.可以定义共用体数组unon f int i char ch float f, al 6共用体、结构体可以嵌套「共用体中包含结构体 结构体中包含共用体。 四.共用体的应用 1.同一个数据区间,根据不同的情况,存放不同类型的数据。 例:11.12 教师数据:身份证号,姓名,性别,职业,工资}→整型数 学生数据:身份证号,姓名,性别,职业,班级 →字符的广类型不同
第11章第8节 3. 共用体变量不能初始化 union { int i; char ch; float f;} a={1,’a’,1.5} 4. 共用体变量不能用函数参数(新标准可以) 5. 可以定义共用体数组 union { int i; char ch; float f;} a[10]; 6. 共用体、结构体可以嵌套 共用体中包含结构体; 结构体中包含共用体。 四. 共用体的应用 1. 同一个数据区间,根据不同的情况,存放不同类型的数据。 例:11.12 教师数据: 身份证号,姓名,性别,职业,工资 学生数据: 身份证号,姓名,性别,职业,班级 类型不同 整型数 字符串
include stdio. h' 第11章第2节 struct &char c 201 a[30]; char sex char job 结构体中含共用体 union int w har cla[201: )ca maint i struct p m[2] int i: float f printf("input data: " for(=0,i<2;i++ ( scanf("%s%s%C%", mi]. c,mi na, &m[]. sex, &mi] job if(m i].job==].job=='T) scanf(%d", &mi. ca w); 如职业为“t或‘T,输入工 else scanf("%s", m i cacla); 气资 否则输入班级 for(=0,i<2;i++) printf("%os, %os, %C, %c, " mi]. c, mi]. na, mi]. sex, mj] job); if(m(1]job==t'l m[i]. job-==T printf("%din",m([].ca w) else printf("%osn", mi]. ca cla); 3
# include"stdio.h" struct p {char c[20]; char na[30]; char sex; char job; union{ int w; char cla[20];} ca; } main() { struct p m[2]; int i; float f; printf("input data: "); for(i=0; i<2; i++) {scanf("%s %s %c %c",m[i].c,m[i].na,&m[i].sex,&m[i].job); if(m[i].job=='t'|| m[i].job=='T') scanf("%d",&m[i].ca.w); else scanf("%s",m[i].ca.cla); } for(i=0; i<2; i++) {printf("%s,%s,%c,%c,",m[i].c, m[i].na, m[i].sex, m[i].job); if(m[i].job=='t'|| m[i].job=='T') printf("%d\n", m[i].ca.w); else printf("%s\n",m[i].ca.cla);} } 第11章第2节 如职业为‘t’或‘T’,输入工 资 否则输入班级 结构体中含共用体
2.查看不同类型数据的存放 maino 24897—0110000101000001 i union 0110000101000001 char a[2] a[] x.b=24897: printf( %d, %C,%cIn, X b, xa[01,xa[1D; 97 65 结果:24897,A,a a[1] main( union 000000100000 i int b char a[2] 28+2=258 xal[0-2;xa[l=1; printf(%odn”,x.b); 结果:258
2. 查看不同类型数据的存放 main() { union { int b; char a[2]; } x; x.b=24897; printf(“%d,%c,%c\n”,x.b, x.a[0], x.a[1]); } 24897 0110000101000001 01100001 01000001 a[0] a[1] 97 65 结果: 24897, A, a main() { union { int b; char a[2]; } x; x.a[0]=2; x.a[1]=1; printf(“%d\n”,x.b); } 00000001 00000010 a[1] a[0] 2 8+2=258 x.b 结果: 258
第11章第9节 §19枚举类型 概念 某一种变量只有几个有限的数值,在定义时将其一一列出 sex(性别) male. female week sun, mon, tue, wed, thu, fri, sat 二定义 定义类型cmm类型名{枚举元素枚举常量) 例 enum week(sun, mon, tue, wed, thu, fri, sat 枚举元素。凡是属于该类 型的变量,只能取这些值 2.定义变量 类型名 1)分开定义 enum week (sun, mon, tue, wed thu, fri, sat enum week day 变量名 2)同时定义 enum week(sun, mon, tue, wed, thu, fri sat) day 3)直接定义 enum(sun, mon, tue, wed, thu, fri, sat) day;
§11.9 枚举类型 第11章第9节 一. 概 念 ——某一种变量只有几个有限的数值, 在定义时将其一一列出。 二. 定 义 1. 定义类型 sex (性别): male, female week : sun, mon, tue, wed, thu, fri, sat enum 类型名{ 枚举元素(枚举常量)}; 例 enum week {sun, mon,tue,wed,thu,fri,sat}; 2. 定义变量 1). 分开定义 enum week {sun, mon,tue,wed,thu,fri,sat}; enum week day; 枚举元素。凡是属于该类 型的变量,只能取这些值。 类型名 变量名 2). 同时定义 3). 直接定义 enum week {sun, mon,tue,wed,thu,fri,sat} day; enum {sun, mon,tue,wed,thu,fri,sat} day;
第11章第9节 三.说明 1.枚举元素是常量,而非变量 sun=0: X 2.枚举元素的值 ——如按数值使用,其值根据定义的顺序依次为:0,1,2,3 enum week(sun, mon, tue, wed, thu, fri, sat) day; day=mon printf(%d,", day ); 输出 枚举元素的值在定义时可以改变 Bl enum week(sun=7,mon=l, tue, wed, thu, fri, sat, day, day=sat printf("%d, day); 输出:6 3.枚举变量的比较——由其元素值大小确定 enum week (sun=7, mon=l, tue, wed, thu, fri, sat) day 1; day2 day l=sat; day 2=sun 值为:7 值为:6 故:dayl小于day2
第11章第9节 三. 说 明 1. 枚举元素是常量,而非变量。 sun=0; 2. 枚举元素的值 ——如按数值使用, 其值根据定义的顺序依次为:0,1,2,3.... enum week {sun, mon,tue,wed,thu,fri,sat} day; day=mon; printf(“%d”,day); 例 输出:1 **枚举元素的值在定义时可以改变 enum week {sun=7, mon=1,tue,wed,thu,fri,sat} day; day=sat; printf(“%d”, day); 输出:6 3. 枚举变量的比较——由其元素值大小确定 enum week {sun=7, mon=1,tue,wed,thu,fri,sat} day1; day2 day1=sat; day2=sun; 值为:7 值为:6 故: day1 小于 day2
第11章第9节 4.枚举变量的赋值——只能赋枚举元素。 enum week(sun, mon, tue, wed, thu, fri sat) day 1; day2 day l=sat day 2=sun 若赋其他常量,则要求进行强制类型转换 enum week( sun, mon, tue, wed, thu, fri, sat) day l, day2 int a=1 day l=(enum weekday)a 错误的写法:dayl=a; day 2=(enum weekday)2 day 2=2 相当于:day1=mon 相当于:day2=tue 例:口袋里有红,黄,蓝,白球若干个,每次从口袋里先后取出三个球,问得 到3种不同颜色的球的可能取法,打印出每时种排列的情况 解法 红A 设:」黄B 想路:先找出所有的结果,然后去除掉相 蓝C 同颜色的球。 自D
第11章第9节 4. 枚举变量的赋值——只能赋枚举元素。 enum week {sun, mon,tue,wed,thu,fri,sat} day1; day2 day1=sat; day2=sun; *** 若赋其他常量,则要求进行强制类型转换 enum week {sun, mon,tue,wed,thu,fri,sat} day1, day2; int a=1; day1=(enum weekday) a; day2= (enum weekday) 2; 相当于: day1=mon; 相当于: day2=tue; 错误的写法:day1=a; day2=2; 例: 口袋里有红, 黄, 蓝, 白球若干个, 每次从口袋里先后取出三个球, 问得 到3种不同颜色的球的可能取法, 打印出每时种排列的情况 解法一: 设: 红 A 黄 B 蓝 C 自 D 想路: 先找出所有的结果, 然后去除掉相 同颜色的球
第11章第9节 main i int i,j, k Int sum sum for(FA; K<=D;i++ for (=A, K=D; j++ for(k=A'; k=D k++) if(il=j&&il=k&&jl==k) sum++ printf("%c, %c, %c,i,j,k) printf( sum=%d, sum) 解法二:用枚举类型变量 程序见后页
第11章第 9 节 main() { int i, j, k; int sum; sum=0; for (i=‘A’; i<=‘D’;i++) for (j=‘A’; j<=‘D’;j++) for (k=‘A’; k<=‘D’;k++) if(i!=j&&i!=k&&j!==k) {sum++; printf(“%c, %c, %c”, i, j, k); } printf(“sum=%d”,sum); } 解法二: 用枚举类型变量 程序见后页
第11章第9节 maino i enum color (red, yellow, blue, white);[switch enum color i,j,k i case red: printf( %os >,red); break; int sum=0 case yellow: printf(%S >,yellow); break for(ired: K,"yellow); break printf( sum=%d, sum) case blue: printf("%s”,“blue); break; default: printf(%os",“ white”); switch(k) &case red: printf(%s >,"red); break case yellow: printf(%os" yellow); break case blue: printf("%s”,“bue”); break; default: printf(%s >,"white")
第11章第9节 main() { enum color {red,yellow,blue,white}; enum color i, j, k; int sum=0; for (i=red; i<=white ;i++) for (j=red; j<=white; j++) for (k=red ; k<=white; k++) if(i!=j&&i!=k&&j!==k) {sum++; printf(“%d, %d, %d”, i, j, k); } printf(“sum=%d”,sum); } switch(i) {case red: printf(“%s ”, “red”); break; case yellow: printf(“%s ”, “yellow”); break; case blue: printf(“%s ”, “blue”); break; default: printf(“%s ”, “white”); } switch(j) {case red: printf(“%s ”, “red”); break; case yellow: printf(“%s ”, “yellow”); break; case blue: printf(“%s ”, “blue”); break; default: printf(“%s ”, “white”); } switch(k) {case red: printf(“%s ”, “red”); break; case yellow: printf(“%s ”, “yellow”); break; case blue: printf(“%s ”, “blue”); break; default: printf(“%s ”, “white”); }