第9章 第1、2节:结构体的定义、结构体在程序中的使用(练习)-《C语言程序设计》(电子工业出版社)上好课

2026-06-29
| 2份
| 34页
| 44人阅读
| 0人下载

内容正文:

9.1与9.2节:结构体的定义、结构体在程序中的使用 一、单项选择题 1.下列关于 C 语言结构体的核心作用,描述正确的是( ) A. 结构体可以存储多个不同数据类型的成员,封装一组相关数据 B. 结构体内部只能存放相同类型的数据 C. 结构体变量整体可以直接参与加减乘除算术运算 D. 结构体定义完成后自动生成全局变量 2.定义结构体类型的标准语法开头关键字是() A. union B. struct C. typedef D. enum 3.设有以下程序代码段,则该结构体变量 s1 的定义方式属于() struct Student{ int id; char name[20];}; struct Student s1; A. 定义类型同时定义变量 B. 先定义结构体类型,后定义变量 C. 无名结构体直接定义变量 D. 嵌套结构体变量定义 4.结构体成员访问的基础运算符是() A. * B. -> C. . D. & 5.执行语句struct Date{int y,m,d;} d1={2026,6,22};,该变量 d1 的定义方式为() A. 先定义类型后定义变量 B. 定义类型的同时定义变量 C. 无名结构体变量 D. 嵌套结构体变量 6.下列结构体初始化代码语法完全合法的是() A. struct Stu{int a;char b;} s={10,"k"}; B. struct Stu{int a;char b;} s={10,'m'}; C. struct Stu{int a;char b;} s=10,'c'; D. struct Stu{int a;char b;} s; s={5,'z'}; 7.设有以下所示程序代码段,则输出 p1 的出生年份,正确写法是() struct Date{int year;int month;int day;}; struct Person{ char name[10]; struct Date birth; }p1; A. printf ("%d",p1.birth.year); B. printf ("%d",p1->birth.year); C. printf ("%d",p1.year); D. printf ("%d",birth.year); 8.执行struct Book{char name[20];float price;} b;,想要手动给价格赋值 75.9,正确语句是() A. b.price = 75.9; B. Book.price = 75.9; C. b->price = 75.9; D. b = {,75.9}; 9.下列操作对结构体变量合法的是() A. 两个同类型结构体变量直接互相整体赋值 s2 = s1; B. printf("%s",s1); 直接整体打印结构体变量 C. scanf("%d",s1); 直接整体读取结构体变量 D. s1 = s1 + s2; 两个结构体变量相加运算 10.关于嵌套结构体的定义顺序,说法正确的是() A. 内层结构体必须提前完整定义,才能作为外层结构体的成员 B. 外层结构体可以先定义,内部再写未定义的结构体类型 C. 嵌套结构体不允许包含 int、char 基础类型成员 D. 嵌套结构体变量不能访问内层结构体的成员 二、填空题。 1.定义结构体类型必须使用的关键字是___________。 2.普通结构体变量访问内部成员时,使用的运算符是___________。 3.结构体初始化列表中,未提供初始值的尾部成员,系统会自动赋值为___________。 4.若结构体 A 内部包含已经定义好的结构体 B 作为成员,这种结构称为结构体___________。 5.C 语言不允许对结构体变量进行整体的scanf输入与_______输出,只能逐个成员操作。 6.结构体内部每一个数据项统称为结构体的___________。 7.执行struct Date{int y,m,d;} d={2026,9};,变量 d 中 d 成员的默认数值是___________。 8.设有以下定义,打印 man1 的出生月份完整语句:printf ("% d",________); struct Date{int y;int m;int d;}; struct Man{char name[8];struct Date bir;} man1; 9.完成结构体完整类型定义的一对大括号结束之后,末尾必须追加________,否则编译器判定语法错误。 10.设有定义:struct Time{int h;int m;};struct Lesson{char name[10]; struct Time t;} les = {"Math", {8,30}};表达式 les.t.h * 60 + les.t.m 用来换算总分钟,最终数值是___________。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Stu{ int a; int b; } s = {13, 6}; int main() { int r = s.a - s.b * 2; printf("%d", r); return 0; } 2.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Date{ int year; int mon; }; struct User{ char name[10]; struct Date d; } u = {"Tom", {2026, 9}}; int main() { printf("%d", u.d.year - u.d.mon); return 0; } 3.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Box{ int w; int h; }; int main() { struct Box b1 = {7, 3}; struct Box b2 = b1; printf("%d", b2.w * b2.h); return 0; } 4.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Score{ int chi; int mat; int eng; } s = {85, 92}; int main() { int all = s.chi + s.mat + s.eng; printf("%d", all); return 0; } 5.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Point{ int x; int y; }; struct Square{ struct Point pt; int len; } sq = {{4,6}, 5}; int main() { int ans = sq.pt.x + sq.len; printf("%d", ans); return 0; } 6.写出下列程序段的输出结果:________________。 #include <stdio.h> struct NumPair{ int a; int b; }; int main() { struct NumPair x = {30, 8}; struct NumPair y; y = x; printf("%d", y.a / y.b); return 0; } 7.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Birth{ int y; int m; int d; }; struct Man{ struct Birth bir; } man = {{2010, 5, 12}}; int main() { printf("%d", man.bir.y - man.bir.d); return 0; } 8.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Weight{ int kg; int g; } w = {2, 400}; int main() { int gram = w.kg * 1000 + w.g; printf("%d", gram); return 0; } 9.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Meter{ int km; int m; }; struct Trip{ int id; struct Meter dis; }; int main() { int total; struct Trip t1 = {10, {5, 120}}; struct Trip t2; t2 = t1; t2.dis.km = t2.dis.km + 3; total = t2.dis.km * 1000 + t2.dis.m; printf("%d", total); return 0; } 10.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Line{ int start; int end; }; struct Map{ int code; struct Line l; } mp = {9, {15, 22}}; int main() { int len1,len2; struct Map mp2 = mp; mp2.l.end -= 4; len1 = mp.l.end - mp.l.start; len2 = mp2.l.end - mp2.l.start; printf("%d", len1 - len2); return 0; } 11.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Grade{ int chinese; int math; }; struct Student{ char name[10]; struct Grade score; }; int main() { struct Student s = {"Leo", {76, 94}}; int total = s.score.chinese + s.score.math; int res; if(total >= 170) res = total - 10; else res = total + 10; printf("%d", res); return 0; } 12.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Meter{ int km; int m; }; int main() { struct Meter dis = {4, 160}; int all = dis.km * 1000 + dis.m; int cnt = 0; while(all > 500) { all -= 500; cnt++; } printf("%d", cnt); return 0; } 13.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Point{ int x; int y; }; struct Square{ struct Point p; int side; }; int main() { int sum; struct Square s1 = {{9, 2}, 7}; struct Square s2 = s1; s2.p.x = s2.p.x - 3; if(s2.p.x > s2.p.y) sum = s2.p.x * s2.side; else sum = s2.p.y * s2.side; printf("%d", sum); return 0; } 14.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Time{ int h; int m; }; struct Lesson{ struct Time start; struct Time end; }; int main() { struct Lesson les = {{8, 10}, {10, 25}}; int s = les.start.h * 60 + les.start.m; int e = les.end.h * 60 + les.end.m; int diff = e - s; int ans; if(diff > 120) ans = diff / 10; else ans = diff % 10; printf("%d", ans); return 0; } 15.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Coin{ int yuan; int jiao; }; int main() { struct Coin c1 = {19, 7}; struct Coin c2 = c1; int val1 = c1.yuan * 10 + c1.jiao; int val2 = c2.yuan * 10 + c2.jiao; int res; c2.yuan -= 4; if(val1 > val2 * 2) res = val1 - val2; else res = val1 + val2; printf("%d", res); return 0; } 四、编程题。 1. 校园成绩评级程序:定义嵌套结构体:Grade 存储语文、数学;Student 包含姓名与 Grade 成员。手动初始化一名学生成绩,计算总分,使用 if 判断:总分≥175 输出 A 等级,160~174 输出 B,低于 160 输出 C,最后打印总分与评级。 2.里程累计扣除计算器:定义结构体 Meter 存储千米、米;初始化一段路程,换算总米数,while 循环不断减去 600 米,统计能完整扣除的次数,最后输出扣除次数与剩余里程。 3.商品折扣计价器:结构体 Goods 存放商品数量、单价;初始化商品数据,计算原价总价,if 判断总价是否超过 400,超过则打 75 折,否则原价输出,最终保留 1 位小数打印应付金额。 4.两点坐标区间差值计算:定义 Dot 结构体存放 x、y 坐标;定义 Rect 结构体包含两个 Dot 成员作为对角点。初始化矩形对角坐标,计算矩形宽、高,判断宽高是否相等,输出 “正方形” 或 “长方形”,同时输出周长。 5.时间差分钟统计工具:结构体 Time 存储时、分;Lesson 结构体包含开始、结束 Time。初始化课程起止时间,换算总分钟差值,若时长大于 90 分钟输出 “长课时”,否则输出 “短课时” 并打印总分钟数。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 9.1与9.2节:结构体的定义、结构体在程序中的使用 一、单项选择题 1.下列关于 C 语言结构体的核心作用,描述正确的是( ) A. 结构体可以存储多个不同数据类型的成员,封装一组相关数据 B. 结构体内部只能存放相同类型的数据 C. 结构体变量整体可以直接参与加减乘除算术运算 D. 结构体定义完成后自动生成全局变量 【答案】A 【解析】结构体核心作用是封装一组逻辑关联、类型可不同的数据;B 错,成员类型可不同;C 错,结构体整体不能直接运算,只能单独操作成员;D 错,仅定义类型不会生成变量。 2.定义结构体类型的标准语法开头关键字是( ) A. union B. struct C. typedef D. enum 【答案】B 【解析】struct 是结构体定义关键字;union 为共用体、enum 枚举、typedef 类型重命名。 3.设有以下程序代码段,则该结构体变量 s1 的定义方式属于( ) struct Student{ int id; char name[20];}; struct Student s1; A. 定义类型同时定义变量 B. 先定义结构体类型,后定义变量 C. 无名结构体直接定义变量 D. 嵌套结构体变量定义 【答案】B 【解析】先单独书写 struct Student 完成类型定义,下一行再定义变量 s1,属于先定义结构体类型,后定义变量。 4.结构体成员访问的基础运算符是( ) A. * B. -> C. . D. & 【答案】C 【解析】.圆点运算符用于普通结构体变量访问成员。 5.执行语句struct Date{int y,m,d;} d1={2026,6,22};,该变量 d1 的定义方式为( ) A. 先定义类型后定义变量 B. 定义类型的同时定义变量 C. 无名结构体变量 D. 嵌套结构体变量 【答案】B 【解析】大括号闭合结构体类型定义后,紧跟变量名d1,属于定义类型同时定义变量。 6.下列结构体初始化代码语法完全合法的是( ) A. struct Stu{int a;char b;} s={10,"k"}; B. struct Stu{int a;char b;} s={10,'m'}; C. struct Stu{int a;char b;} s=10,'c'; D. struct Stu{int a;char b;} s; s={5,'z'}; 【答案】B 【解析】A 错误,char 成员不能赋值字符串;C 缺少大括号初始化包裹;D 不能在定义完成后整体大括号赋值。 7.设有以下所示程序代码段,则输出 p1 的出生年份,正确写法是( ) struct Date{int year;int month;int day;}; struct Person{ char name[10]; struct Date birth; }p1; A. printf ("%d",p1.birth.year); B. printf ("%d",p1->birth.year); C. printf ("%d",p1.year); D. printf ("%d",birth.year); 【答案】A 【解析】多层嵌套连续使用.访问成员;B 为指针用法,但此处类型不匹配;C 未逐层访问;D 缺少外层结构体变量。 8.执行struct Book{char name[20];float price;} b;,想要手动给价格赋值 75.9,正确语句是( ) A. b.price = 75.9; B. Book.price = 75.9; C. b->price = 75.9; D. b = {,75.9}; 【答案】A 【解析】普通结构体变量使用变量.成员赋值;B 类型名不能访问成员;C 为指针用法,此处类型不匹配;D 不能中途局部整体赋值。 9.下列操作对结构体变量合法的是( ) A. 两个同类型结构体变量直接互相整体赋值 s2 = s1; B. printf("%s",s1); 直接整体打印结构体变量 C. scanf("%d",s1); 直接整体读取结构体变量 D. s1 = s1 + s2; 两个结构体变量相加运算 【答案】A 【解析】C 语言允许同类型结构体变量整体拷贝赋值;B、C 不支持整体输入输出;D 结构体不能直接算术运算。 10.关于嵌套结构体的定义顺序,说法正确的是( ) A. 内层结构体必须提前完整定义,才能作为外层结构体的成员 B. 外层结构体可以先定义,内部再写未定义的结构体类型 C. 嵌套结构体不允许包含 int、char 基础类型成员 D. 嵌套结构体变量不能访问内层结构体的成员 【答案】A 【解析】使用某结构体作为成员前,必须提前完成该结构体类型定义;B 语法报错;C 嵌套结构体可搭配基础类型;D 可通过连续.访问内层成员。 二、填空题。 1.定义结构体类型必须使用的关键字是___________。 【答案】struct 【解析】struct 是 C 语言结构体专属定义关键字。 2.普通结构体变量访问内部成员时,使用的运算符是___________。 【答案】.(圆点) 【解析】变量.成员名是普通结构体变量唯一成员访问符号。 3.结构体初始化列表中,未提供初始值的尾部成员,系统会自动赋值为___________。 【答案】0 【解析】全局 / 局部结构体初始化缺省成员统一置 0。 4.若结构体 A 内部包含已经定义好的结构体 B 作为成员,这种结构称为结构体___________。 【答案】嵌套 【解析】这是结构体嵌套的定义。 5.C 语言不允许对结构体变量进行整体的scanf输入与_______输出,只能逐个成员操作。 【答案】printf 【解析】结构体必须单独读写每一个成员,无法整体 I/O。 6.结构体内部每一个数据项统称为结构体的___________。 【答案】成员(域) 【解析】结构体由多个不同类型成员组合而成。 7.执行struct Date{int y,m,d;} d={2026,9};,变量 d 中 d 成员的默认数值是___________。 【答案】0 【解析】初始化仅给前两个成员赋值,末尾成员自动置 0。 8.设有以下定义,打印 man1 的出生月份完整语句:printf ("% d",________); struct Date{int y;int m;int d;}; struct Man{char name[8];struct Date bir;} man1; 【答案】man1.bir.m 【解析】这属于结构体的嵌套定义,在引用时需要使用.运算符进行引用。 9.完成结构体完整类型定义的一对大括号结束之后,末尾必须追加________,否则编译器判定语法错误。 【答案】分号; 【解析】C 语言结构体语法强制要求每个成员末尾加分号,缺少分号不符合语法规则,编译直接报错。 10.设有定义:struct Time{int h;int m;};struct Lesson{char name[10]; struct Time t;} les = {"Math", {8,30}};表达式 les.t.h * 60 + les.t.m 用来换算总分钟,最终数值是___________。 【答案】510 【解析】小时 h=8,分钟 m=30;8×60=480,480+30=510。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Stu{ int a; int b; } s = {13, 6}; int main() { int r = s.a - s.b * 2; printf("%d", r); return 0; } 【答案】1 2.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Date{ int year; int mon; }; struct User{ char name[10]; struct Date d; } u = {"Tom", {2026, 9}}; int main() { printf("%d", u.d.year - u.d.mon); return 0; } 【答案】2017 3.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Box{ int w; int h; }; int main() { struct Box b1 = {7, 3}; struct Box b2 = b1; printf("%d", b2.w * b2.h); return 0; } 【答案】21 4.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Score{ int chi; int mat; int eng; } s = {85, 92}; int main() { int all = s.chi + s.mat + s.eng; printf("%d", all); return 0; } 【答案】177 5.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Point{ int x; int y; }; struct Square{ struct Point pt; int len; } sq = {{4,6}, 5}; int main() { int ans = sq.pt.x + sq.len; printf("%d", ans); return 0; } 【答案】9 6.写出下列程序段的输出结果:________________。 #include <stdio.h> struct NumPair{ int a; int b; }; int main() { struct NumPair x = {30, 8}; struct NumPair y; y = x; printf("%d", y.a / y.b); return 0; } 【答案】3 7.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Birth{ int y; int m; int d; }; struct Man{ struct Birth bir; } man = {{2010, 5, 12}}; int main() { printf("%d", man.bir.y - man.bir.d); return 0; } 【答案】1998 8.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Weight{ int kg; int g; } w = {2, 400}; int main() { int gram = w.kg * 1000 + w.g; printf("%d", gram); return 0; } 【答案】2400 9.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Meter{ int km; int m; }; struct Trip{ int id; struct Meter dis; }; int main() { int total; struct Trip t1 = {10, {5, 120}}; struct Trip t2; t2 = t1; t2.dis.km = t2.dis.km + 3; total = t2.dis.km * 1000 + t2.dis.m; printf("%d", total); return 0; } 【答案】8120 10.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Line{ int start; int end; }; struct Map{ int code; struct Line l; } mp = {9, {15, 22}}; int main() { int len1,len2; struct Map mp2 = mp; mp2.l.end -= 4; len1 = mp.l.end - mp.l.start; len2 = mp2.l.end - mp2.l.start; printf("%d", len1 - len2); return 0; } 【答案】4 11.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Grade{ int chinese; int math; }; struct Student{ char name[10]; struct Grade score; }; int main() { struct Student s = {"Leo", {76, 94}}; int total = s.score.chinese + s.score.math; int res; if(total >= 170) res = total - 10; else res = total + 10; printf("%d", res); return 0; } 【答案】160 12.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Meter{ int km; int m; }; int main() { struct Meter dis = {4, 160}; int all = dis.km * 1000 + dis.m; int cnt = 0; while(all > 500) { all -= 500; cnt++; } printf("%d", cnt); return 0; } 【答案】8 13.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Point{ int x; int y; }; struct Square{ struct Point p; int side; }; int main() { int sum; struct Square s1 = {{9, 2}, 7}; struct Square s2 = s1; s2.p.x = s2.p.x - 3; if(s2.p.x > s2.p.y) sum = s2.p.x * s2.side; else sum = s2.p.y * s2.side; printf("%d", sum); return 0; } 【答案】42 14.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Time{ int h; int m; }; struct Lesson{ struct Time start; struct Time end; }; int main() { struct Lesson les = {{8, 10}, {10, 25}}; int s = les.start.h * 60 + les.start.m; int e = les.end.h * 60 + les.end.m; int diff = e - s; int ans; if(diff > 120) ans = diff / 10; else ans = diff % 10; printf("%d", ans); return 0; } 【答案】13 15.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Coin{ int yuan; int jiao; }; int main() { struct Coin c1 = {19, 7}; struct Coin c2 = c1; int val1 = c1.yuan * 10 + c1.jiao; int val2 = c2.yuan * 10 + c2.jiao; int res; c2.yuan -= 4; if(val1 > val2 * 2) res = val1 - val2; else res = val1 + val2; printf("%d", res); return 0; } 【答案】394 四、编程题。 1. 校园成绩评级程序:定义嵌套结构体:Grade 存储语文、数学;Student 包含姓名与 Grade 成员。手动初始化一名学生成绩,计算总分,使用 if 判断:总分≥175 输出 A 等级,160~174 输出 B,低于 160 输出 C,最后打印总分与评级。 【参考代码】 #include <stdio.h> struct Grade { int chinese; int math; }; struct Student { char name[20]; struct Grade score; }; int main() { struct Student stu = {"ZhangWei", {88, 92}}; int total = stu.score.chinese + stu.score.math; char level; if(total >= 175) level = 'A'; else if(total >= 160) level = 'B'; else level = 'C'; printf("学生:%s 总分:%d 评级:%c", stu.name, total, level); return 0; } 2.里程累计扣除计算器:定义结构体 Meter 存储千米、米;初始化一段路程,换算总米数,while 循环不断减去 600 米,统计能完整扣除的次数,最后输出扣除次数与剩余里程。 【参考代码】 #include <stdio.h> struct Meter { int km; int m; }; int main() { struct Meter dis = {6, 350}; int all = dis.km * 1000 + dis.m; int count = 0; while(all >= 600) { all -= 600; count++; } printf("可完整扣除600米次数:%d 剩余米数:%d", count, all); return 0; } 3.商品折扣计价器:结构体 Goods 存放商品数量、单价;初始化商品数据,计算原价总价,if 判断总价是否超过 400,超过则打 75 折,否则原价输出,最终保留 1 位小数打印应付金额。 【参考代码】 #include <stdio.h> struct Goods { int num; float price; }; int main() { struct Goods shop = {14, 32.5}; float total = shop.num * shop.price; float pay; if(total > 400) pay = total * 0.75; else pay = total; printf("商品总价:%.1f", pay); return 0; } 4.两点坐标区间差值计算:定义 Dot 结构体存放 x、y 坐标;定义 Rect 结构体包含两个 Dot 成员作为对角点。初始化矩形对角坐标,计算矩形宽、高,判断宽高是否相等,输出 “正方形” 或 “长方形”,同时输出周长。 【参考代码】 #include <stdio.h> struct Dot { int x; int y; }; struct Rect { struct Dot p1; struct Dot p2; }; int main() { struct Rect rt = {{5, 4}, {13, 11}}; int w = rt.p2.x - rt.p1.x; int h = rt.p2.y - rt.p1.y; int cir = (w + h) * 2; printf("周长:%d 图形类型:", cir); if(w == h) printf("正方形"); else printf("长方形"); return 0; } 5.时间差分钟统计工具:结构体 Time 存储时、分;Lesson 结构体包含开始、结束 Time。初始化课程起止时间,换算总分钟差值,若时长大于 90 分钟输出 “长课时”,否则输出 “短课时” 并打印总分钟数。 【参考代码】 #include <stdio.h> struct Time { int h; int m; }; struct Lesson { struct Time start; struct Time end; }; int main() { struct Lesson les = {{9, 15}, {11, 40}}; int s = les.start.h * 60 + les.start.m; int e = les.end.h * 60 + les.end.m; int diff = e - s; printf("课程总时长:%d分钟 课时类型:", diff); if(diff > 90) printf("长课时"); else printf("短课时"); return 0; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第9章 第1、2节:结构体的定义、结构体在程序中的使用(练习)-《C语言程序设计》(电子工业出版社)上好课
1
第9章 第1、2节:结构体的定义、结构体在程序中的使用(练习)-《C语言程序设计》(电子工业出版社)上好课
2
第9章 第1、2节:结构体的定义、结构体在程序中的使用(练习)-《C语言程序设计》(电子工业出版社)上好课
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。