C语言图书信息管理系统

题目:图书信息管理系统

内容及主要功能描述: 该系统用于管理图书信息,包括图书的增加、删除、查找、修改、浏览、按出版社统计图书数量等功能。具体功能包括:

  1. 增加图书:输入图书信息并添加到系统中。
  2. 删除图书:按照图书的ISBN号删除特定的图书。
  3. 查找图书:支持按类别、出版社、书名、作者等关键字查找图书。
  4. 修改图书:按照图书的ISBN号修改图书的信息。
  5. 浏览全部图书:列出系统中所有图书的详细信息。
  6. 统计每个出版社出版的图书数量并保存:按照出版社统计其出版的图书数量,并将结果保存到文件中。

三、总体设计

1、存储结构及数据类型定义

(采用了什么存储结构、被处理数据定义的数据类型,数据类型定义中要有注释说明)

存储结构:采用数组存储图书信息,每本图书使用结构体 Book 表示。

typedef struct {

    char title[100];        // 书名

    char author[100];       // 作者

    char publisher[100];    // 出版社

    char isbn[20];          // ISBN

    char pub_date[20];      // 出版时间

    float price;            // 价格

    char category[50];      // 类别

} Book;

2、程序结构

(程序整体的模块结构图)

3、所实现的功能函数

(每个功能对应的函数名、函数形参及返回值说明)

·  增加图书:void add_book()

参数:无

返回值:void

·  删除图书:void delete_book()

参数:无

返回值:void

·  查找图书:void search_books()

参数:无

返回值:void

·  修改图书:void update_book()

参数:无

返回值:void

·  浏览全部图书:void list_books()

参数:无

返回值:void

·  统计每个出版社出版的图书数量并保存:void count_books_by_publisher(const char* filename)

参数:保存结果的文件名

返回值:void

·  排序图书:void sort_books()

参数:无

返回值:void

四、小组成员及分工

(组长、组员及每人承担的具体模块任务或其他)

·  组长:(姓名)

·  组员:(姓名1、姓名2、姓名3)

·  具体模块任务分工

  • 组长:负责系统总体设计、代码整合及测试。
  • 组员1:负责增加图书、删除图书功能实现。
  • 组员2:负责查找图书、修改图书功能实现。
  • 组员3:负责统计图书数量、浏览图书功能实现。

1、算法设计

增加图书模块:

  • 描述: 用户输入图书信息后,将新图书添加到系统中。
  • 流程:
    1. 用户输入书名、作者、出版社、ISBN、出版时间、价格和类别。
    2. 将输入的信息存储到新的 Book 结构体中。
    3. 将新的图书结构体添加到 books 数组中。
    4. 调用排序函数对图书进行重新排序,保持按出版社和出版时间的顺序。
    5. 输出添加成功的提示信息。

删除图书模块:

  • 描述: 用户输入要删除的图书的ISBN号,系统查找并删除该图书。
  • 流程:
    1. 用户输入要删除的图书的ISBN号。
    2. 系统遍历存储的图书数组,查找匹配的ISBN。
    3. 如果找到匹配的ISBN,将该图书从数组中删除。
    4. 调整数组使得删除后仍保持连续性。
    5. 输出删除成功或未找到图书的提示信息。

2、代码设计

增加图书功能实现:

void add_book() {

    if (book_count >= MAX_BOOKS) {

        printf("书库已满,无法增加新书。\n");

        return;

    }

    Book book;

    printf("输入书名: ");

    scanf("%s", book.title);

    printf("输入作者: ");

    scanf("%s", book.author);

    printf("输入出版社: ");

    scanf("%s", book.publisher);

    printf("输入ISBN: ");

    scanf("%s", book.isbn);

    printf("输入出版时间: ");

    scanf("%s", book.pub_date);

    printf("输入价格: ");

    scanf("%f", &book.price);

    printf("输入类别: ");

    scanf("%s", book.category);

    books[book_count++] = book;

    sort_books();

    printf("图书添加成功。\n");

}

删除图书功能实现:

void delete_book() {

    char isbn[20];

    printf("输入要删除的图书ISBN: ");

    scanf("%s", isbn);

    for (int i = 0; i < book_count; i++) {

        if (strcmp(books[i].isbn, isbn) == 0) {

            for (int j = i; j < book_count - 1; j++) {

                books[j] = books[j + 1];

            }

            book_count--;

            printf("图书删除成功。\n");

            return;

        }

    }

    printf("未找到该ISBN的图书。\n");

}

在本课题中,我负责了增加图书和删除图书两个功能模块的实现。

