5661 字
28 分钟

C语言-实验10-结构体与共用体

2026-03-04
浏览量 加载中...
Note

本系列将以一个学习者的眼光,从零基础一步一步学会最基础的C语言编程,本文将讲解C语言第十个板块:结构体与共用体。

在C语言中,基础数据类型(int、char、float等)只能存储单一类型的数据,但实际开发中,我们常需要处理一组关联的、不同类型的数据(比如学生信息包含学号、姓名、成绩)。这时就需要用到C语言提供的自定义复合数据类型——结构体、共用体、枚举。本文将从概念、用法、区别和实战场景出发,帮你彻底掌握这三种核心自定义类型。

结构体#

1.结构体的定义#

结构体是C语言中最常用的自定义复合类型,它允许我们将不同类型的变量组合成一个整体,每个变量作为结构体的”成员”,拥有独立的内存空间。可以把结构体理解为一个”自定义的数据包”,专门用来封装一组相关数据。

2.核心语法#

// 1. 定义结构体类型(格式:struct 结构体名 { 成员列表; })
struct 结构体名 {
数据类型 成员名1;
数据类型 成员名2;
// ... 更多成员
};
// 2. 定义结构体变量(三种方式)
// 方式1:先定义类型,再定义变量
struct 结构体名 变量名;
// 方式2:定义类型的同时定义变量
struct 结构体名 {
成员列表;
} 变量名1, 变量名2;
// 方式3:匿名结构体(仅定义变量,无法复用类型)
struct {
成员列表;
} 变量名;
// 3. 访问成员(使用 . 操作符;指针访问用 ->)
变量名.成员名;
结构体指针->成员名;

共用体#

1.共用体的定义#

共用体(也叫联合)和结构体语法相似,但核心区别是:所有成员共享同一块内存空间,同一时间只有一个成员能有效存储数据。共用体的大小等于其最大成员的大小,适合在不同场景下复用同一块内存。

2.核心语法#

// 定义共用体类型
union 共用体名 {
数据类型 成员名1;
数据类型 成员名2;
// ... 更多成员
};
// 定义变量、访问成员的方式和结构体完全一致
union 共用体名 变量名;
变量名.成员名;

3.区别#

特性结构体(struct)共用体(union)
内存分配各成员独立占内存,总大小累加所有成员共享内存,总大小=最大成员
数据有效性所有成员可同时有效同一时间只有一个成员有效
核心用途封装关联数据(不同类型共存)内存复用(不同类型分时存储)

枚举#

1.枚举的定义#

枚举是将一组整型常量命名,本质是”符号化的常量”,让代码更易读(比如用MON代替1表示周一)。枚举的每个成员默认是整型,值从0开始递增,也可手动指定。

2.核心语法#

// 定义枚举类型
enum 枚举名 {
枚举成员1, // 默认值0
枚举成员2, // 默认值1
枚举成员3 = 5,// 手动指定值5
枚举成员4 // 后续成员自动+1,值为6
};
// 定义枚举变量
enum 枚举名 变量名;

typedef#

1.typedef的定义#

typedef是C语言的关键字,作用是为已存在的数据类型创建一个新的别名(注意:不是定义新类型,只是给原有类型起外号)。它不分配内存,仅简化类型名称,尤其适合冗长的自定义类型(如 struct Student)。

2.核心语法#

// 格式:typedef 原有类型名 新别名;
typedef 原类型 别名;

3.typedef与自定义类型的结合#

1.与结构体结合

#include <stdio.h>
#include <string.h>
struct _Student {
int id;
char name[20];
};
typedef struct _Student Student;
typedef struct {
int id;
char name[20];
} Student2;
int main() {
Student stu1 = {1001, "张三"};
Student2 stu2 = {1002, "李四"};
printf("stu1:学号=%d,姓名=%s\n", stu1.id, stu1.name);
printf("stu2:学号=%d,姓名=%s\n", stu2.id, stu2.name);
return 0;
}

2.与共用体结合

#include <stdio.h>
typedef union {
int num;
float f;
char ch;
} Data;
int main() {
Data data;
data.num = 100;
printf("data.num = %d\n", data.num);
data.f = 3.14f;
printf("data.f = %.2f\n", data.f);
return 0;
}

3.与枚举结合

#include <stdio.h>
typedef enum {
MON, TUE, WED, THU, FRI, SAT, SUN
} Week;
int main() {
Week today = WED;
printf("今天是周%d\n", today);
return 0;
}

