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,一经查实,立即删除!

相关文章

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

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

JAVA SE 类和对象

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

【计算机网络】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;上传古籍 点批量上传…

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

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

玩转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;建议跨…

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

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

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

先说说前后端有哪些认证方式来保证&#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上分配内存把需要运行的主机内存…

数据库密码实现加盐加密处理

在实际的开发中&#xff0c;我们的数据库密码一般都是明文的方式存储在数据库中&#xff0c;但是&#xff0c;这种操作非常不安全&#xff0c;容易被黑&#xff01; 那么&#xff0c;此时我们就需要对其进行加密处理&#xff0c;市面上比较常见的就是MD5加密了&#xff0c;但是…

【Linux】syscall sys_write流程摸索

这是通过tty进行摸索sys_write的流程。 在前面的博客里&#xff0c;我们可以看到基于内核C语言源代码日志打印&#xff0c;在打印的日志里边包含&#xff1a;日期&#xff0c;时间&#xff0c;当前文件所在代码目录&#xff0c;当前执行函数名&#xff0c;当前文件执行行号&am…

运维团队如何借助分布式部署提升监控效率与可靠性

随着企业IT基础设施的日益复杂和分布式架构的广泛应用&#xff0c;传统的监控解决方案已经难以满足现代运维团队的需求。在这样的背景下&#xff0c;分布式部署作为一种新型的监控架构&#xff0c;以其灵活性、可扩展性和高可用性&#xff0c;成为了运维团队提升监控效率与可靠…

C++模版基础知识与STL基本介绍

目录 一. 泛型编程 二. 函数模板 1. 概念 2. 函数模版格式 3. 函数模版的原理 4. 模版函数的实例化 (1). 隐式实例化 (2.) 显式实例化 5. 模版参数的匹配原则 三. 类模板 1. 类模板的定义格式 2. 类模板的实例化 四. STL的介绍 1. 什么是STL&#xff1f; 2. STL的版…

3.5-RNN文本生成

1语言模型生成文本的顺序 前面我们已经能够实现使用下图的LSTM网络进行语言建模&#xff1b; 对于一个已经在语料库上学习好的LSTM模型&#xff1b;如果语料库就只是you say goobye and i say hello&#xff1b;那么当把单词i输入到模型中&#xff0c;Time xxx层的第一个LSTM…

苍穹外卖01

0. 配置maven (仅一次的操作 1.项目导入idea 2. 保证nginx服务器运行 &#xff08;nginx.exe要在非中文的目录下&#xff09; 开启服务&#xff1a; start nginx 查看任务进程是否存在&#xff1a; tasklist /fi "imagename eq nginx.exe" 关闭ngi…

中文之美,美在辞藻富丽,也美在情感含蓄内敛。

文章目录 引言句句不提幸福,句句都是幸福句句不提释怀,句句都是释怀句句不提爱意,句句都是爱意句句不提安慰,句句都是安慰句句不提遗憾,句句都是遗憾句句不提思念,句句都是思念引言 许多句子没有将主题直抒胸臆,却通过字词间的呼应、碰撞,让人感受到“言未表而意无穷”…

java高级——Exception异常类基本解读

java高级——Exception异常类基本解读 前情提要文章介绍继承结构异常详解1. 异常的定义2. 异常的分类3.3 异常的处理机制3.3.1 try catch finally语句3.3.2 throw关键字3.3.3 throws关键字 4. 浅谈如何有效的避免异常的发生5. 自定义异常6. 常见的RuntimeException 总结 前情提…

JDBC(Java访问数据库)

Java Database Connectivity&#xff1a;Java访问数据库的解决方案 JDBC定义了一套标准接口&#xff0c;即访问数据库的通用API&#xff0c; 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库&#xff0c;让具体的数据库操作与数…

HDU1056——HangOver,HDU1057——A New Growth Industry,HDU1058——Humble Numbers

目录 HDU1056——HangOver 题目描述 运行代码 代码思路 HDU1057——A New Growth Industry 题目描述 运行代码 代码思路 HDU1058——Humble Numbers 题目描述 运行代码 代码思路 HDU1056——HangOver 题目描述 Problem - 1056 运行代码 #include <iostream&…