结构体
在定义结构体时可以对其成员进行初始化,初始化列表是用花括号括起来的一些常量,这些常量依次赋值给结构体中的成员。
1.共用体类型
同一段内存单元存放不同类型的变量,使用覆盖技术,后一个数据覆盖前面的数据。
这种使几个不同的变量共享同一段内存的结构体,称为共用体类型。
结构体变量所占内存长度是各成员所占内存长度之和,而共用体变量所占的内存长度等于最长的成员的长度。
- 有若干个人员的数据,其中包含学生和老师。学生的数据包括:姓名、号码、性别、职业、班级,教师的数据包括:姓名、号码、性别、职业、职务。要求用同一个表格来进行处理。(显然人员的第5个属性可以用共用体来表示,将class和position放在同一段存储单元中)
#include<stdio.h>
union Catagory {
int calssNo;
char position[10];
};
struct Person {
int num;
char name[10];
char sex;
char job;
union Catagory category;
};
struct Person person[2];
int main() {
for (int i = 0; i < 2; ++i) {
printf("please enter the data of person:\n");
scanf("%d %s %c %c", &person[i].num, &person[i].name, &person[i].sex, &person[i].job);
if (person[i].job == 's') scanf("%d", &person[i].category.calssNo);
else if (person[i].job == 't') scanf("%s", &person[i].category.position);
else printf("Input error!");
}
printf("\n");
printf("No.\tname\tsex\tjob\tclass/position\n");
for (int i = 0; i < 2; ++i) {
if (person[i].job == 's') printf("%d\t%s\t%c\t%c\t%d\n", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].category.calssNo);
else printf("%d\t%s\t%c\t%c\t%s\n", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].category.position);
}
return 0;
}
2.枚举类型
如果一个变量只有几种可能的值,则可以将其定义为枚举类型。
编译器对枚举类型的枚举元素按照常量处理,故称为枚举常量,枚举常量不能进行再次赋值。
枚举元素的比较规则是按照其在初始化时指定的整数来进行比较的,如果定义时未人为指定则按照默认规则进行处理。
- 口袋中有红、黄、蓝、白、黑5种颜色的球若干个,每次从口袋中先后取出3个球,问得到3种不同颜色的球的可能取法(输出每种排列情况)。
#include<stdio.h>
int main() {
enum Color {red, yellow, blue, white, black};//声明枚举类型
enum Color i, j, k, pri;//利用枚举类型定义变量
int n = 0;//累计有3中不同色颜色小球的次数
//穷举法解决
for (i = red; i <= black; ++i) {
for (j = red; j <= black; ++j) {
if (i != j) for (k = red; k <= black; ++k) {//如果前2次穷举的小球颜色不同 则继续穷举第3球
if ((k != i) && (k != j)) {//如果3次穷举的小球颜色都不同
n++;
printf("%-4d", n);
for (int loop = 1; loop <= 3; ++loop) {
switch (loop) {
case 1: pri = i; break;//将穷举第1球的结果放入pri中
case 2: pri = j; break;//将穷举第2球的结果放入pri中
case 3: pri = k; break;//将穷举第3球的结果放入pri中
default: break;
}
switch (pri) {//根据枚举类型输出相应的文字 case处也可直接使用对应的值
case 0: printf("%-10s", "red"); break;
case 1: printf("%-10s", "yellow"); break;
case 2: printf("%-10s", "blue"); break;
case 3: printf("%-10s", "white"); break;
case 4: printf("%-10s", "black"); break;
default: break;
}
}
printf("\n");
}
}
}
}
printf("\ntotal:%5d\n", n);
return 0;
}