4.与指针结合

#include <stdio.h>
typedef struct {
int id;
char name[20];
} Student, *StudentPtr;
int main() {
Student stu = {1001, "张三"};
StudentPtr p = &stu;
printf("通过指针访问:学号=%d,姓名=%s\n", p->id, p->name);
return 0;
}

4.区别#

特性typedef#define
本质给类型起别名(编译器处理)文本替换(预处理器处理)
作用域有作用域(局部/全局)无作用域(宏定义到文件结束)
类型检查会进行类型检查仅文本替换,无类型检查
指针处理避免歧义(如 typedef int* Ptr;易产生歧义(如 #define Ptr int*

示例#

1.结构体(struct):基础示例#

#include <stdio.h>
struct Point {
int x;
int y;
};
int main() {
struct Point p1 = {10, 20};
printf("坐标点p1:x=%d,y=%d\n", p1.x, p1.y);
p1.x = 30;
printf("修改后p1:x=%d,y=%d\n", p1.x, p1.y);
return 0;
}

输出

坐标点p1:x=10,y=20
修改后p1:x=30,y=20

2.共用体(union):基础示例#

#include <stdio.h>
union Value {
int num;
char ch;
};
int main() {
union Value v;
v.num = 65;
printf("存储整数:num=%d\n", v.num);
printf("此时访问ch:%c(ASCII码对应)\n", v.ch);
v.ch = 'B';
printf("\n存储字符:ch=%c\n", v.ch);
printf("此时访问num:%d(ASCII码值)\n", v.num);
return 0;
}

输出

存储整数:num=65
此时访问ch:A(ASCII码对应)
存储字符:ch=B
此时访问num:66(ASCII码值)

3.枚举(enum):基础示例#

#include <stdio.h>
enum Switch {
OFF,
ON
};
int main() {
enum Switch light = ON;
if (light == ON) {
printf("灯的状态:开启(值=%d\n", light);
} else {
printf("灯的状态:关闭(值=%d\n", light);
}
return 0;
}

输出

灯的状态:开启(值=1)

4.typedef:基础示例#

#include <stdio.h>
typedef int INT;
typedef struct {
char name[10];
int age;
} Person;
int main() {
INT a = 100;
Person p = {"小明", 18};
printf("a = %d\n", a);
printf("Person:name=%s,age=%d\n", p.name, p.age);
return 0;
}

输出

a = 100
Person:name=小明,age=18

5.typedef:给枚举/共用体起别名#

#include <stdio.h>
typedef enum {
MON, TUE, WED
} Week;
typedef union {
float score;
int rank;
} Result;
int main() {
Week day = TUE;
Result res;
printf("今天是周%d\n", day);
res.score = 98.5;
printf("成绩:%.1f\n", res.score);
return 0;
}

输出

今天是周1
成绩:98.5

应用#

7-1 sdut-C语言实验-检查宿舍卫生

SDUT希望培养学生的德智体美劳全面素质,因此也会检查个人卫生和宿舍卫生的的情况。假设检查宿舍卫生分为五项成绩:垃圾桶得分、挂钩得分、桌子得分、床铺得分和窗台得分。每项满分20分,总分满分为100分。按照检查规定,宿舍成绩在85分以下就要算作不合格。某天,宿管阿姨给了你一个检查完宿舍的打分表,让你帮忙统计下有多少个宿舍没有达到85分(等于85分是可以的),并且统计成绩最高分。

输入格式:第一行为一个整数 n (0 < n <= 100),代表你要统计的宿舍的总数,接下来 n 行每行为 5 个整数,代表宿舍五项成绩的得分。

输出格式:输出只有一行,由一个空格分隔的两个整数:总分不合格的宿舍数和宿舍总分最高分,如果最高分仍小于85分,则输出为不合格的宿舍数和“No”(不包含引号)。

输入示例

5
1 2 3 4 5
10 20 10 20 20
20 20 20 20 20
15 15 15 20 20
10 10 10 10 10

输出示例

3 100
7-1 解答:
#include <stdio.h>
typedef struct {
int bin_score;
int hook_score;
int table_score;
int bed_score;
int window_score;
int total;
} Sushe;
int main(){
int n;
scanf("%d",&n);
int a=0,b=0;
for(int i=0;i<n;i++){
Sushe room;
scanf("%d %d %d %d %d",&room.bin_score,&room.hook_score,&room.table_score,&room.bed_score,&room.window_score);
room.total=room.bin_score+room.hook_score+room.table_score+room.bed_score+room.window_score;
if(room.total<85){
a++;
}
if(room.total>b){
b=room.total;
}
}
if(b>=85){
printf("%d %d",a,b);
}else{
printf("%d No",a);
}
return 0;
}

7-2 sdut-C语言实验-宣传部招聘

2023年的烧烤让全国的人民了解到了淄博,来自天津的小杨同学也被淄博的温暖所吸引考入了山东理工大学。小杨同学具备天津人的幽默和乐观,于是顺利地进入到学校学生会的宣传部工作,并且协助招聘1名宣传委员。

报名的人很多,每人首先交1张照片,小杨同学需要从n个照片里根据特征值选择1人(序号从 0 到 n - 1),每个参加招聘的同学都有自己的风格,可以按特征划分出 3 个特征值 w1 , w2 , w3 ,宣传部需要 w1 特征值高的同学,不太看重 w3 ,于是小杨同学对于每个特征都赋予一个权重,分别对应为0.7 0.2 0.1,你能帮小杨同学选出宣传部需要的人吗?

输入格式:第一行给出一个整数 n (n <= 1000) ,之后有 n 行数。

每行数有三个整数 w1, w2, w3,表示三个特征值。

不存在权值和相等的情况。

输出格式:输出n 个应聘同学中权值和最高的序号。

输入示例

3
1 5 10
5 1 10
10 5 1

输出示例

2
7-2 解答:
#include <stdio.h>
typedef struct{
int w1;
int w2;
int w3;
int total;
}people;
int main(){
int n;
int max=0,a=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
people person;
scanf("%d %d %d",&person.w1,&person.w2,&person.w3);
person.total=person.w1*0.7+person.w2*0.2+person.w3*0.1;
if(person.total>max){
max=person.total;
a=i;
}
}
printf("%d",a);
return 0;
}

7-3 sdut-C语言实验-选票统计

某校学生会主席由全校学生投票选举产生,共有m名候选人报名参选,编号为1到m(0<m<1000),全校有n名学生(0<n<30000),每人都可以投票。但每人只能投一票,每票只能选1名候选人。请你设计一个程序能够统计出哪个候选人得票最高,得了多少票。不会出现得票数相同的情况。

输入格式:第一行输入候选人数m和学生数n,以空格分开;

下面依次输入每个学生所选的候选人的编号。

输出格式:第一行输出得票最多的候选人编号;

第二行输出该候选人所得的票数。

输入示例

3 10
1 2 3 2 3 1 2 3 1 3

输出示例

3
4
7-3 解答:
#include <stdio.h>
typedef struct{
int id;
int vote;
}toupiao;
int main(){
int m,n;
scanf("%d %d",&m,&n);
toupiao Number[1000];
for(int i=0;i<m;i++){
Number[i].id=i+1;
Number[i].vote=0;
}
int vote_id;
for(int i=0;i<n;i++){
scanf(" %d",&vote_id);
for(int j=0;j<m;j++){
if(Number[j].id == vote_id){
Number[j].vote++;
break;
}
}
}
int max_vote = 0;
int max_id = 0;
for (int i = 0; i < m; i++) {
if (Number[i].vote > max_vote) {
max_vote = Number[i].vote;
max_id = Number[i].id;
}
}
printf("%d\n", max_id);
printf("%d\n", max_vote);
return 0;
}

7-4 sdut-C语言实验-小南同学选宾馆

疫情期间到淄博隔离的山大学子们受到了淄博当地家人般的照顾,于是山大的学子们疫情后仍然会坐火车到淄博转一转,体会这座城市的温暖。这不,山大的小南同学在一个周末和同学又来到了八大局买扇子,听说都是有收藏价值呢。

到了晚上了,小南跟他的同学们要选一个宾馆住下了。但是形形色色的宾馆让小南不知所措。

对于一个宾馆来说,有许多特征,比如「价格」、「舒适度」。小南会对每个特征都有一个满意度。小南会选择出满意度更高一些的宾馆。其中,「价格」对于小南来说是最重要的,其次是「舒适度」。

如果有两个宾馆,如果对「价格」的满意度相同,那么根据「舒适度」进行选择;如果有多个宾馆条件相同,输出编号最小的宾馆。

你能帮他按照他的意愿找到小南最满意的宾馆吗?

输入格式:给出 n (n <= 5000) 代表 n 个宾馆(编号从 1 - n),随后有 n 行数据。

每行数据有两个整数,分别代表小南对「价格」、「舒适度」的满意程度,数值越大满意程度越高,满意度的范围从0 - 5000。

输出格式:输出按照描述的条件中小南最满意的宾馆编号,如果有多个宾馆条件相同,输出编号最小的宾馆。

输入示例

4
0 1
1 0
1 1
1 0

输出示例

3
7-4 解答:
#include <stdio.h>
typedef struct{
int price;
int comfortable;
} house;
int main(){
int n;
scanf(" %d",&n);
house room[5000];
for(int i=0;i<n;i++){
room[i].price=0;
room[i].comfortable=0;
}
for(int i=0;i<n;i++){
scanf("%d %d",&room[i].price,&room[i].comfortable);
}
int id = 1;
for(int i=1;i<n;i++){
if(room[i].price > room[id-1].price){
id = i+1;
}
else if(room[i].price == room[id-1].price){
if(room[i].comfortable > room[id-1].comfortable){
id = i+1;
}
}
}
printf("%d",id);
return 0;
}

7-5 sdut-C语言实验-排名次

SDUT某实验室集训队的选拔又要开始了,集训队需要根据参加者的分数排名来决定谁能够进入集训队。 先要求你写一个自动排名的程序,根据每一个参与选拔的同学的分数进行排名,集训队需要根据大家的分数排名来决定谁能够进入集训队。 你能完成这个程序么?

输入格式:输入的第一行为n ( 0<n<=50) ;

之后给出n 行,每行为一个人名和ta所得到的分数。保证没有相同的分数。

人名为英文单词,长度不超过10。

输出格式:输出为n行,每行一个人名与他的得分。每一行最后没有多余的空格。

具体输出格式见样例。

输入示例

3
Dan 10
John 50
Danny 30

输出示例

John 50
Danny 30
Dan 10
7-5 解答:
#include <stdio.h>
typedef struct{
char name[11];
int score;
}stu;
int main(){
int n;
scanf("%d",&n);
stu students[50];
for(int i=0;i<n;i++){
scanf("%s %d",students[i].name,&students[i].score);
}
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (students[j].score < students[j+1].score) {
stu temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
for(int i=0;i<n;i++){
printf("%s %d\n",students[i].name,students[i].score);
}
return 0;
}

7-6 sdut-C语言实验-最终排名

《程序设计基础》组织了一次程序设计竞赛,比赛完后需要产生一个最终排名,排名按照题数多少来决定。但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。

为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,如果题数相等,保持输入时的相对顺序不要改变。。

输入格式:第一行有一个正整数N(1 < N ≤ 10000),表示队伍数量。

接下来N 行包含两个整数,1 ≤ ID ≤ 10^7, 0 ≤ M ≤ 100。ID为队伍的编号,M为做出的题数。

输出格式:输出包含N行;

第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。

输入示例

8
1 2
16 3
11 2
20 3
3 5
26 4
7 1
22 4

输出示例

3 5
26 4
22 4
16 3
20 3
1 2
11 2
7 1
7-6 解答:
#include <stdio.h>
typedef struct{
int id;
int M;
}stu;
int main(){
int n;
scanf("%d",&n);
stu team[10000];
for(int i=0;i<n;i++){
scanf("%d %d",&team[i].id,&team[i].M);
}
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (team[j].M < team[j+1].M) {
stu temp = team[j];
team[j] = team[j+1];
team[j+1] = temp;
}
}
}
for(int i=0;i<n;i++){
printf("%d %d\n",team[i].id,team[i].M);
}
return 0;
}

