内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第25练,内容是7.3 结构体变量的引用。
《编程语言基础——C语言》(第5版)一课一练 第25练
7.3 结构体变量的引用
一、单选题
1. 在C语言中,引用结构体变量成员的运算符是( )
A. .(点运算符)
B. ->(箭头运算符)
C. &(取地址运算符)
D. *(间接访问运算符)
【答案】A
【解析】对于结构体变量本身(非指针),通过.运算符访问其成员,格式为:结构体变量名.成员名。->用于结构体指针访问成员,&用于取地址,*用于间接访问。
2. 已定义 struct Point { int x; int y; }; 则以下正确的初始化语句是( )
A. struct Point p; p = (10, 20);
B. struct Point p = {10, 20};
C. struct Point p = [10, 20];
D. struct Point p = (10, 20);
【答案】B
【解析】结构体变量的初始化使用花括号{}将各成员的初始值括起来,按成员定义顺序赋值。A的赋值语句不能用圆括号初始化整个结构体;C用了方括号;D用了圆括号,语法均不正确。
3. 以下程序段的输出结果是:struct Test { int a; char c; } t; t.a = 65; t.c = t.a; printf("%c", t.c);( )
A. 65
B. a
C. A
D. 编译错误
【答案】C
【解析】t.a赋值为65,然后将t.a的值赋给t.c(char类型)。字符65对应的ASCII字符是大写字母'A'。虽然t.a是int型,但赋值给char时会发生隐式类型转换,%c按字符格式输出A。
4. 已定义 struct Student { int num; float score; } s1 = {1, 90}, s2; 执行 s2 = s1; 后,下列说法正确的是( )
A. 编译错误,结构体变量不能整体赋值
B. s2中的num被赋值为1,score保持原值
C. s1和s2共享同一段内存
D. s2各成员的值与s1完全相同
【答案】D
【解析】同类型的结构体变量之间可以整体赋值,赋值操作将源变量每个成员的值逐成员复制给目标变量。s1和s2是独立的内存空间,互不影响。这是C语言中结构体与数组的重要区别。
5. 定义了结构体 struct Date { int y, m, d; }; struct Person { char name[10]; struct Date birth; }; 则以下正确的初始化是( )
A. struct Person p = {"Zhang", {2000, 6, 15}};
B. struct Person p = {"Zhang", 2000, 6, 15};
C. struct Person p = {Zhang, {2000, 6, 15}};
D. struct Person p = {"Zhang", (2000, 6, 15)};
【答案】A
【解析】嵌套结构体的初始化需要用内层花括号{}包裹内层结构体的初始值。A格式正确:外层{}为Person的初始值,内层{}为birth(Date类型)的初始值。B缺少内层花括号;C中Zhang缺少引号;D使用圆括号不正确。
6. 已定义 struct Student { int num; char name[20]; } s; 要从键盘输入学号和姓名,正确的scanf语句是( )
A. scanf("%d%s", s.num, s.name);
B. scanf("%d%s", &s.num, s.name);
C. scanf("%d%s", &s.num, &s.name);
D. scanf("%d%s", s.num, &s.name);
【答案】B
【解析】scanf要求传入变量的地址。s.num是int型成员,需要&s.num取地址;s.name是字符数组名,本身代表数组首地址,不需要再&。因此正确的格式是&s.num和s.name。
7. 以下程序段的输出结果是:struct { int x; int y; } a = {3, 5}, b; b = a; b.x = 10; printf("%d,%d", a.x, b.x);( )
A. 10,10
B. 3,3
C. 3,10
D. 10,3
【答案】C
【解析】b=a将a的每个成员复制给b(值复制),之后b和a是独立的内存空间。b.x=10修改的是b的成员,不影响a。因此a.x=3,b.x=10,输出3,10。这体现了结构体整体赋值是值复制。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Rect
{
int width;
int height;
};
main()
{
struct Rect r = {5, 8};
int area = r.width * r.height;
int peri = 2 * (r.width + r.height);
printf("area=%d,peri=%d", area, peri);
}
【答案】area=40,peri=26
【解析】程序定义结构体Rect表示矩形,r.width=5,r.height=8。通过.运算符访问成员计算面积area=5*8=40,周长peri=2*(5+8)=26。按格式输出area=40,peri=26。
三、程序填空题
9. 以下程序的功能是:输入一个学生的学号和两门课成绩,计算并输出总分。请填空。
#include <stdio.h>
struct Student
{
int num;
float score1, score2;
};
main()
{
struct Student stu;
float total;
printf("请输入学号和两门课成绩:");
scanf("%d%f%f", &stu.num, &stu.score1, 【1】);
total = stu.score1 + stu.score2;
printf("学号:%d,总分:%.1f
", stu.num, total);
}
【答案】【1】&stu.score2
【解析】scanf输入float型成员score2,需要使用&取地址运算符。由于stu是结构体变量而非指针,访问成员用.运算符,取成员地址用&stu.score2。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是输入一个学生的学号和三门课成绩,计算并输出平均分。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 struct Student
L3 {
L4 int num;
L5 float s1, s2, s3;
L6 };
L7 main()
L8 {
L9 struct Student stu;
L10 float avg;
L11 printf("请输入学号和三门课成绩:");
L12 scanf("%d%f%f%f", &stu.num, stu.s1, stu.s2, stu.s3);
L13 avg = (stu.s1 + stu.s2 + stu.s3) / 3;
L14 printf("学号:%d,平均分:%.1f
", stu.num, avg);
L15 }
【答案】【1】L12: scanf("%d%f%f%f", &stu.num, stu.s1, stu.s2, stu.s3); → 应改为 scanf("%d%f%f%f", &stu.num, &stu.s1, &stu.s2, &stu.s3);(stu.s1等float型成员必须加&取地址)
【解析】scanf函数要求传入变量的地址。stu.num是int型成员,&stu.num取地址正确;但stu.s1、stu.s2、stu.s3是float型成员,需要通过&取地址才能正确接收输入数据。不加&会导致scanf将成员的值当作地址使用,产生运行时错误。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第25练,内容是7.3 结构体变量的引用。
《编程语言基础——C语言》(第5版)一课一练 第25练
7.3 结构体变量的引用
一、单选题
1. 在C语言中,引用结构体变量成员的运算符是( )
A. .(点运算符)
B. ->(箭头运算符)
C. &(取地址运算符)
D. *(间接访问运算符)
2. 已定义 struct Point { int x; int y; }; 则以下正确的初始化语句是( )
A. struct Point p; p = (10, 20);
B. struct Point p = {10, 20};
C. struct Point p = [10, 20];
D. struct Point p = (10, 20);
3. 以下程序段的输出结果是:struct Test { int a; char c; } t; t.a = 65; t.c = t.a; printf("%c", t.c);( )
A. 65
B. a
C. A
D. 编译错误
4. 已定义 struct Student { int num; float score; } s1 = {1, 90}, s2; 执行 s2 = s1; 后,下列说法正确的是( )
A. 编译错误,结构体变量不能整体赋值
B. s2中的num被赋值为1,score保持原值
C. s1和s2共享同一段内存
D. s2各成员的值与s1完全相同
5. 定义了结构体 struct Date { int y, m, d; }; struct Person { char name[10]; struct Date birth; }; 则以下正确的初始化是( )
A. struct Person p = {"Zhang", {2000, 6, 15}};
B. struct Person p = {"Zhang", 2000, 6, 15};
C. struct Person p = {Zhang, {2000, 6, 15}};
D. struct Person p = {"Zhang", (2000, 6, 15)};
6. 已定义 struct Student { int num; char name[20]; } s; 要从键盘输入学号和姓名,正确的scanf语句是( )
A. scanf("%d%s", s.num, s.name);
B. scanf("%d%s", &s.num, s.name);
C. scanf("%d%s", &s.num, &s.name);
D. scanf("%d%s", s.num, &s.name);
7. 以下程序段的输出结果是:struct { int x; int y; } a = {3, 5}, b; b = a; b.x = 10; printf("%d,%d", a.x, b.x);( )
A. 10,10
B. 3,3
C. 3,10
D. 10,3
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
struct Rect
{
int width;
int height;
};
main()
{
struct Rect r = {5, 8};
int area = r.width * r.height;
int peri = 2 * (r.width + r.height);
printf("area=%d,peri=%d", area, peri);
}
三、程序填空题
9. 以下程序的功能是:输入一个学生的学号和两门课成绩,计算并输出总分。请填空。
#include <stdio.h>
struct Student
{
int num;
float score1, score2;
};
main()
{
struct Student stu;
float total;
printf("请输入学号和两门课成绩:");
scanf("%d%f%f", &stu.num, &stu.score1, 【1】);
total = stu.score1 + stu.score2;
printf("学号:%d,总分:%.1f
", stu.num, total);
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是输入一个学生的学号和三门课成绩,计算并输出平均分。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 struct Student
L3 {
L4 int num;
L5 float s1, s2, s3;
L6 };
L7 main()
L8 {
L9 struct Student stu;
L10 float avg;
L11 printf("请输入学号和三门课成绩:");
L12 scanf("%d%f%f%f", &stu.num, stu.s1, stu.s2, stu.s3);
L13 avg = (stu.s1 + stu.s2 + stu.s3) / 3;
L14 printf("学号:%d,平均分:%.1f
", stu.num, avg);
L15 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$