C语言图书信息管理系统

news2024/11/13 14:21:28

题目:图书信息管理系统

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

  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.coloradmin.cn/o/1952333.html

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

相关文章

golang设置远程调试

1. 目标机器构建安装dlv https://github.com/go-delve/delve go build之后将编译号的dlv命令路径添加到PATH里 2. 目标机器下载源代码并且运行dlv dlv debug --headless --listen:2345 --api-version2 --accept-multiclient 3.本机添加go remote 4. 设置断点即可

JAVA简介与开发环境配置(基础介绍 一)

目录 Java 简介 主要特性 发展历史 Java开发工具 Java 开发环境配置 window系统安装java 下载JDK 配置环境变量 通过控制台测试JDK是否安装成功 Linux&#xff0c;UNIX&#xff0c;Solaris&#xff0c;FreeBSD环境变量设置 流行JAVA开发工具 使用 Eclipse 运行第一…

C++程序的UI界面闪烁问题的解决办法总结

Windows C++程序复杂的UI界面要使用多种绘图技术(使用GDI、GDI+、ddraw、D3D等绘图),并要贴图去美化,在窗口移动或者改变大小的时候可能会出现闪烁。下面罗列一下UI界面产生闪烁的几种可能的原因,并给出相应的解决办法。 1、原因一 如果熟悉显卡原理的话,调用GDI函数向屏…

Visual Studio2022在屏幕缩放后界面问题的解决方法

Visual Studio2022在屏幕缩放后界面问题的解决方法 最近帮客户修改一个几年前用C#开发的WinForm程序&#xff0c;遇到个奇怪问题&#xff0c;记录一下解决方法。 事情是这样&#xff0c;年初时换了台2K高分屏的开发笔记本&#xff0c;终于淘汰了那台不堪重负的用了五年的Think…

leetcode-98. 验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&…

mysql报错:Unknown collation: ‘utf8mb4_0900_ai_ci‘的原因及解决方法

参考博客&#xff1a;http://t.csdnimg.cn/NRzyk 报错场景描述 使用navicate在查询中运行sql语句时报错&#xff1a;Unknown collation: utf8mb4_0900_ai_ci 报错原因 生成转储文件的数据库版本为8.0&#xff0c;我本地数据库版本为5.6&#xff0c;高版本导入到低版本&…

国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理

1、假设我们从决策树生成了一个训练集&#xff0c;然后将决策树学习应用于该训练集。当训练集的大小趋于无穷时&#xff0c;学习算法将最终返回正确的决策树吗&#xff1f;为什么是或不是&#xff1f; 本次有两个参考&#xff1a; 参考一&#xff1a; 当训练集的大小趋于无穷…

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…

**往届快至会后2个月完成检索,刊后1个月完成检索,第四届电子信息工程与计算机科学国际会议(EIECS 2024)火热征稿中!

2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024) 2024 4th International Conference on Electronic Information Engineering and Computer Science 中国延吉 | 2024年9月27-29日 二轮截稿日期&#xff1a;2024年8月9日 收录检索&#xff1a;EI Compendex, Sc…

【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针

目录 常量指针和指向常量的指针有什么区别&#xff1f;1. 指向常量的指针&#xff08;Pointer to Constant&#xff09;声明方式&#xff1a;示例&#xff1a;解释&#xff1a; 2. 常量指针&#xff08;Constant Pointer&#xff09;声明方式&#xff1a;示例&#xff1a;解释&…

AIoTedge边缘物联网平台,开启智能物联新架构

边缘物联网平台是一种将计算能力、数据处理和应用服务部署在网络边缘的解决方案&#xff0c;旨在提高响应速度、降低带宽需求和增强数据安全。根据搜索结果&#xff0c;边缘物联网平台应具备以下功能&#xff1a; 云边协同&#xff1a; 云边一体架构&#xff0c;通过云端管理边…

html 解决tooltip宽度显示和文本任意位置换行文本显示问题

.el-tooltip__popper {max-width: 480px;white-space: break-spaces; /* 尝试不同的white-space属性值 */word-break:break-all; }

医疗大模型落地赛,敢问钱在何方?

“你们能不能帮我们触达到更多顶尖药企&#xff1f;” 一大模型厂商与某服务商沟通需求时率先发问。从混沌时期的争辩模型大小、数据规模&#xff0c;到如今的做应用、抢占医疗各环节场景&#xff0c;中国医疗大模型已经进入落地的第二战场。 中国信通院云计算与大数据研究所…

基于Xejen框架实现的C# winform鼠标点击器、电脑按键自动点击器的软件开发及介绍

功能演示 文章开始之前&#xff0c;仍然是先来个视频&#xff0c;以便用户知道鼠标连点器的基本功能 软件主界面 多功能鼠标连点器 快速点击&#xff1a; 痕即鼠标点击器可以设定每秒点击次数&#xff0c;让您轻松应对高频点击需求。 切换时长&#xff0c;即每次动作之间的间…

使用Process Explorer/Process Hacker和Windbg高效排查C++程序高CPU占用问题

目录 1、为什么需要将Process Explorer/Process Hacker与Windbg结合起来分析高CPU占用问题? 1.1、使用Windbg分析时为什么还要使用Process Explorer/Process Hacker呢? 1.2、使用Process Explorer/Process Hacker分析时为什么还要使用Windbg呢? 2、先用Process Explorer…

《程序猿入职必会(6) · 返回结果统一封装》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

前段时间&#xff0c;带着大家捏了一个对话机器人&#xff1a; 手把手带你搭建一个语音对话机器人&#xff0c;5分钟定制个人AI小助手&#xff08;新手入门篇&#xff09; 其中语音识别&#xff08;ASR&#xff09;方案&#xff0c;采用的是阿里开源的 FunASR&#xff0c;这刚…

【Python机器学习】朴素贝叶斯——条件概率

条件概率 假设现在有一个装了7块石头的罐子&#xff08;3块灰色&#xff0c;4块黑色&#xff09;&#xff0c;如果从中随机取出一块&#xff0c;灰色的可能性就是3/7&#xff0c;黑色的可能性是4/7。我们使用p(gray)来表示取到灰色石头的概率&#xff0c;其概率值可以通过灰色…

Radxa ROCK 5B+开发板基本配置和上手测试

目录 1.ROCK 5B Plus开发板是什么&#xff1f;2.烧录官方系统3.设置ROOT用户4.开发板温度情况5.VNC远程桌面配置6.WIFI模块测速7.M2接口使用注意8.总结 1.ROCK 5B Plus开发板是什么&#xff1f; ROCK 5B&#xff08;即ROCK 5B Plus&#xff0c;本文用ROCK 5B指代&#xff09; …

数据结构-----对列

前言 Hello, 小伙伴们&#xff0c;你们的作者菌又来了&#xff0c;前不久&#xff0c;我们学习了一种数据结构----栈&#xff0c;他特殊的性质使得他在一些数据管理的问题上被广泛的使用&#xff0c;那今天&#xff0c;我们就来学习另一种十分重要的数据结构--对列。 在开始之…