7-7 sdut-C语言实验-选夫婿

倾国倾城的大家闺秀潘小姐要选夫婿啦!武林中各门各派,武林外各大户人家,闻讯纷纷前来,强势围观。前来参与竞选的男生藏龙卧虎,高手云集,才子遍布,帅哥纷纭,更不乏富二代,官二代,可谓声势空前。

7-7 sdut-C语言实验-选夫婿

每个人参与竞选的帅哥除了进行一段激情洋溢的求婚演讲以外,还要报上自己姓名、身高和体重,以及个人简历。最后再进行文武选拔,最后夺魁者方能得到潘小姐的芳心。

潘小姐不爱名利,只看人,第一关就是身高和体重要合格,即必须在其要求的范围内,否则直接排除在外,不允许参加下一轮的选拔。

作为一个程序员,你没有钱也没有权,擅长的也就是编程了。潘小姐也发现了这一点,所以把首轮根据身高体重进行选拔的任务交给了你,如果完成的好,你可以直接进入下一轮选拔,你笑了。

输入格式:潘小姐给你了所有报名男生的信息。

输入数据的第一行是一个正整数N (0 < N < 1000)。

之后N 行数据,每行包含三部分,用空格隔开。第一部分是报名者的姓名name(长度小于20的字符串),然后是整数身高h(0 < h < 300),第三部分是整数体重w (0 < w < 200)。

