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 天前

目录