工作内容:

  • 增加图书功能实现:根据用户输入,创建新的图书结构体并将其添加到系统中,保证添加后的图书数组按照出版社和出版时间排序。
  • 删除图书功能实现:用户输入要删除的图书的ISBN,系统查找并删除该图书,保证操作后数组仍保持连续性。

完成的功能及改进空间:

  • 已完成功能:成功实现了增加图书和删除图书功能,并与其他模块协调良好。
  • 改进空间:在删除图书时,虽然保证了数组连续性,但如果数据量很大时删除效率可能不高,可以考虑优化删除算法或数据结构。

调试过程及解决措施:

  • 问题:初期在删除图书时,没有正确调整数组,导致删除后可能出现重复数据。
  • 解决:通过调试分析发现问题所在,改进了删除算法,确保删除操作正确有效。

收获与建议:

  • 收获:加深了对数据结构和算法在实际项目中的应用理解,提高了代码调试和问题解决能力。
  • 建议:在今后的项目中,应更注重算法效率和代码健壮性,保证系统稳定性和用户体验。

这些工作经历让我意识到,团队合作和模块化开发在大型项目中的重要性,同时也帮助我提升了编程能力和团队协作能力

学号

姓名

1、算法设计

查找图书模块:

  • 描述: 用户选择查找方式(按类别、出版社、书名或作者),输入关键字,系统根据选择进行匹配并输出符合条件的图书信息。
  • 流程:
    1. 用户选择查找方式和输入关键字。
    2. 系统遍历存储的图书数组,根据用户选择的查找方式进行匹配:
      • 按类别:比较图书的类别字段。
      • 按出版社:比较图书的出版社字段。
      • 按书名:比较图书的书名字段。
      • 按作者:比较图书的作者字段。
    3. 如果找到匹配的图书,则输出图书的详细信息。

修改图书模块:

  • 描述: 用户输入要修改的图书的ISBN号,系统查找并允许用户更新图书的信息。
  • 流程:
    1. 用户输入要修改的图书的ISBN号。
    2. 系统遍历存储的图书数组,查找匹配的ISBN。
    3. 如果找到匹配的ISBN,用户输入新的书名、作者、出版社、出版时间、价格和类别。
    4. 更新对应图书的信息,并调用排序函数重新排序图书数组。
    5. 输出修改成功的提示信息。

2、代码设计

查找图书功能实现:

void search_books() {

    int choice;

    char keyword[100];

    printf("选择查找方式:\n");

    printf("1. 按类别查找\n");

    printf("2. 按出版社查找\n");

    printf("3. 按书名查找\n");

    printf("4. 按作者查找\n");

    printf("选择操作: ");

    scanf("%d", &choice);

    printf("输入查找关键字: ");

    scanf("%s", keyword);

    for (int i = 0; i < book_count; i++) {

        if ((choice == 1 && strcmp(books[i].category, keyword) == 0) ||

            (choice == 2 && strcmp(books[i].publisher, keyword) == 0) ||

            (choice == 3 && strcmp(books[i].title, keyword) == 0) ||

            (choice == 4 && strcmp(books[i].author, keyword) == 0)) {

            printf("书名: %s, 作者: %s, 出版社: %s, ISBN: %s, 出版时间: %s, 价格: %.2f, 类别: %s\n",

                   books[i].title, books[i].author, books[i].publisher, books[i].isbn, books[i].pub_date, books[i].price, books[i].category);

        }

    }

}

修改图书功能实现:

void update_book() {

    char isbn[20];

    printf("输入要修改的图书ISBN: ");

    scanf("%s", isbn);

    for (int i = 0; i < book_count; i++) {

        if (strcmp(books[i].isbn, isbn) == 0) {

            printf("输入新的书名: ");

            scanf("%s", books[i].title);

            printf("输入新的作者: ");

            scanf("%s", books[i].author);

            printf("输入新的出版社: ");

            scanf("%s", books[i].publisher);

            printf("输入新的出版时间: ");

            scanf("%s", books[i].pub_date);

            printf("输入新的价格: ");

            scanf("%f", &books[i].price);

            printf("输入新的类别: ");

            scanf("%s", books[i].category);

            sort_books();

            printf("图书修改成功。\n");

            return;

        }

    }

    printf("未找到该ISBN的图书。\n");

}

在本课题中,我负责了查找图书和修改图书两个功能模块的实现。

工作内容:

  • 查找图书功能实现:根据用户选择的查找方式(类别、出版社、书名或作者),实现图书信息的动态查找和输出。
  • 修改图书功能实现:根据用户输入的ISBN,允许用户更新图书的各项信息,并确保修改后的图书数组仍按照出版社和出版时间排序。