最后一行是四个整数a,b,c,d.表示身高的合格范围是[a,b],体重的合格范围是[c,d](0 < a < b < 200, 0 <C< d < 300)。

输出格式:你需要把合格的男生信息按照身高从低到高输出,格式跟输入一样,也是每行三个信息,共N行,如果身高相同则按体重从轻到重输出,若没有合格人选则输出No,具体格式见样例。

输入示例

8
武大郎 70 40
西门庆 180 70
李逵 160 150
燕青 175 69
鲁智深 180 100
武松 180 75
小泉纯一狼 30 20
孙二娘 169 60
165 190 60 90

输出示例

孙二娘 169 60
燕青 175 69
西门庆 180 70
武松 180 75
7-7 解答:
#include <stdio.h>
typedef struct {
char name[20];
int h;
int w;
} Boy;
int main() {
int N;
scanf("%d", &N);
Boy boys[1000];
for (int i = 0; i < N; i++) {
scanf("%s %d %d", boys[i].name, &boys[i].h, &boys[i].w);
}
int a, b, c, d;
scanf("%d %d %d %d", &a, &b, &c, &d);
Boy bingo[1000];
int bingo_count = 0;
for (int i = 0; i < N; i++) {
if (boys[i].h >= a && boys[i].h <= b && boys[i].w >= c && boys[i].w <= d) {
bingo[bingo_count++] = boys[i];
}
}
for (int i = 0; i < bingo_count - 1; i++) {
for (int j = 0; j < bingo_count - 1 - i; j++) {
if (bingo[j].h > bingo[j+1].h) {
Boy temp = bingo[j];
bingo[j] = bingo[j+1];
bingo[j+1] = temp;
}
else if (bingo[j].h == bingo[j+1].h) {
if (bingo[j].w > bingo[j+1].w) {
Boy temp = bingo[j];
bingo[j] = bingo[j+1];
bingo[j+1] = temp;
}
}
}
}
if (bingo_count == 0) {
printf("No\n");
} else {
for (int i = 0; i < bingo_count; i++) {
printf("%s %d %d\n", bingo[i].name, bingo[i].h, bingo[i].w);
}
}
return 0;
}

