>点击蓝字,关注我们
往
期
回
顾
C语言中的内存覆盖技术:共同体的概念和操作
链表是C语言的魅力:5个你必须知道的链表的类型,格式,用法(二)
01
本节重点
C语言共同体的应用
上节课讲解了关于C语言的一些基础知识,本节就来说说,这个共同体该如何使用,主要以一个例子来进行说明。
共同体的应用
共同体在一般的编程中应用较少,在单片机中应用较多。对于PC机,经常使用到的一个实例是:现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。
请看下面的表格:
| 姓名 | 编号 | 性别 | 职业 |分数/课程 |
| :--: | :--: | :--: |:--: | :-------: |
| 张三 | 101 | 男 |教师 | 数学 |
| 李四 |102 | 女 | 学生 | 90 |
| 王五 | 103 | 男 |教师 | 物理 |
| 赵六 |104 | 男 | 学生 | 98 |
可以看出,学生和教师所包含的数据是不同的。现在要求把这些信息放在同一个表格中,并设计程序输入人员信息然后输出。如果把每个人的信息都看作一个结构体变量的话,那么教师和学生的前四个成员变量是一样的,第五个成员变量可能是分数或者课程。当第四个成员变量的值是s的时候,第五个成员变量就是分数;当第四个成员变量的值是t的时候,第五个成员变量就是课程。
编写程序
经过上面的分析,我们可以设计一个包含共同体的结构体,请看下面的代码:
#include <stdio.h>#include <string.h>
#define TOTAL 4 //人员总数struct { char name[20]; //姓名 int num; //编号 char sex[20]; //性别 char profession; //职业 union { float score; //分数 char course[20]; //课程 } sc; //共同体} bodys[TOTAL]; //结构体数组
int main() { int i; char ch; //用来清除缓冲区的字符 //输入人员信息 for (i = 0; i < TOTAL; i++) { printf("请输入第%d个人的信息:\n", i + 1); printf("姓名:"); scanf("%s", bodys.name); printf("编号:"); scanf("%d", &bodys.num); printf("性别:"); scanf(" %s", &bodys.sex); //加一个空格 printf("职业:"); while ((ch = getchar()) != '\n'); //清除缓冲区中的所有字符,直到遇到换行符 bodys.profession = getchar(); //使用getchar()函数 if (bodys.profession == 's') { //如果是学生 printf("分数:"); scanf("%f", &bodys.sc.score); } else { //如果是教师 printf("课程:"); scanf("%s", bodys.sc.course); } fflush(stdin); //清空输入缓冲区 } //输出人员信息 printf("\n姓名\t编号\t性别\t职业\t分数/课程\n"); for (i = 0; i < TOTAL; i++) { printf("%s\t%d\t%s\t%c\t", bodys.name, bodys.num, bodys.sex, bodys.profession); //修改%s为%c if (bodys.profession == 's') { //如果是学生 printf("%f\n", bodys.sc.score); } else { //如果是教师 printf("%s\n", bodys.sc.course); } } return 0;}
运行结果:
姓名 编号 性别 职业 分数/课程
请输入第1个人的信息:
姓名:张三
编号:101
性别:男
职业:t
课程:数学
请输入第2个人的信息:
姓名:李四
编号:102
性别:女
职业:s
分数:90
请输入第3个人的信息:
姓名:王五
编号:103
性别:男
职业:t
课程:物理
请输入第4个人的信息:
姓名:赵六
编号:104
性别:男
职业:s
分数:98
这段代码使用了一个包含共同体的结构体数组,根据不同的职业,输入和输出不同的数据。这样就避免了为每个人分配多余的内存空间,提高了内存的利用率。
想要学习C语言的朋友可以自己购买下面推荐的c语言基础从入门到精通,内容包含c语言初始到最终实战,附赠视频教学,让你轻松学习C语言。
点赞加关注,学习不迷路
微信公众号|工控小新
EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中
发现“分享”和“赞”了吗,戳我看看吧
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |