内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第27练,内容是7.6 结构体和共用体应用实例。
《编程语言基础——C语言》(第5版)一课一练 第27练
7.6 结构体和共用体应用实例
一、单选题
1. 要对结构体数组按某个成员进行排序,最合适的做法是( )
A. 在比较和交换时,以整个结构体变量为单位进行操作
B. 先把要排序的成员抽取到普通数组中排序,再依次回填
C. 不能对结构体数组排序,因为结构体不能比较大小
D. 改变结构体成员的定义顺序来达到排序效果
2. 用结构体数组管理学生成绩,要统计不及格(score<60)的学生人数,正确的做法是( )
A. 直接用 sizeof(结构体数组) / sizeof(不及格) 计算
B. 遍历数组,判断每个元素的score成员是否<60,累加计数
C. 用共用体将所有score转为整数再比较
D. 定义一个新的结构体数组存放不及格学生
3. 以下场景中,适合使用共用体(union)而非结构体(struct)的是( )
A. 存储一个学生的学号、姓名和多门课程成绩
B. 存储图书馆中每本书的书名、作者和ISBN
C. 在一个变量中轮流存储不同类型的数据以节省内存
D. 定义包含多个不同成员的实体对象
4. 已执行 typedef struct { int x; int y; } Point; 以下说法正确的是( )
A. Point是一个结构体类型名,定义变量时仍需写 struct Point
B. Point是一个变量名,可以直接使用
C. Point是宏名,预处理后展开为结构体定义
D. Point是结构体类型的别名,可以直接用 Point p; 定义变量
5. 已定义 typedef struct { int num; float score; } Student; 函数 void print(Student s) 的功能是打印一个学生的信息。以下调用正确的是( )
A. Student a = {1, 90}; print(a);
B. Student a = {1, 90}; print(&a);
C. Student a = {1, 90}; print(Student);
D. Student a = {1, 90}; print(a.score);
6. 有以下共用体定义和应用:union { int i; char c[4]; } u; 以下说法正确的是( )
A. u.i和u.c分别占用不同的4字节内存空间
B. 可以利用共用体查看int类型在内存中的各字节内容
C. 给u.i赋值后,u.c的值会保持为空
D. 共用体不能包含数组类型的成员
7. 已定义 struct Student { int num; float score; } stu[5]; 以下操作中,语法正确的是( )
A. stu.score = 90;
B. if (stu[1] > stu[2]) ...
C. stu[0] = stu[1];
D. scanf("%d", stu.num);
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
typedef struct
{
char name[10];
int score;
} Student;
main()
{
Student s[4] = {{"A", 85}, {"B", 72}, {"C", 90}, {"D", 68}};
int i, count = 0;
for (i = 0; i < 4; i++)
if (s[i].score >= 80)
count++;
printf("%d", count);
}
三、程序填空题
9. 以下程序的功能是:将学生成绩数组按score从高到低排序(选择排序法)。请填空。
#include <stdio.h>
typedef struct
{
int num;
float score;
} Student;
main()
{
Student s[4] = {{1,78}, {2,92}, {3,65}, {4,88}}, t;
int i, j, max;
for (i = 0; i < 3; i++)
{
max = i;
for (j = i + 1; j < 4; j++)
if (s[j].score > s[max].score)
max = j;
t = s[i];
s[i] = s[max];
【1】;
}
for (i = 0; i < 4; i++)
printf("%d:%.0f ", s[i].num, s[i].score);
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是将输入的整数通过共用体转换为对应的浮点数(按内存位模式直接转换)并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 union Convert
L3 {
L4 int i;
L5 float f;
L6 };
L7 main()
L8 {
L9 union Convert c;
L10 printf("请输入一个整数:");
L11 scanf("%d", &c.i);
L12 printf("对应的浮点表示:%f
", c.i);
L13 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第27练,内容是7.6 结构体和共用体应用实例。
《编程语言基础——C语言》(第5版)一课一练 第27练
7.6 结构体和共用体应用实例
一、单选题
1. 要对结构体数组按某个成员进行排序,最合适的做法是( )
A. 在比较和交换时,以整个结构体变量为单位进行操作
B. 先把要排序的成员抽取到普通数组中排序,再依次回填
C. 不能对结构体数组排序,因为结构体不能比较大小
D. 改变结构体成员的定义顺序来达到排序效果
【答案】A
【解析】同类型结构体变量之间可以整体赋值,因此排序时可像普通数组一样交换整个结构体变量。比较时则按指定成员的值来判断大小。这种方式代码简洁,利用了结构体整体赋值的特性。
2. 用结构体数组管理学生成绩,要统计不及格(score<60)的学生人数,正确的做法是( )
A. 直接用 sizeof(结构体数组) / sizeof(不及格) 计算
B. 遍历数组,判断每个元素的score成员是否<60,累加计数
C. 用共用体将所有score转为整数再比较
D. 定义一个新的结构体数组存放不及格学生
【答案】B
【解析】统计满足条件的元素个数需要遍历整个结构体数组,通过.运算符访问每个元素的score成员,判断是否小于60,并用计数器累加。这是结构体数组最常见的应用模式。
3. 以下场景中,适合使用共用体(union)而非结构体(struct)的是( )
A. 存储一个学生的学号、姓名和多门课程成绩
B. 存储图书馆中每本书的书名、作者和ISBN
C. 在一个变量中轮流存储不同类型的数据以节省内存
D. 定义包含多个不同成员的实体对象
【答案】C
【解析】共用体适用于同一变量在不同时刻存储不同类型数据的场景,其内存大小等于最大成员的大小,可节省空间。结构体则适用于需要同时保存多个相关数据成员的场景。A、B、D都需要同时保存多个成员,应用结构体。
4. 已执行 typedef struct { int x; int y; } Point; 以下说法正确的是( )
A. Point是一个结构体类型名,定义变量时仍需写 struct Point
B. Point是一个变量名,可以直接使用
C. Point是宏名,预处理后展开为结构体定义
D. Point是结构体类型的别名,可以直接用 Point p; 定义变量
【答案】D
【解析】typedef为已有结构体类型(包括匿名结构体)定义了一个别名Point。之后可以直接用 Point 变量名 的方式定义变量,无需struct关键字。这简化了代码书写,是C语言中常用的做法。
5. 已定义 typedef struct { int num; float score; } Student; 函数 void print(Student s) 的功能是打印一个学生的信息。以下调用正确的是( )
A. Student a = {1, 90}; print(a);
B. Student a = {1, 90}; print(&a);
C. Student a = {1, 90}; print(Student);
D. Student a = {1, 90}; print(a.score);
【答案】A
【解析】函数print的参数类型是Student(结构体类型),调用时传入同类型的变量a即可,这是结构体变量作为函数参数的值传递。B传的是地址(指针),类型不匹配;C传的是类型名;D传的是成员而非整体。
6. 有以下共用体定义和应用:union { int i; char c[4]; } u; 以下说法正确的是( )
A. u.i和u.c分别占用不同的4字节内存空间
B. 可以利用共用体查看int类型在内存中的各字节内容
C. 给u.i赋值后,u.c的值会保持为空
D. 共用体不能包含数组类型的成员
【答案】B
【解析】共用体中int型成员i(占4字节)和char型数组c[4](占4字节)共享同一段内存。给u.i赋值后,可以通过c[0]~c[3]分别查看i在内存中的每个字节的值,这是共用体的典型应用——用于数据类型的底层字节分析。
7. 已定义 struct Student { int num; float score; } stu[5]; 以下操作中,语法正确的是( )
A. stu.score = 90;
B. if (stu[1] > stu[2]) ...
C. stu[0] = stu[1];
D. scanf("%d", stu.num);
【答案】C
【解析】同类型的结构体变量(包括数组元素)之间可以直接整体赋值。A错误,必须通过下标指定具体元素;B错误,结构体整体不能直接用>比较大小,需要指定比较哪个成员;D错误,同样缺少下标。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
typedef struct
{
char name[10];
int score;
} Student;
main()
{
Student s[4] = {{"A", 85}, {"B", 72}, {"C", 90}, {"D", 68}};
int i, count = 0;
for (i = 0; i < 4; i++)
if (s[i].score >= 80)
count++;
printf("%d", count);
}
【答案】2
【解析】程序统计score>=80的学生人数。遍历结构体数组s:s[0].score=85≥80→count=1;s[1].score=72<80→不变;s[2].score=90≥80→count=2;s[3].score=68<80→不变。最终输出2。
三、程序填空题
9. 以下程序的功能是:将学生成绩数组按score从高到低排序(选择排序法)。请填空。
#include <stdio.h>
typedef struct
{
int num;
float score;
} Student;
main()
{
Student s[4] = {{1,78}, {2,92}, {3,65}, {4,88}}, t;
int i, j, max;
for (i = 0; i < 3; i++)
{
max = i;
for (j = i + 1; j < 4; j++)
if (s[j].score > s[max].score)
max = j;
t = s[i];
s[i] = s[max];
【1】;
}
for (i = 0; i < 4; i++)
printf("%d:%.0f ", s[i].num, s[i].score);
}
【答案】【1】s[max] = t
【解析】选择排序中,每趟找到最大值位置后,将当前元素s[i]与最大值元素s[max]交换。已执行t=s[i]; s[i]=s[max]; 还差最后一步s[max]=t来完成交换。利用结构体变量可整体赋值的特性简化代码。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是将输入的整数通过共用体转换为对应的浮点数(按内存位模式直接转换)并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 union Convert
L3 {
L4 int i;
L5 float f;
L6 };
L7 main()
L8 {
L9 union Convert c;
L10 printf("请输入一个整数:");
L11 scanf("%d", &c.i);
L12 printf("对应的浮点表示:%f
", c.i);
L13 }
【答案】【1】L12: printf("对应的浮点表示:%f
", c.i); → 应改为 printf("对应的浮点表示:%f
", c.f);(要输出浮点表示应读取共用体的float成员c.f,用%f输出int成员c.i会导致格式不匹配)
【解析】共用体中int和float共享内存。L12用%f格式输出int成员c.i,类型不匹配。虽然内存中存储的是同一个位模式,但要按float格式解释输出,应读取共用体的float成员c.f,这样printf的%f格式方能正确解释内存中的数据。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$