7-8 sdut-C语言实验-老—质价比

给出n件物品,每件物品有质量和价格两种属性。你要做的是按质量升序排序,若质量相同则按价格降序排序。

输入格式:第一行输入一个正整数n(1<=n && n <= 100),代表有n件物品。

接下来的一行有n个正整数Wi(1<= Wi && Wi <= 10000),代表每件物品的质量。

再接下来的一行有n个正整数Pi(1 <= Pi && Pi <= 10000),代表每件物品的价格。

输出格式:输出n行,每行两个数Wi,Pi。顺序为题目描述所要求。

输入示例

3
1 2 2
3 2 3

输出示例

1 3
2 3
2 2
7-8 解答:
#include <stdio.h>
typedef struct {
int Wi;
int Pi;
}wupin;
int main(){
int n;
scanf("%d",&n);
wupin item[100];
for(int i=0;i<n;i++){
scanf(" %d",&item[i].Wi);
}
for(int i=0;i<n;i++){
scanf(" %d",&item[i].Pi);
}
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(item[j].Wi>item[j+1].Wi){
wupin temp = item[j+1];
item[j+1]=item[j];
item[j]=temp;
}else if(item[j].Wi==item[j+1].Wi){
if(item[j].Pi<item[j+1].Pi){
wupin temp = item[j+1];
item[j+1]=item[j];
item[j]=temp;
}
}
}
}
for(int i=0;i<n;i++){
printf("%d %d\n",item[i].Wi,item[i].Pi);
}
return 0;
}

7-9 sdut-C语言实验-共用体练习

给定n和m,接下来有n个描述,每个描述包含一个类型标志和一组相应的数据。

类型标志共3种:INT DOUBLE STRING,然后对应一组相应的数据。

紧接着有m个询问,每个询问仅包含一个整数x,要求输出第x个描述对应的数据(STRING类型保证不含空格,每组对应STRING数据不会超过19个字符)。

