内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第31练,内容是第7章 结构体和共用体综合。
《C语言》(第五版)一课一练 第31练
第7章 结构体和共用体综合
一、单选题
1. 以下关于C语言中结构体和共用体的叙述中,正确的是( )
A. 结构体和共用体的成员都共享同一段内存空间
B. 结构体各成员占用各自的内存空间,共用体各成员共享同一段内存空间
C. 结构体和共用体的大小都等于最大成员的大小
D. 结构体变量可以整体输入输出,共用体变量也可以整体输入输出
2. 设有定义 struct Book { int id; float price; } b[2]={{1,25.5},{2,30.0}}; 则b[0].price + b[1].price的值是( )
A. 55.5
B. 25.5
C. 30.0
D. 3
3. 设有定义 union Data { int i; float f; } d; 执行 d.f = 3.14; d.i = 10; printf("%f", d.f); 后,输出结果是( )
A. 3.14
B. 10.0
C. 输出一个不确定的值
D. 0.0
4. 设有以下定义:
struct Time { int h, m, s; };
struct Record { int id; struct Time t; } r = {1, {14, 30, 0}};
则以下能正确输出r的小时的表达式是( )
A. r.Time.h
B. r->t.h
C. Record.t.h
D. r.t.h
5. 设有以下定义:
struct S1 { char a; int b; char c; };
struct S2 { int b; char a; char c; };
假设int占4字节、char占1字节,考虑内存对齐,sizeof(S1)与sizeof(S2)分别是( )
A. 6和6
B. 8和8
C. 12和8
D. 12和12
6. 以下程序片段对结构体数组按成绩降序排序,输出第一个元素的学号是
struct Stu { int num; int score; } s[3]={{101,85},{102,95},{103,78}}, t;
int i, j;
for(i=0;i<2;i++)
for(j=0;j<2-i;j++)
if(s[j].score<s[j+1].score)
{ t=s[j]; s[j]=s[j+1]; s[j+1]=t; }
printf("%d", s[0].num);( )
A. 102
B. 101
C. 103
D. 95
7. 以下程序片段的输出结果是
union U { int a; char b; };
struct S { int x; union U y; };
struct S s;
s.x = 10;
s.y.a = 20;
s.y.b = 'A';
printf("%d %d", s.x, s.y.a);( )
A. 10 20
B. 不确定值 20
C. 10 65
D. 10 不确定值
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Stu {
int num;
char name[20];
float score;
};
main()
{
struct Stu s[3] = {{101, "Wang", 85}, {102, "Li", 92}, {103, "Zhang", 78}};
struct Stu temp;
int i, max = 0;
float sum = 0;
for (i = 0; i < 3; i++)
{
sum += s[i].score;
if (s[i].score > s[max].score)
max = i;
}
printf("最高分:%s %.1f
", s[max].name, s[max].score);
printf("平均分:%.1f
", sum / 3);
}
三、案例分析题
9. 以下程序的功能是定义一个包含共用体成员的结构体,用于存储人员信息(教师存职称,学生存班级)。请填空。
#include <stdio.h>
#include <string.h>
struct Person {
int num;
char name[20];
char type;
【1】 info;
};
union Info {
char title[20];
int clazz;
};
main()
{
struct Person p;
p.num = 1001;
strcpy(p.name, "Zhang");
p.type = 'T';
strcpy(【2】, "Professor");
printf("%d %s ", p.num, p.name);
if (p.type == 'T')
printf("%s
", p.info.【3】);
else
printf("%d
", p.info.clazz);
}
四、综合应用题
10. 编写一个C程序:定义结构体类型Contact表示通讯录联系人,包含姓名name(字符数组)、电话phone(字符数组)和年龄age(整型)。定义包含3个联系人的结构体数组并初始化,实现以下功能:(1)输出所有联系人信息;(2)查找并输出年龄最大的联系人信息。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第31练,内容是第7章 结构体和共用体综合。
《C语言》(第五版)一课一练 第31练
第7章 结构体和共用体综合
一、单选题
1. 以下关于C语言中结构体和共用体的叙述中,正确的是( )
A. 结构体和共用体的成员都共享同一段内存空间
B. 结构体各成员占用各自的内存空间,共用体各成员共享同一段内存空间
C. 结构体和共用体的大小都等于最大成员的大小
D. 结构体变量可以整体输入输出,共用体变量也可以整体输入输出
【答案】B
【解析】结构体各成员各自占用独立的内存空间,结构体大小为各成员大小之和(考虑对齐)。共用体各成员共享同一段内存,大小等于最大成员的大小。A错误,结构体成员不共享内存。C错误,结构体大小不等于最大成员大小。D错误,两者都不能整体输入输出。
2. 设有定义 struct Book { int id; float price; } b[2]={{1,25.5},{2,30.0}}; 则b[0].price + b[1].price的值是( )
A. 55.5
B. 25.5
C. 30.0
D. 3
【答案】A
【解析】b[0]={1,25.5},b[1]={2,30.0}。b[0].price=25.5,b[1].price=30.0,两者相加得55.5。结构体数组通过下标定位元素,再用点运算符访问成员。
3. 设有定义 union Data { int i; float f; } d; 执行 d.f = 3.14; d.i = 10; printf("%f", d.f); 后,输出结果是( )
A. 3.14
B. 10.0
C. 输出一个不确定的值
D. 0.0
【答案】C
【解析】共用体成员共享内存,对d.i赋值10后,之前d.f=3.14写入的内存已被覆盖。此时d.f的内容是不确定的,输出结果无法预期。A错误,3.14已被覆盖。B和D也不正确,因为内存中存储的是整型10的二进制表示,按浮点格式解读不是10.0。
4. 设有以下定义:
struct Time { int h, m, s; };
struct Record { int id; struct Time t; } r = {1, {14, 30, 0}};
则以下能正确输出r的小时的表达式是( )
A. r.Time.h
B. r->t.h
C. Record.t.h
D. r.t.h
【答案】D
【解析】嵌套结构体访问内层成员使用多级点运算符。r.t访问外层成员t(struct Time类型),r.t.h进一步访问t的小时成员。A中Time是类型名不是成员名。B中r不是指针不能用->。C中Record也是类型名,不能用于成员访问。
5. 设有以下定义:
struct S1 { char a; int b; char c; };
struct S2 { int b; char a; char c; };
假设int占4字节、char占1字节,考虑内存对齐,sizeof(S1)与sizeof(S2)分别是( )
A. 6和6
B. 8和8
C. 12和8
D. 12和12
【答案】C
【解析】S1中a占1字节后补3字节对齐到4,b占4字节,c占1字节后补3字节对齐,共12字节。S2中b占4字节,a和c各占1字节共2字节,补2字节对齐到4,共8字节。成员排列顺序影响结构体大小,合理排列可以节省内存。
6. 以下程序片段对结构体数组按成绩降序排序,输出第一个元素的学号是
struct Stu { int num; int score; } s[3]={{101,85},{102,95},{103,78}}, t;
int i, j;
for(i=0;i<2;i++)
for(j=0;j<2-i;j++)
if(s[j].score<s[j+1].score)
{ t=s[j]; s[j]=s[j+1]; s[j+1]=t; }
printf("%d", s[0].num);( )
A. 102
B. 101
C. 103
D. 95
【答案】A
【解析】程序使用冒泡排序按score降序排列。初始s[0]={101,85},s[1]={102,95},s[2]={103,78}。第一轮i=0:j=0时85<95交换,数组变为{102,95},{101,85},{103,78};j=1时85>78不交换。第二轮i=1:j=0时95>78不交换。排序后s[0]={102,95},学号为102。
7. 以下程序片段的输出结果是
union U { int a; char b; };
struct S { int x; union U y; };
struct S s;
s.x = 10;
s.y.a = 20;
s.y.b = 'A';
printf("%d %d", s.x, s.y.a);( )
A. 10 20
B. 不确定值 20
C. 10 65
D. 10 不确定值
【答案】D
【解析】s.x=10存储在结构体独立内存中。s.y.a=20写入共用体,但s.y.b='A'(ASCII值65)覆盖了共用体共享内存。此后s.y.a的值已不是20,而是被覆盖后的不确定值。s.x不受影响仍为10。结构体中包含共用体成员时,共用体的存储特性不变。
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Stu {
int num;
char name[20];
float score;
};
main()
{
struct Stu s[3] = {{101, "Wang", 85}, {102, "Li", 92}, {103, "Zhang", 78}};
struct Stu temp;
int i, max = 0;
float sum = 0;
for (i = 0; i < 3; i++)
{
sum += s[i].score;
if (s[i].score > s[max].score)
max = i;
}
printf("最高分:%s %.1f
", s[max].name, s[max].score);
printf("平均分:%.1f
", sum / 3);
}
【答案】最高分:Li 92.0
平均分:85.0
【解析】程序遍历结构体数组s,累加成绩sum=85+92+78=255,同时记录最高分下标max=1(Li的92分最高)。第一行输出最高分学生姓名和成绩。第二行输出平均分255/3=85.0。这是结构体数组的典型应用:同时完成查找最大值和求平均值。
三、案例分析题
9. 以下程序的功能是定义一个包含共用体成员的结构体,用于存储人员信息(教师存职称,学生存班级)。请填空。
#include <stdio.h>
#include <string.h>
struct Person {
int num;
char name[20];
char type;
【1】 info;
};
union Info {
char title[20];
int clazz;
};
main()
{
struct Person p;
p.num = 1001;
strcpy(p.name, "Zhang");
p.type = 'T';
strcpy(【2】, "Professor");
printf("%d %s ", p.num, p.name);
if (p.type == 'T')
printf("%s
", p.info.【3】);
else
printf("%d
", p.info.clazz);
}
【答案】【1】union Info
【2】p.info.title
【3】title
【解析】【1】结构体中的共用体成员需要声明类型为union Info。【2】给教师职称赋值,通过p.info.title访问共用体的title成员。p.type='T'表示教师,存储职称信息。【3】type为'T'时输出职称,访问p.info.title。共用体作为结构体成员,实现了同一区域存储不同类型信息的功能。
四、综合应用题
10. 编写一个C程序:定义结构体类型Contact表示通讯录联系人,包含姓名name(字符数组)、电话phone(字符数组)和年龄age(整型)。定义包含3个联系人的结构体数组并初始化,实现以下功能:(1)输出所有联系人信息;(2)查找并输出年龄最大的联系人信息。
【答案】#include <stdio.h>
#include <string.h>
struct Contact {
char name[20];
char phone[15];
int age;
};
main()
{
struct Contact c[3] = {
{"Zhang", "13800138001", 25},
{"Li", "13900139002", 30},
{"Wang", "13700137003", 28}
};
int i, max = 0;
printf("所有联系人:
");
for (i = 0; i < 3; i++)
printf("姓名:%s 电话:%s 年龄:%d
", c[i].name, c[i].phone, c[i].age);
for (i = 1; i < 3; i++)
if (c[i].age > c[max].age)
max = i;
printf("年龄最大:%s %s %d岁
", c[max].name, c[max].phone, c[max].age);
}
【解析】程序定义Contact结构体类型,初始化3个联系人的数组。第一个循环输出所有联系人信息。第二个循环查找年龄最大的联系人下标,通过比较c[i].age与c[max].age更新max。最后输出年龄最大的联系人信息。这是结构体数组的典型综合应用。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$