完成的功能及改进空间:

  • 已完成功能:成功实现了查找图书和修改图书功能,并与其他模块协调良好。
  • 改进空间:在修改图书时,可以考虑增加输入检查功能,防止用户输入错误导致程序异常;另外,对于查找功能,可以进一步优化搜索算法,提高效率,尤其是在大数据量情况下的性能优化。

调试过程及解决措施:

  • 问题:初期在查找图书时,未考虑到输入的关键字可能会有多个单词的情况,导致部分搜索失败。
  • 解决:优化输入处理,确保能够正确处理包含空格的输入关键字,提高了搜索的精确度。

收获与建议:

  • 收获:通过本次课题,深入理解了数据结构在实际项目中的应用,特别是对于搜索和更新功能的实现有了更深入的了解。
  • 建议:今后在项目开发中,应更加注重用户输入的兼容性和程序的健壮性,增强代码的稳定性和可维护性;同时,团队协作中需要更加紧密配合,确保各模块功能的无缝衔接和整体性能的优化。

这些工作经验让我意识到,编程不仅仅是语法和算法的应用,更重要的是如何将其应用于实际项目中,并通过团队合作实现更高效的开发和更优秀的产品。

学号

姓名

1、算法设计

统计图书数量模块:

  • 描述: 遍历图书数组,统计每个出版社出版的图书数量,并将结果保存到文件中。
  • 流程:
    1. 初始化当前出版社和计数器。
    2. 对图书数组进行排序,确保相同出版社的图书连续存放。
    3. 遍历排序后的图书数组,每次检查当前图书的出版社是否与上一本图书相同:
      • 如果相同,增加计数器。
      • 如果不同,将上一个出版社的统计结果写入文件,更新当前出版社和重置计数器。
    4. 最后一次循环结束后,将最后一个出版社的统计结果写入文件。

浏览图书模块:

  • 描述: 遍历图书数组,输出每本图书的详细信息。
  • 流程:
    1. 遍历图书数组,依次输出每本图书的书名、作者、出版社、ISBN、出版时间、价格和类别信息。

2、代码设计

统计图书数量功能实现:

void count_books_by_publisher(const char* filename) {

    FILE *file = fopen(filename, "w");

    if (file == NULL) {

        printf("无法打开文件\n");

        return;

    }

    char current_publisher[100] = "";

    int count = 0;

    sort_books(); // 调用排序函数,确保按出版社排序

    for (int i = 0; i < book_count; i++) {

        if (strcmp(current_publisher, books[i].publisher) != 0) {

            if (count > 0) {

                fprintf(file, "出版社: %s, 图书数量: %d\n", current_publisher, count);

            }

            strcpy(current_publisher, books[i].publisher);

            count = 1;

        } else {

            count++;

        }

    }

    if (count > 0) {

        fprintf(file, "出版社: %s, 图书数量: %d\n", current_publisher, count);

    }

    fclose(file);

    printf("图书统计结果已保存到%s文件中。\n", filename);

}

浏览图书功能实现:

void list_books() {

    for (int i = 0; i < book_count; i++) {

        printf("书名: %s, 作者: %s, 出版社: %s, ISBN: %s, 出版时间: %s, 价格: %.2f, 类别: %s\n",

               books[i].title, books[i].author, books[i].publisher, books[i].isbn, books[i].pub_date, books[i].price, books[i].category);

    }

}

在本课题中,我负责了统计图书数量和浏览图书两个功能模块的实现。

工作内容:

  • 统计图书数量功能实现:根据图书的出版社字段,统计每个出版社出版的图书数量,并将结果保存到文件中。
  • 浏览图书功能实现:遍历整个图书数组,输出每本图书的详细信息。

完成的功能及改进空间:

  • 已完成功能:成功实现了统计图书数量和浏览图书功能,并确保了功能的正确性和效率。
  • 改进空间:在统计图书数量时,可以进一步优化算法以提高效率,特别是在处理大量数据时的性能优化;

调试过程及解决措施:

  • 问题:在统计图书数量时,初始版本未正确处理连续相同出版社的图书数量统计,导致结果不准确。
  • 解决:通过调试分析发现问题所在,改进了算法逻辑和数据处理方式,确保了每个出版社的图书数量统计准确。

收获与建议:

  • 收获:通过本次课题,我学会了如何利用排序算法和文件操作来实现数据统计功能,并提升了对数据结构和算法的理解和应用能力。
  • 建议:今后在项目开发中,应更加注重算法效率和代码质量的提升,同时加强与团队成员的沟通和协作,确保整体项目的顺利完成和质量提升。

这些工作经验不仅让我在编程技能上有了进一步的提升,也使我更加意识到团队合作和项目管理的重要性,希望能在未来的项目中继续发挥所长,为团队的成功贡献自己的力量。

源代码  189088817     

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值