内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第26练,内容是7.4 结构体数组 + 7.5 共用体。
《编程语言基础——C语言》(第5版)一课一练 第26练
7.4 结构体数组 + 7.5 共用体
一、单选题
1. 关于结构体数组,下列说法正确的是( )
A. 结构体数组的每个元素都是一个结构体变量
B. 结构体数组的所有元素共享同一块内存
C. 结构体数组的元素只能是整型数据
D. 结构体数组不能像普通数组一样用下标访问
【答案】A
【解析】结构体数组是由多个结构体变量组成的数组,每个元素都是完整的结构体变量,拥有独立的成员。可以通过下标访问每个元素,再用.运算符访问该元素的成员。
2. 已定义 struct Student { int num; char name[20]; }; 要定义一个包含50个元素的Student类型数组,正确的是( )
A. Student stu[50];
B. struct Student stu[50];
C. struct stu[50];
D. Student struct[50];
【答案】B
【解析】定义结构体数组的格式为:struct 结构体名 数组名[元素个数]; A缺少struct关键字,C缺少结构体名,D语法顺序错误。如果使用了typedef定义别名则可以直接用别名。
3. 已定义 struct Point { int x; int y; } p[3] = {{1,2}, {3,4}, {5,6}}; 则表达式 p[1].x + p[2].y 的值是( )
A. 6
B. 8
C. 9
D. 11
【答案】C
【解析】结构体数组p的初始化:p[0]={1,2},p[1]={3,4},p[2]={5,6}。p[1].x=3,p[2].y=6,相加得9。访问格式为数组名[下标].成员名。
4. 关于共用体(union),下列说法正确的是( )
A. 共用体的所有成员可以同时被使用
B. 共用体占用的内存等于所有成员内存之和
C. 共用体变量定义后,所有成员的值同时有效
D. 共用体的各个成员共享同一段内存空间
【答案】D
【解析】共用体(union)的关键特征是所有成员共享同一段内存空间,共用体变量的大小等于其最大成员的大小。各成员共享内存,最后写入的成员值会覆盖先前写入的值。
5. 定义了 union Data { int i; char c; double d; }; 在常见的编译环境中,该共用体类型占用的字节数是( )
A. 8(double的大小)
B. 4+1+8=13(所有成员大小之和)
C. 4(int的大小)
D. 1(char的大小)
【答案】A
【解析】共用体的大小等于其最大成员的大小。int占4字节,char占1字节,double占8字节,因此union Data的大小为8字节。A选项中的double占8字节,是最大成员。
6. 已定义 struct Student { int num; float score; } stu[3] = {{1,85}, {2,92}, {3,78}}; 要输出score最大的学生的学号,以下循环思路正确的是( )
A. 直接输出stu[1].score,因为它是中间值
B. 遍历数组,用一个变量记录当前最大score的下标,遍历结束后输出该下标对应的num
C. 用冒泡排序对score排序后,输出stu[0].num
D. 计算所有score的平均值,输出最接近平均值的num
【答案】B
【解析】在结构体数组中查找满足某种条件(如最大值)的元素,需要遍历数组逐个比较。用一个变量max_index记录当前最大值所在下标,每发现一个更大的score就更新max_index,遍历结束后stu[max_index].num即为所求。
7. 有以下程序段:union U { int a; char b; } u; u.a = 65; u.b = 'B'; printf("%d", u.a); 输出结果正确的是( )
A. 65
B. 0
C. 66
D. 编译错误
【答案】C
【解析】共用体成员共享内存,u.a=65后内存中存储65。然后u.b='B'(ASCII码66)写入同一段内存,覆盖了原来的值。此时从int型成员u.a读取的是被覆盖后的值66,即字符'B'的ASCII码。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Student
{
int num;
float score;
};
main()
{
struct Student s[3] = {{101, 75}, {102, 88}, {103, 66}};
int i, max_i = 0;
for (i = 1; i < 3; i++)
if (s[i].score > s[max_i].score)
max_i = i;
printf("%d,%.0f", s[max_i].num, s[max_i].score);
}
【答案】102,88
【解析】程序遍历结构体数组s[3],查找score最高的学生。初始max_i=0(s[0].score=75)。i=1时s[1].score=88>75,max_i更新为1。i=2时s[2].score=66<88,max_i不变。最终输出s[1]即学号102,分数88。
三、程序填空题
9. 以下程序的功能是:输入3个学生的学号和成绩,计算并输出平均分。请填空。
#include <stdio.h>
struct Student
{
int num;
float score;
};
main()
{
struct Student stu[3];
int i;
float sum = 0;
for (i = 0; i < 3; i++)
{
printf("请输入第%d个学生的学号和成绩:", i + 1);
scanf("%d%f", &stu[i].num, &stu[i].score);
sum = sum + 【1】;
}
printf("平均分:%.1f
", sum / 3);
}
【答案】【1】stu[i].score
【解析】累加每个学生的成绩到sum变量。通过循环变量i遍历结构体数组stu,用stu[i].score访问第i个学生的score成员。循环结束后sum/3即为平均分。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是使用共用体存储数据并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 union Data
L3 {
L4 int i;
L5 float f;
L6 };
L7 main()
L8 {
L9 union Data d;
L10 d.f = 3.14;
L11 printf("整数:%d,浮点数:%.2f
", d.i, d.f);
L12 }
【答案】【1】L11: printf("整数:%d,浮点数:%.2f
", d.i, d.f); → 应改为 printf("浮点数:%.2f
", d.f);(共用体各成员共享内存,d.f=3.14后d.i的值不确定,不能同时输出两个成员)
【解析】共用体所有成员共享同一内存空间。向d.f写入浮点数3.14后,内存中以浮点格式存储3.14的二进制表示。此时读取d.i会以整型格式解释同一段内存的位模式,得到的值不是有意义的整数。正确的做法是每次操作使用一个成员,避免同时读取多个。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第26练,内容是7.4 结构体数组 + 7.5 共用体。
《编程语言基础——C语言》(第5版)一课一练 第26练
7.4 结构体数组 + 7.5 共用体
一、单选题
1. 关于结构体数组,下列说法正确的是( )
A. 结构体数组的每个元素都是一个结构体变量
B. 结构体数组的所有元素共享同一块内存
C. 结构体数组的元素只能是整型数据
D. 结构体数组不能像普通数组一样用下标访问
2. 已定义 struct Student { int num; char name[20]; }; 要定义一个包含50个元素的Student类型数组,正确的是( )
A. Student stu[50];
B. struct Student stu[50];
C. struct stu[50];
D. Student struct[50];
3. 已定义 struct Point { int x; int y; } p[3] = {{1,2}, {3,4}, {5,6}}; 则表达式 p[1].x + p[2].y 的值是( )
A. 6
B. 8
C. 9
D. 11
4. 关于共用体(union),下列说法正确的是( )
A. 共用体的所有成员可以同时被使用
B. 共用体占用的内存等于所有成员内存之和
C. 共用体变量定义后,所有成员的值同时有效
D. 共用体的各个成员共享同一段内存空间
5. 定义了 union Data { int i; char c; double d; }; 在常见的编译环境中,该共用体类型占用的字节数是( )
A. 8(double的大小)
B. 4+1+8=13(所有成员大小之和)
C. 4(int的大小)
D. 1(char的大小)
6. 已定义 struct Student { int num; float score; } stu[3] = {{1,85}, {2,92}, {3,78}}; 要输出score最大的学生的学号,以下循环思路正确的是( )
A. 直接输出stu[1].score,因为它是中间值
B. 遍历数组,用一个变量记录当前最大score的下标,遍历结束后输出该下标对应的num
C. 用冒泡排序对score排序后,输出stu[0].num
D. 计算所有score的平均值,输出最接近平均值的num
7. 有以下程序段:union U { int a; char b; } u; u.a = 65; u.b = 'B'; printf("%d", u.a); 输出结果正确的是( )
A. 65
B. 0
C. 66
D. 编译错误
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Student
{
int num;
float score;
};
main()
{
struct Student s[3] = {{101, 75}, {102, 88}, {103, 66}};
int i, max_i = 0;
for (i = 1; i < 3; i++)
if (s[i].score > s[max_i].score)
max_i = i;
printf("%d,%.0f", s[max_i].num, s[max_i].score);
}
三、程序填空题
9. 以下程序的功能是:输入3个学生的学号和成绩,计算并输出平均分。请填空。
#include <stdio.h>
struct Student
{
int num;
float score;
};
main()
{
struct Student stu[3];
int i;
float sum = 0;
for (i = 0; i < 3; i++)
{
printf("请输入第%d个学生的学号和成绩:", i + 1);
scanf("%d%f", &stu[i].num, &stu[i].score);
sum = sum + 【1】;
}
printf("平均分:%.1f
", sum / 3);
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是使用共用体存储数据并输出。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 union Data
L3 {
L4 int i;
L5 float f;
L6 };
L7 main()
L8 {
L9 union Data d;
L10 d.f = 3.14;
L11 printf("整数:%d,浮点数:%.2f
", d.i, d.f);
L12 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$