V2.0
C++基础教程<br />——<br />作业及参考答案全部汇总文档<br/>节6结构体和枚举阶段作业<br/><br/>最新版本V2.0
<br>王道C++团队<br/>COPYRIGHT ⓒ 2021-2024. 王道版权所有基础题篇结构体基础语法练习1结构体基础语法练习2枚举类型基础语法练习结构体和枚举类型综合练习The End
Gn!
下面都是一些基础的语法、概念编程练习题。
Gn!
定义一个Date结构体,包含年、月、日数据项。编写一个函数,计算两个日期之间的天数差。
不考虑平年闰年,不考虑月份天数不同。
假设每个月都是30天,每年是360天,以简化计算。
参考代码如下:
参考代码:
这个问题非常简单,参考代码如下:
xxxxxxxxxx
24123
4// 日期结构体,存储年月日数据
5typedef struct {
6int year;
7int month;
8int day;
9} Date;
10
11// 简化计算,一年360天,一个月30天
12int calculate_days_between_dates(Date d1, Date d2) {
13int days1 = d1.year * 360 + d1.month * 30 + d1.day;
14int days2 = d2.year * 360 + d2.month * 30 + d2.day;
15return abs(days1 - days2); // 求绝对值的函数
16}
17
18int main() {
19Date date1 = { 2024, 2, 1 };
20Date date2 = { 2022, 3, 1 };
21int diff = calculate_days_between_dates(date1, date2);
22printf("The difference in days: %d\n", diff);
23return 0;
24}
以上。
Gn!
第一题:
下面结构体类型的变量的内存布局是怎样的?请使用VS的Debug模式查看它的内存布局
xxxxxxxxxx
111typedef struct stundent_s {
2int number;
3char name[25];
4char gender;
5int chinese;
6int math;
7int english;
8} Student;
9
10// 结构体对象的声明和初始化
11Student s1 = { 1, "Jack", 'm', 100, 100, 100 };
要求:截图展示内存窗口中的对齐填充,然后提交截图。
第二题:
基于上述的结构体类型的定义,实现以下功能:
1.从键盘输入5个学生的信息,将这些同学的信息采用结构体数组的方式存储起来。(代码直接写在main函数里)
2.编写一个函数,用于打印单个结构体信息。然后在main函数里调用该函数,打印这个结构体数组。
3.编写一个函数,用于求三个学科的平均分。然后在main函数里调用该函数,打印这三个学科的平均分。
参考代码如下:
参考代码:
参考代码如下:
xxxxxxxxxx
601234
5typedef struct student_s {
6int number;
7char name[25];
8char gender;
9int chinese;
10int math;
11int english;
12} Student;
13
14void print_student(Student student); // 打印单个学生信息
15void print_averages(Student students[], int length); // 打印三门学科平均分
16
17int main(void) {
18Student students[STUS_NUM];
19
20// 从键盘输入5个学生的信息
21printf("请输入5个学生的信息(学号 姓名 性别(M/F)语文成绩 数学成绩 英语成绩):\n");
22for (int i = 0; i < STUS_NUM; i++) {
23printf("现在录入第%d个学生的信息: ", (i + 1));
24scanf("%d %s %c %d %d %d",
25&students[i].number,
26students[i].name,
27&students[i].gender,
28&students[i].chinese,
29&students[i].math,
30&students[i].english);
31}
32
33// 打印所有学生的信息
34printf("\n学生信息列表:\n");
35for (int i = 0; i < STUS_NUM; i++) {
36print_student(students[i]);
37}
38
39// 打印三门学科的平均分
40print_averages(students, STUS_NUM);
41
42return 0;
43}
44
45// 打印单个学生信息的函数
46void print_student(Student student) {
47printf("学号:%d, 姓名:%s, 性别:%c, 语文:%d, 数学:%d, 英语:%d\n", student.number, student.name, student.gender, student.chinese, student.math, student.english);
48}
49
50// 计算并打印三门学科平均分的函数
51void print_averages(Student students[], int length) {
52int total_chinese = 0, total_math = 0, total_english = 0;
53for (int i = 0; i < length; i++) {
54total_chinese += students[i].chinese;
55total_math += students[i].math;
56total_english += students[i].english;
57}
58printf("\n语文平均分:%f\n数学平均分:%f\n英语平均分:%f\n", (double)total_chinese / length, (double)total_math / length, (double)total_english / length);
59}
60
以上。
Gn!
定义一个枚举类型Month,包含一年中12个月份的英文单词。并从一月份开始,为枚举成员分配一个从1开始的数字值。
例如:January=1,February=2,依此类推....
编写一个函数,接收Month类型的参数,返回该月份有多少天。
注意:不考虑平年闰年,2月份一律输出28天。
提示:可以用switch对枚举类型进行选择。
参考代码如下:
参考代码:
参考代码如下:
x123
4// 定义枚举类型Month
5typedef enum {
6January = 1, // 手动设置为1,否则默认从0开始设置值
7February,
8March,
9April,
10May,
11June,
12July,
13August,
14September,
15October,
16November,
17December
18} Month;
19
20// 定义函数,根据Month枚举返回该月的天数
21int days_in_month(Month month) {
22switch (month) {
23case January:
24case March:
25case May:
26case July:
27case August:
28case October:
29case December:
30return 31;
31case April:
32case June:
33case September:
34case November:
35return 30;
36case February:
37return 28;
38default:
39// 错误处理
40return -1;
41}
42}
43
44int main(void) {
45Month month = February;
46printf("Days in February: %d\n", days_in_month(month));
47
48month = April;
49printf("Days in April: %d\n", days_in_month(month));
50return 0;
51}
以上。
Gn!
编写一个程序,管理图书馆中的书籍信息。每本书籍的信息包含以下内容:
书籍编号(整型)
书籍名称(字符串)
书籍作者(字符串)
书籍类别(枚举类型)
请定义一个Book书籍结构体类型来存储一本书的信息,以及Genre这个书籍类别枚举类型。
书籍类别的枚举类型包含以下类别:
科幻(SCIENCE_FICTION)
文学(LITERATURE)
历史(HISTORY)
科技(TECHNOLOGY)
其他(OTHER)
现在给定你一个Book结构体对象数组的数据,一共十本书:
xxxxxxxxxx
1312Book books[MAX_BOOKS] = {
3{1, "三体", "刘慈欣", SCIENCE_FICTION},
4{2, "红楼梦", "曹雪芹", LITERATURE},
5{3, "中国通史", "吕思勉", HISTORY},
6{4, "时间简史", "史蒂芬·霍金", TECHNOLOGY},
7{5, "围城", "钱钟书", LITERATURE},
8{6, "傲慢与偏见", "简·奥斯汀", LITERATURE},
9{7, "呼啸山庄", "艾米莉·勃朗特", LITERATURE},
10{8, "活着", "余华", LITERATURE},
11{9, "明朝那些事儿", "当年明月", HISTORY},
12{10, "乌合之众", "古斯塔夫·勒庞", OTHER}
13};
请实现以下功能:
程序启动,即打印所有书籍的信息。
根据用户输入的书籍类别编号,查找并输出该类别的所有书籍信息。
程序的运行结果如下图所示:
提示,建议提取下列三个函数来实现整个程序的功能:
xxxxxxxxxx
31void print_book_info(Book *books, int count); // 打印所有书籍信息
2void find_books_by_genre(Book *books, int count, Genre genre); // 根据书籍类别打印书籍
3char *get_genre_name(Genre genre); // 将书籍类别的枚举值转换成中文表示的类别
参考代码如下:
参考代码如下:
可以直接用上面题目中给出的数据,不需要自己编数据了:
xxxxxxxxxx
88123
4567
8// 定义书籍类别的枚举类型
9typedef enum {
10SCIENCE_FICTION, // 科幻
11LITERATURE, // 文学
12HISTORY, // 历史
13TECHNOLOGY, // 科技
14OTHER // 其他
15} Genre;
16
17// 定义书籍结构体类型
18typedef struct {
19int id;
20char title[TITLE_LENGTH];
21char author[AUTHOR_LENGTH];
22Genre genre;
23} Book;
24
25void print_book_info(Book *books, int count); // 打印所有书籍信息
26void find_books_by_genre(Book *books, int count, Genre genre); // 根据书籍类别打印书籍
27char *get_genre_name(Genre genre); // 将书籍类别的枚举值转换成中文表示的类别
28
29int main() {
30Book books[MAX_BOOKS] = {
31{1, "三体", "刘慈欣", SCIENCE_FICTION},
32{2, "红楼梦", "曹雪芹", LITERATURE},
33{3, "中国通史", "吕思勉", HISTORY},
34{4, "时间简史", "史蒂芬·霍金", TECHNOLOGY},
35{5, "围城", "钱钟书", LITERATURE},
36{6, "傲慢与偏见", "简·奥斯汀", LITERATURE},
37{7, "呼啸山庄", "艾米莉·勃朗特", LITERATURE},
38{8, "活着", "余华", LITERATURE},
39{9, "明朝那些事儿", "当年明月", HISTORY},
40{10, "乌合之众", "古斯塔夫·勒庞", OTHER}
41};
42
43int count = MAX_BOOKS;
44
45// 打印所有书籍的信息
46print_book_info(books, count);
47
48// 用户输入书籍类别编号并查找该类别的书籍
49int genre;
50printf("请输入书籍类别编号 (0: 科幻, 1: 文学, 2: 历史, 3: 科技, 4: 其他)来查询书籍: ");
51scanf("%d", &genre);
52find_books_by_genre(books, count, (Genre)genre);
53
54return 0;
55}
56
57// 打印所有书籍的信息
58void print_book_info(Book *books, int count) {
59printf("---------------所有的书籍信息---------------\n\n");
60for (int i = 0; i < count; i++) {
61printf("编号: %d, 书名: %s, 作者: %s, 类别: %s\n",
62books[i].id, books[i].title, books[i].author, get_genre_name(books[i].genre));
63}
64printf("\n");
65}
66
67// 根据书籍类别查找并打印该类别的所有书籍信息
68void find_books_by_genre(Book *books, int count, Genre genre) {
69printf("类别为 %s 的书籍有:\n", get_genre_name(genre));
70for (int i = 0; i < count; i++) {
71if (books[i].genre == genre) {
72printf("编号: %d, 书名: %s, 作者: %s\n",
73books[i].id, books[i].title, books[i].author);
74}
75}
76}
77
78// 将书籍类别的枚举值转换成中文表示的类别
79const char *get_genre_name(Genre genre) {
80switch (genre) {
81case SCIENCE_FICTION: return "科幻";
82case LITERATURE: return "文学";
83case HISTORY: return "历史";
84case TECHNOLOGY: return "科技";
85case OTHER: return "其他";
86default: return "未知";
87}
88}
以上。