【C复习】03:结构体

结构体


在定义结构体时可以对其成员进行初始化,初始化列表是用花括号括起来的一些常量,这些常量依次赋值给结构体中的成员。

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;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值