CExercise_09_结构体和枚举_2VS的Debug模式查看它的内存布局,采用结构体数组的方式存储信息,调用函数打印结构体数组.

题目:

下面结构体类型的变量的内存布局是怎样的?请使用VS的Debug模式查看它的内存布局

typedef struct stundent_s {
    int number;
    char name[25];
    char gender;
    int chinese;
    int math;
    int english;
} Student;

// 结构体对象的声明和初始化 Student s1 = { 1, “Jack”, ‘m’, 100, 100, 100 };
要求:截图展示内存窗口中的对齐填充,然后提交截图。

第二题:

基于上述的结构体类型的定义,实现以下功能:

1.从键盘输入5个学生的信息,将这些同学的信息采用结构体数组的方式存储起来。(代码直接写在main函数里)

2.编写一个函数,用于打印单个结构体信息。然后在main函数里调用该函数,打印这个结构体数组。

3.编写一个函数,用于求三个学科的平均分。然后在main函数里调用该函数,打印这三个学科的平均分。


关键点


分析:


代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define MAX_BOOKS 10
#define TITLE_LENGTH 100
#define AUTHOR_LENGTH 50

// 定义书籍类别的枚举类型
typedef enum {
    SCIENCE_FICTION,    // 科幻
    LITERATURE,         // 文学
    HISTORY,            // 历史
    TECHNOLOGY,         // 科技
    OTHER               // 其他
} Genre;

// 定义书籍结构体类型
typedef struct {
    int id;
    char title[TITLE_LENGTH];
    char author[AUTHOR_LENGTH];
    Genre genre;
} Book;

void print_book_info(Book *books, int count);   // 打印所有书籍信息
void find_books_by_genre(Book *books, int count, Genre genre);  // 根据书籍类别打印书籍
char *get_genre_name(Genre genre);    // 将书籍类别的枚举值转换成中文表示的类别

int main() {
    Book books[MAX_BOOKS] = {
        {1, "三体", "刘慈欣", SCIENCE_FICTION},
        {2, "红楼梦", "曹雪芹", LITERATURE},
        {3, "中国通史", "吕思勉", HISTORY},
        {4, "时间简史", "史蒂芬·霍金", TECHNOLOGY},
        {5, "围城", "钱钟书", LITERATURE},
        {6, "傲慢与偏见", "简·奥斯汀", LITERATURE},
        {7, "呼啸山庄", "艾米莉·勃朗特", LITERATURE},
        {8, "活着", "余华", LITERATURE},
        {9, "明朝那些事儿", "当年明月", HISTORY},
        {10, "乌合之众", "古斯塔夫·勒庞", OTHER}
    };

    int count = MAX_BOOKS;

    // 打印所有书籍的信息
    print_book_info(books, count);

    // 用户输入书籍类别编号并查找该类别的书籍
    int genre;
    printf("请输入书籍类别编号 (0: 科幻, 1: 文学, 2: 历史, 3: 科技, 4: 其他)来查询书籍: ");
    scanf("%d", &genre);
    find_books_by_genre(books, count, (Genre)genre);

    return 0;
}

// 打印所有书籍的信息
void print_book_info(Book *books, int count) {
    printf("---------------所有的书籍信息---------------\n\n");
    for (int i = 0; i < count; i++) {
        printf("编号: %d, 书名: %s, 作者: %s, 类别: %s\n",
               books[i].id, books[i].title, books[i].author, get_genre_name(books[i].genre));
    }
    printf("\n");
}

// 根据书籍类别查找并打印该类别的所有书籍信息
void find_books_by_genre(Book *books, int count, Genre genre) {
    printf("类别为 %s 的书籍有:\n", get_genre_name(genre));
    for (int i = 0; i < count; i++) {
        if (books[i].genre == genre) {
            printf("编号: %d, 书名: %s, 作者: %s\n",
                   books[i].id, books[i].title, books[i].author);
        }
    }
}

// 将书籍类别的枚举值转换成中文表示的类别
const char *get_genre_name(Genre genre) {
    switch (genre) {
        case SCIENCE_FICTION: return "科幻";
        case LITERATURE: return "文学";
        case HISTORY: return "历史";
        case TECHNOLOGY: return "科技";
        case OTHER: return "其他";
        default: return "未知";
    }
}
	

解决方案总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值