内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第29练,内容是7.3 结构体变量的引用、初始化与赋值。
《C语言》(第五版)一课一练 第29练
7.3 结构体变量的引用、初始化与赋值
一、单选题
1. 设有定义 struct Stu { int num; char name[20]; float score; } s; 则以下能正确引用s的学号成员的是( )
A. s.num
B. s->num
C. Stu.num
D. struct Stu.num
【答案】A
【解析】引用结构体变量的成员使用点运算符(成员运算符),格式为变量名.成员名。A中s.num正确引用了s的num成员。B中->运算符用于通过指针访问成员,s不是指针。C中Stu是类型名不是变量,不能使用点运算符。D中struct Stu也是类型名,同样不能用于成员访问。
2. 设有定义 struct Point { int x; int y; } p = {10, 20}; 则p.y的值是( )
A. 10
B. 0
C. 不确定
D. 20
【答案】D
【解析】结构体变量初始化时,花括号中的值按顺序依次赋给各成员。p={10,20}表示p.x=10,p.y=20,因此p.y的值为20。A是p.x的值。B是未初始化成员的默认值(但此处y已初始化)。C错误,初始化后值是确定的。
3. 设有定义 struct Point { int x; int y; } p1={1,2}, p2; 执行 p2=p1; p2.x=5; 后,p1.x 的值是( )
A. 5
B. 1
C. 2
D. 0
【答案】B
【解析】p2=p1将p1各成员的值复制到p2中,这是值复制,p2和p1是独立的变量。之后p2.x=5修改的是p2的成员x,不影响p1。因此p1.x仍然是初始值1。结构体变量之间赋值是逐成员复制,修改其中一个不会影响另一个。
4. 设有定义 struct Stu { int num; char name[20]; float score; } s; 以下能正确为s输入数据的是( )
A. scanf("%d%s%f", &s.num, s.name, &s.score);
B. scanf("%d%s%f", &s.num, &s.name, &s.score);
C. scanf("%d%s%f", s.num, s.name, s.score);
D. scanf("%d%s%f", &s, &s.name, &s.score);
【答案】A
【解析】scanf中整型和浮点型成员需要取地址,而name是字符数组,数组名本身就是首元素地址,不需要再加&。A正确:&s.num取整型成员地址,s.name直接用数组名,&s.score取浮点成员地址。B中&s.name写法错误,s.name已经是地址。C中s.num和s.score缺少取地址符&。D中&s取整个结构体变量的地址是错误的。
5. 以下关于结构体变量运算的描述中,正确的是( )
A. 结构体变量之间可以直接进行加减运算
B. 可以使用==运算符比较两个结构体变量是否相等
C. 同类型的结构体变量可以相互赋值
D. 结构体变量可以整体进行输入输出
【答案】C
【解析】同类型结构体变量之间可以整体赋值,将源变量各成员的值复制到目标变量。A错误,结构体变量之间不能直接进行算术运算。B错误,C语言不允许用==直接比较两个结构体变量,需要逐个成员比较。D错误,结构体变量不能整体用printf/scanf输入输出,需要逐个成员处理。
6. 设有以下定义:
struct Date { int y, m, d; };
struct Emp { int id; struct Date hire; } e = {1001, {2020, 8, 15}};
则以下能正确输出入职年份的是( )
A. printf("%d", e.hire->y);
B. printf("%d", e.Date.y);
C. printf("%d", hire.y);
D. printf("%d", e.hire.y);
【答案】D
【解析】嵌套结构体访问内层成员使用多级点运算符,从外到内逐级引用。e.hire访问外层成员hire(struct Date类型),e.hire.y进一步访问hire的成员y。A中hire不是指针,不能用->。B中Date是类型名不是成员名。C中hire需要通过e来访问,不能单独使用。
7. 以下程序片段的输出结果是
struct T { int a; int b; };
struct T f1, f2 = {3, 4};
f1 = f2;
f1.a += f2.b;
f2.b = f1.a;
printf("%d %d", f1.a, f2.b);( )
A. 7 4
B. 3 4
C. 7 7
D. 4 7
【答案】C
【解析】f2={3,4},f1=f2后f1={3,4}。f1.a+=f2.b即f1.a=3+4=7,此时f1={7,4}。f2.b=f1.a=7,此时f2={3,7}。输出f1.a=7和f2.b=7,结果为7 7。
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Score {
float chinese;
float math;
float english;
};
main()
{
struct Score s1 = {80.5, 90.0, 75.5}, s2;
s2 = s1;
s2.math = 85.0;
printf("%.1f %.1f
", s1.math, s2.math);
printf("%.1f
", s2.chinese + s2.math + s2.english);
}
【答案】90.0 85.0
241.0
【解析】s1={80.5,90.0,75.5},s2=s1后s2={80.5,90.0,75.5}。修改s2.math为85.0,s1.math不受影响仍为90.0。第一行输出s1.math=90.0和s2.math=85.0。第二行输出s2的总分80.5+85.0+75.5=241.0。
三、案例分析题
9. 以下程序的功能是定义一个表示日期的结构体,输入一个日期,计算并输出该日期是当年第几天。请填空。
#include <stdio.h>
struct Date {
int year, month, day;
};
main()
{
struct Date d;
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int i, sum = 0;
printf("请输入年 月 日:");
scanf("%d%d%d", 【1】);
for (i = 0; i < d.month - 1; i++)
sum += 【2】;
sum += d.day;
if (d.year % 4 == 0 && d.year % 100 != 0 【3】 d.year % 400 == 0)
if (d.month > 2) sum++;
printf("第%d天
", sum);
}
【答案】【1】&d.year, &d.month, &d.day
【2】days[i]
【3】||
【解析】【1】scanf需要各成员的地址,分别为&d.year、&d.month、&d.day。【2】累加d.month之前各月的天数,days[i]是第i+1月的天数。【3】闰年的判断条件:能被4整除不能被100整除,同时能被400整除也属于闰年,两个条件之间用逻辑||连接。
四、综合应用题
10. 编写一个C程序:定义一个表示学生成绩的结构体类型Student,包含学号num(整型)、姓名name(字符数组)、三门课成绩chinese、math、english(均为浮点型)和平均分average(浮点型)。输入一个学生的学号、姓名和三门课成绩,计算平均分并存入average成员,输出该学生的全部信息。
【答案】#include <stdio.h>
struct Student {
int num;
char name[20];
float chinese, math, english, average;
};
main()
{
struct Student s;
printf("请输入学号:");
scanf("%d", &s.num);
printf("请输入姓名:");
scanf("%s", s.name);
printf("请输入语文、数学、英语成绩:");
scanf("%f%f%f", &s.chinese, &s.math, &s.english);
s.average = (s.chinese + s.math + s.english) / 3;
printf("学号:%d 姓名:%s
", s.num, s.name);
printf("语文:%.1f 数学:%.1f 英语:%.1f
", s.chinese, s.math, s.english);
printf("平均分:%.1f
", s.average);
}
【解析】程序定义Student结构体类型,包含学号、姓名、三门课成绩和平均分成员。通过scanf逐个输入各成员值(注意name是数组不需取地址)。计算三门课的平均值赋给average成员,最后按格式输出全部信息。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《C语言》(第五版)《一课一练》第29练,内容是7.3 结构体变量的引用、初始化与赋值。
《C语言》(第五版)一课一练 第29练
7.3 结构体变量的引用、初始化与赋值
一、单选题
1. 设有定义 struct Stu { int num; char name[20]; float score; } s; 则以下能正确引用s的学号成员的是( )
A. s.num
B. s->num
C. Stu.num
D. struct Stu.num
2. 设有定义 struct Point { int x; int y; } p = {10, 20}; 则p.y的值是( )
A. 10
B. 0
C. 不确定
D. 20
3. 设有定义 struct Point { int x; int y; } p1={1,2}, p2; 执行 p2=p1; p2.x=5; 后,p1.x 的值是( )
A. 5
B. 1
C. 2
D. 0
4. 设有定义 struct Stu { int num; char name[20]; float score; } s; 以下能正确为s输入数据的是( )
A. scanf("%d%s%f", &s.num, s.name, &s.score);
B. scanf("%d%s%f", &s.num, &s.name, &s.score);
C. scanf("%d%s%f", s.num, s.name, s.score);
D. scanf("%d%s%f", &s, &s.name, &s.score);
5. 以下关于结构体变量运算的描述中,正确的是( )
A. 结构体变量之间可以直接进行加减运算
B. 可以使用==运算符比较两个结构体变量是否相等
C. 同类型的结构体变量可以相互赋值
D. 结构体变量可以整体进行输入输出
6. 设有以下定义:
struct Date { int y, m, d; };
struct Emp { int id; struct Date hire; } e = {1001, {2020, 8, 15}};
则以下能正确输出入职年份的是( )
A. printf("%d", e.hire->y);
B. printf("%d", e.Date.y);
C. printf("%d", hire.y);
D. printf("%d", e.hire.y);
7. 以下程序片段的输出结果是
struct T { int a; int b; };
struct T f1, f2 = {3, 4};
f1 = f2;
f1.a += f2.b;
f2.b = f1.a;
printf("%d %d", f1.a, f2.b);( )
A. 7 4
B. 3 4
C. 7 7
D. 4 7
二、简答题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Score {
float chinese;
float math;
float english;
};
main()
{
struct Score s1 = {80.5, 90.0, 75.5}, s2;
s2 = s1;
s2.math = 85.0;
printf("%.1f %.1f
", s1.math, s2.math);
printf("%.1f
", s2.chinese + s2.math + s2.english);
}
三、案例分析题
9. 以下程序的功能是定义一个表示日期的结构体,输入一个日期,计算并输出该日期是当年第几天。请填空。
#include <stdio.h>
struct Date {
int year, month, day;
};
main()
{
struct Date d;
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int i, sum = 0;
printf("请输入年 月 日:");
scanf("%d%d%d", 【1】);
for (i = 0; i < d.month - 1; i++)
sum += 【2】;
sum += d.day;
if (d.year % 4 == 0 && d.year % 100 != 0 【3】 d.year % 400 == 0)
if (d.month > 2) sum++;
printf("第%d天
", sum);
}
四、综合应用题
10. 编写一个C程序:定义一个表示学生成绩的结构体类型Student,包含学号num(整型)、姓名name(字符数组)、三门课成绩chinese、math、english(均为浮点型)和平均分average(浮点型)。输入一个学生的学号、姓名和三门课成绩,计算平均分并存入average成员,输出该学生的全部信息。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$