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     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈WebSerice

一. 什么是WebService Web Service也称为web服务&#xff0c;它是一种跨编程语言和操作系统平台的远程调用技术。Web Service采用标准的SOAP协议传输&#xff08;SOAP&#xff1a;Simple Object Access Protocol简单对象访问协议&#xff0c;soap属于w3c标准。并且soap协议是基…

C++ 算法:从基础到高级

C 算法&#xff1a;从基础到高级 C 是一种功能强大且高效的编程语言&#xff0c;广泛应用于系统编程、游戏开发、嵌入式系统以及高性能计算等领域。算法是程序设计的核心&#xff0c;掌握常用算法是成为优秀 C 程序员的必备技能。本文将介绍一些常用的 C 算法&#xff0c;从基…

【漏洞复现】phpStudy 小皮 Windows面板 存在RCE漏洞

靶场资料后台自行领取【靶场】 image-20240726092307252 PhpStudy小皮面板曝RCE漏洞&#xff0c;本质是存储型XSS引发。攻击者通过登录用户名输入XSS代码&#xff0c;结合后台计划任务功能&#xff0c;实现远程代码执行&#xff0c;严重威胁服务器安全。建议立即更新至安全版…

JAVA SE 类和对象

类和对象 类定义和使用类的定义格式 类的实例化什么是实例化 this 引用this引用的特性 对象的构造及初始化如何初始化对象构造方法概念特性 在这里插入图片描述 **注意**&#xff1a; 封装封装的概念封装扩展之包导入包中的类自定义包包的访问权限控制举例 static成员static修饰…

Spring Cloud全解析:入门指南与概览,轻松掌握微服务架构的基石

springcloud简介 微服务&#xff1f; 微服务是一种架构风格&#xff0c;将单体应用划分为小型的服务单元&#xff0c;微服务之间使用HTTP的API进行资源访问和操作&#xff0c;与SOA不同的是&#xff0c;SOA架构侧重于将每个单体应用的服务集成到ESB(消息总线)上&#xff0c;而…

P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

[NOIP2001 普及组] 最大公约数和最小公倍数问题 题目描述 输入两个正整数 x 0 , y 0 x_0, y_0 x0​,y0​&#xff0c;求出满足下列条件的 P , Q P, Q P,Q 的个数&#xff1a; P , Q P,Q P,Q 是正整数。 要求 P , Q P, Q P,Q 以 x 0 x_0 x0​ 为最大公约数&#xff0c;以…

【计算机网络】TCP协议详解

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1、引言2、udp和tcp协议的异同3、tcp服务器3.1、接口认识3.2、服务器设计 4、tcp客户端4.1、客户端设计4.2、说明 5、再研Tcp服务端5.1、多进程版5.2、多线程版 5、守护进程化5.1、什么是守护进程5.2…

古籍双层PDF制作教程:保姆级古籍数字化教程

在智慧古籍数字化项目中&#xff0c;很多图书馆要求将古籍导出为双层PDF&#xff0c;并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台&#xff0c;3分钟把一个古籍书籍转化为双侧PDF。 第1步&#xff1a;上传古籍 点批量上传…

注释和关键字

注释 注释就是对代码的解释说明 单行注释 格式&#xff1a; // 多行注释 格式&#xff1a; /* */ 文档注释 格式&#xff1a; /** */ 关键字

云服务器Ubuntu18.04进行Nginx配置

云服务器镜像版本信息&#xff1a;Ubuntu 18.04 server 64bit&#xff0c;本文记录了在改版本镜像上安装Nginx&#xff0c;并介绍了Nginx配置文件目录&#xff0c;便于后面再次有需求时进行复习。 文章目录 Nginx的安装Nginx配置文件分析 Nginx的安装 1.执行下面命令进行安装…

基于FPGA的数字信号处理导航

之前闲暇的时候也看过一些数字信号处理和调制解调的原理及FPGA实现&#xff0c;不管是DDS、FIR、IIR滤波器&#xff0c;还是ASK、FSK、上变频、下变频的实现&#xff0c;都是比较简单的&#xff08;仅限于实现&#xff0c;不做深入讨论&#xff09;&#xff0c;而这些算法使用F…

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

玩转CSS&#xff1a;用ul li JS 模拟select&#xff0c;避坑浏览器不兼容。 在前端的工作中&#xff0c;经常会遇到 selcet控件&#xff0c;但我们用css来写它的样式时候&#xff0c;总是不那么令人满意&#xff0c;各种浏览器不兼容啊有没有&#xff1f; 那么&#xff0c;我…

西电网络空间安全综合953考研分享||西安电子科技大学

一、院校选择 如何选择适合自己的学校以及专业 1. 首先要对自己选择的学校有热情&#xff0c;选择自己最想去的学校 2. 其次选择在自己能力范围内努力能考上的学校&#xff0c;综合考虑地区&#xff08;不同地区公共课分数有一定的差别&#xff09;、学校&#xff08;建议跨…

关于MyBatis的缓存详解

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它提供了对数据库的简单操作和映射。MyBatis 的缓存机制是其核心特性之一&#xff0c;它可以帮助开发者提高应用程序的性能&#xff0c;通过减少对数据库的直接访问次数来降低数据库的负载。 1. MyBatis 缓存介绍 默认缓存行…

Vue3计算属性终极实战:可媲美Element Plus Tree组件研发之节点勾选

前面完成了JuanTree组件的节点编辑和保存功能后&#xff0c;我们把精力放到节点勾选功能实现上来。**注意&#xff0c;对于组件的开发者来说&#xff0c;要充分考虑用户的使用场景&#xff0c;组件提供的多个特性同时启用时必须要工作良好。**就拿Tree组件来说&#xff0c;用户…

大模型训练为何离不开GPU?深度解析与显卡推荐

在人工智能的蓬勃发展中&#xff0c;大模型的训练成为了热门话题。然而&#xff0c;许多人还不清楚为什么训练这些庞大的模型需要GPU&#xff08;图形处理单元&#xff09;。本文将深入探讨GPU在大模型训练中的重要性&#xff0c;并推荐几款适合的显卡。 一、GPU与CPU的区别 …

Java消失的数字

题目要求 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;[9,6,4,2,3,5,7,0,1] 输出&a…

如何保证前后端交互信息不被篡改。

先说说前后端有哪些认证方式来保证&#xff1a; 基于 session 的认证方式&#xff1a;前端在用户登录成功后&#xff0c;后端会在服务器端生成一个唯一的 session ID&#xff0c;并将该 session ID 返回给前端&#xff0c;在后续的请求中&#xff0c;前端需要带上该 session ID…

【CUDA Runtime】第一个“Hello World“程序

文章目录 前言前提须知CUDA Runtime 简介核心功能优势和应用 使用CudaRuntime进行第一个"Hello world"程序创建CudaRuntime工程选择GPU函数原型参数返回值作用 获取支持Cuda的GPU信息获取支持Cuda的GPU数量获取设备属性运行展示 在GPU上分配内存把需要运行的主机内存…

scrapy出现OSError: could not get source code错误解决

出现问题如下&#xff1a; Traceback (most recent call last):File "C:\Users\admin\Desktop\crawler_scrapy_us\venv\lib\site-packages\scrapy\utils\defer.py", line 73, in mustbe_deferredresult f(*args, **kw)File "C:\Users\admin\Desktop\crawler_sc…