输入格式:输入的第一行为两个整数,n和m (n<=100000, m<=100000 ), 分别代表描述的个数和询问的个数。

接下来为 n 行描述;

最后为m行询问,具体格式见样例输入输出。

输出格式:对于每个询问,输出对应的结果,注意:浮点数保留两位小数。

输入示例

5 4
INT 456
DOUBLE 123.56
DOUBLE 0.476
STRING welcomeToC
STRING LemonTree
0
1
2
4

输出示例

456
123.56
0.48
LemonTree

提示:必须使用共用体完成

7-9 解答:
#include <stdio.h>
#include <string.h>
typedef union {
int int_val;
double double_val;
char str_val[20];
} Data;
typedef struct {
char type[7];
Data data;
} Content;
Content Arr[100000];
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
char type[7];
scanf("%s", type);
strcpy(Arr[i].type, type);
if (strcmp(type, "INT") == 0) {
scanf("%d", &Arr[i].data.int_val);
} else if (strcmp(type, "DOUBLE") == 0) {
scanf("%lf", &Arr[i].data.double_val);
} else if (strcmp(type, "STRING") == 0) {
scanf("%s", Arr[i].data.str_val);
}
}
for (int i = 0; i < m; i++) {
int ids;
scanf("%d", &ids);
if (strcmp(Arr[ids].type, "INT") == 0) {
printf("%d\n", Arr[ids].data.int_val);
} else if (strcmp(Arr[ids].type, "DOUBLE") == 0) {
printf("%.2f\n", Arr[ids].data.double_val);
} else if (strcmp(Arr[ids].type, "STRING") == 0) {
printf("%s\n", Arr[ids].data.str_val);
}
}
return 0;
}

7-10 sdut-C语言实验-简单枚举类型——植物与颜色

请定义具有red, orange, yellow, green, blue, violet六种颜色的枚举类型color,根据输入的颜色名称,输出以下六种植物花朵的颜色:

Rose(red), Poppies(orange), Sunflower(yellow), Grass(green), Bluebells(blue), Violets(violet)。如果输入的颜色名称不在枚举类型color中,例如输入purple,请输出I don’t know about the color purple.

输入格式:第一行输入一个n, 代表有n 组询问。( 1 <= n <= 10)

接下来的n行, 每行有一个字符串代表颜色名称,颜色名称最多30个字符。

输出格式:输出n 行。

每行输出对应颜色的植物名称。

例如:Bluebells are blue. 如果输入的颜色名称不在枚举类型color中,例如purple, 请输出I don’t know about the color purple.

输入示例

3
blue
yellow
purple

输出示例

Bluebells are blue.
Sunflower are yellow.
I don't know about the color purple.
7-10 解答:
#include <stdio.h>
#include <string.h>
enum color {
red,
orange,
yellow,
green,
blue,
violet,
unknown
};
int main() {
int n, i;
char str[31];
enum color c;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%s", str);
if(strcmp(str,"red")==0){
c=red;
}
else if(strcmp(str,"orange")==0){
c=orange;
}
else if(strcmp(str,"yellow")==0){
c=yellow;
}
else if(strcmp(str,"green")==0){
c=green;
}
else if(strcmp(str,"blue")==0){
c=blue;
}
else if(strcmp(str,"violet")==0){
c=violet;
}
else{
c=unknown;
}
switch (c) {
case red:
printf("Rose are red.\n");
break;
case orange:
printf("Poppies are orange.\n");
break;
case yellow:
printf("Sunflower are yellow.\n");
break;
case green:
printf("Grass are green.\n");
break;
case blue:
printf("Bluebells are blue.\n");
break;
case violet:
printf("Violets are violet.\n");
break;
default:
printf("I don't know about the color %s.\n", str);
}
}
return 0;
}

总结#

OK了,今天你学会了C语言程序的结构体、共用体、枚举及其相关知识点!下一章:链表将会继续使用此结构哦,难度会更大一点哦!一起加油吧!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
C语言-实验10-结构体与共用体
https://blog.pigeons2023.asia/posts/20260304/
作者
Pigeons2023
发布于
2026-03-04
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Pigeons2023
不曾与你分享的时间,我在进步.
公告
欢迎光临我的博客 🎉 ,这里会分享我的日常和学习中的收集、整理及总结,希望能对你有所帮助:) 💖
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
19
分类
4
标签
6
总字数
62,837
运行时长
0
最后活动
0 天前

目录