From f5103627ef38741ec83d54cb0fb1eebd2d1a5985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E5=B2=B1=E7=91=BE?= <3198996150@qq.com> Date: Sun, 21 May 2023 10:14:05 +0800 Subject: [PATCH] 1 --- .vscode/.gitignore | 34 ---- .vscode/LICENSE | 116 ------------ .vscode/README.md | 445 -------------------------------------------- README.md | 447 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 446 insertions(+), 596 deletions(-) delete mode 100644 .vscode/.gitignore delete mode 100644 .vscode/LICENSE delete mode 100644 .vscode/README.md diff --git a/.vscode/.gitignore b/.vscode/.gitignore deleted file mode 100644 index e257658..0000000 --- a/.vscode/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# ---> C++ -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - diff --git a/.vscode/LICENSE b/.vscode/LICENSE deleted file mode 100644 index 8d8fae9..0000000 --- a/.vscode/LICENSE +++ /dev/null @@ -1,116 +0,0 @@ -木兰宽松许可证, 第1版 - -木兰宽松许可证, 第1版 - -2019年8月 http://license.coscl.org.cn/MulanPSL - -您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第1版(“本许可证”)的如下条款的约束: - -0. 定义 - -“软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 - -“贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 - -“法人实体”是指提交贡献的机构及其“关联实体”。 - -“关联实体”是指,对“本许可证”下的一方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 - -“贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 - -1. 授予版权许可 - -每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 - -2. 授予专利许可 - -每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括仅因您或他人修改“贡献”或其他结合而将必然会侵犯到的专利权利要求。如您或您的“关联实体”直接或间接地(包括通过代理、专利被许可人或受让人),就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 - -3. 无商标许可 - -“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 - -4. 分发限制 - -您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 - -5. 免责声明与责任限制 - -“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 - -条款结束 - -如何将木兰宽松许可证,第1版,应用到您的软件 - -如果您希望将木兰宽松许可证,第1版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: - -1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; - -2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; - -3, 请将如下声明文本放入每个源文件的头部注释中。 - -Copyright (c) [2019] [name of copyright holder] -[Software Name] is licensed under the Mulan PSL v1. -You can use this software according to the terms and conditions of the Mulan PSL v1. -You may obtain a copy of Mulan PSL v1 at: - http://license.coscl.org.cn/MulanPSL -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -See the Mulan PSL v1 for more details. -Mulan Permissive Software License,Version 1 - -Mulan Permissive Software License,Version 1 (Mulan PSL v1) - -August 2019 http://license.coscl.org.cn/MulanPSL - -Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v1 (this License) with following terms and conditions: - -0. Definition - -Software means the program and related documents which are comprised of those Contribution and licensed under this License. - -Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. - -Legal Entity means the entity making a Contribution and all its Affiliates. - -Affiliates means entities that control, or are controlled by, or are under common control with a party to this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. - -Contribution means the copyrightable work licensed by a particular Contributor under this License. - -1. Grant of Copyright License - -Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. - -2. Grant of Patent License - -Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed, excluding of any patent claims solely be infringed by your or others’ modification or other combinations. If you or your Affiliates directly or indirectly (including through an agent, patent licensee or assignee), institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. - -3. No Trademark License - -No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4. - -4. Distribution Restriction - -You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. - -5. Disclaimer of Warranty and Limitation of Liability - -The Software and Contribution in it are provided without warranties of any kind, either express or implied. In no event shall any Contributor or copyright holder be liable to you for any damages, including, but not limited to any direct, or indirect, special or consequential damages arising from your use or inability to use the Software or the Contribution in it, no matter how it’s caused or based on which legal theory, even if advised of the possibility of such damages. - -End of the Terms and Conditions - -How to apply the Mulan Permissive Software License,Version 1 (Mulan PSL v1) to your software - -To apply the Mulan PSL v1 to your work, for easy identification by recipients, you are suggested to complete following three steps: - -i. Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; -ii. Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; -iii. Attach the statement to the appropriate annotated syntax at the beginning of each source file. - -Copyright (c) [2019] [name of copyright holder] -[Software Name] is licensed under the Mulan PSL v1. -You can use this software according to the terms and conditions of the Mulan PSL v1. -You may obtain a copy of Mulan PSL v1 at: - http://license.coscl.org.cn/MulanPSL -THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -See the Mulan PSL v1 for more details. diff --git a/.vscode/README.md b/.vscode/README.md deleted file mode 100644 index fda1ffb..0000000 --- a/.vscode/README.md +++ /dev/null @@ -1,445 +0,0 @@ -# 图书管理系统 - -金雨佳、宋岱瑾、费良荣 - -## 项目简介 - -本系统是程序设计与问题求解课程设计项目,实现了库存零件 CSV 格式数据文件的读取和保存,以及数据的增删改查(CRUD)、排序和图表显示等功能。项目采用 C 语言编程实现,在 VS Code 集成开发环境(IDE)中用 GCC 进行编译。系统采用模块化设计,程序结构清晰,采用菜单驱动的命令行界面,操作便捷,能够用 CSV 格式读取和保存数据,通用性强,能够用图表展示数据,直观清楚。 - -下载地址:https://code.educoder.net/pfh4wq3fa/ssssss - -项目开发过程中采用 Kanban(看板)进行任务管理和分工协作,并使用 Git 对程序代码和文档进行版本管理。任务分工情况如下: - -| 任务 | 设计 | 开发 | 测试 | 文档 | -| ---- | ---- | ---- | ---- | ---- | -| C1-C3 菜单驱动的用户界面 | 宋岱瑾 | 宋岱瑾 | 金雨佳 | 宋岱瑾 | -| C4 添加图书记录 | 姚震 | 姚震 | 费良荣 | 姚震 | -| C5 查询图书记录 | 金雨佳 | 金雨佳 | 宋岱瑾 | 金雨佳 | -| C6 打印图书列表 | 金雨佳 | 金雨佳 | 姚震 | 金雨佳 | -| C7 修改图书记录 | 费良荣 | 费良荣 | 宋岱瑾 | 费良荣 | -| C8 删除图书记录 | 姚震 | 姚震 | 费良荣 | 姚震 | -| C9 图书记录排序 | 姚震 | 姚震 | 金雨佳 | 姚震 | -| C10 从文件中读取图书记录 | 费良荣 | 费良荣 | 宋岱瑾 | 费良荣 | -| C11 将图书保存到文件 | 宋岱瑾 | 宋岱瑾 | 费良荣 | 宋岱瑾 | -| C12 以图表方式显示图书记录 | 宋岱瑾 | 宋岱瑾 | 金雨佳. | 宋岱瑾 | - -每个成员的工作量(百分比): - -| 姚震 | 金雨佳 | 宋岱瑾 | 费良荣 | -| ---- | ---- | ---- | ---- | -| 25 | 25 | 25 | 25 | - - -## 关于图书管理系统 - -设计一个图书管理系统,要求采用命令行菜单界面进行交互,具备读取、保存、打印、查询、修改、插入、删除和排序等基本功能,能够以表格和图表形式展示数据,采用 CSV 格式保存数据。 - -系统的功能性需求: -- 数据的读取、保存、打印、查询、修改、插入、删除、排序和图表展示。 - -系统的非功能性需求: -- 菜单驱动的命令行交互界面。 - - -## 需求分析 - -分析系统的功能需求和界面需求,编制用户手册如下。 - -#### C1: 启动程序 - -命令行中执行命令 `./app`,系统启动,显示提示信息,然后显示功能菜单,等待用户输入命令。 -``` -图书管理系统启动 - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择: -``` - - - -#### C2: 显示命令菜单 - -``` -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择: -``` - - - -#### C3: 退出程序 - -选择菜单命令 `0`,再输入 `y` 确认,则退出程序。 - -``` -请选择:0 -确定要退出吗?(Y/N): y -程序退出 -``` - - - -#### C4: 添加记录 - -选择菜单命令 `5`,提示输入图书编号,若该图书不存在,则继续输入图书名、图书编号、图书借阅次数,并提示完成;若图书编号已存在,则提示学图书已存在,并结束。 - -``` -请选择:5 -输入图书编号:101 -输入图书名称:老人与海 -输入图书索引号:123456 -图书 101 已添加 - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:5 -输入图书编号:101 -图书已存在. -``` - - -#### C5: 查询图书记录 - -选择菜单命令 `4`,提示输入图书编号,若该图书存在,则输出图书信息;否则提示图书不存在并结束。 - -``` -请选择:4 -输入图书编号:101 -图书编号:101 -图书名称:老人与海 -图书索引号:123456 - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:4 -输入图书索引号:100 -图书不存在. - -``` - - - -#### C6: 打印图书列表 - -选择菜单命令 `3`,打印 - -``` -请选择:3 -------------------------------------------------------- -| NUMBER | NAME | ON HAND | -------------------------------------------------------- -| 101 | 老人与海 | 80 | -------------------------------------------------------- - -``` - - - -#### C7: 修改图书记录 - -选择菜单命令 `6`,根据提示输入图书编号,若图书存在,则继续输入新的图书编号和图书,并修改图书记录;否则,提示图书不存在并结束。 - -``` -请选择:6 -输入图书编号:101 -输入图书名称:张 -输入图书索引号:90 -图书 101 已更新 - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:3 -------------------------------------------------------- -| NUMBER | NAME | ON HAND | -------------------------------------------------------- -| 101 | 老人与海 | 90 | -------------------------------------------------------- - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:6 -输入图书编号:100 -图书不存在. - -``` - - - -#### C8: 删除图书记录 - -选择菜单命令 `7`,根据提示输入图书编号,若图书存在,则删除之;否则提示图书不存在并结束。 - -``` -请选择:7 -输入图书编号:100 -图书不存在. - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:7 -输入图书编号:101 -图书 101 已删除 - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:3 -------------------------------------------------------- -| NUMBER | NAME | ON HAND | -------------------------------------------------------- -------------------------------------------------------- - -``` - - - -#### C9: 图书记录排序 - -选择菜单命令 `8`,对库存记录按图书借阅次数由高到低排序,若次数相同,则按编号从小到大排序。 - -``` -请选择:3 -------------------------------------------------------- -| NUMBER | NAME | ON HAND | -------------------------------------------------------- -| 101 | 老人与海 | 80 | -| 100 | 战争与和平 | 90 | -------------------------------------------------------- - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:8 -排序 -排序已完成 - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:3 -------------------------------------------------------- -| NUMBER | NAME | ON HAND | -------------------------------------------------------- -| 100 | 战争与和平 | 90 | -| 101 | 老人与海 | 80 | -------------------------------------------------------- - -``` - - - -#### C10: 从文件中读取图书记录 - -选择菜单命令 `1`,提示输入文件名,若文件存在,则打开文件读取 CSV 格式保存的所有库存记录;否则,若文件不存在,则给出错误信息并结束。 - -假设文件 `a.csv` 中,以 CSV (Comma-Separated Values)格式保存了如下记录: - -``` -103,程序设计,80 -104,离散数学,88 -101,老人与海,90 -102,高等数学,100 -``` - -则读取记录的过程如下: - -``` -请选择:1 -读取数据 -请输入文件名:a.csv -读取 4 记录 - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:3 -------------------------------------------------------- -| NUMBER | NAME | ON HAND | -------------------------------------------------------- -| 103 | 程序设计 | 80 | -| 104 | 离散数学 | 88 | -| 101 | 老人与海 | 90 | -| 102 | 高等数学 | 100 | -------------------------------------------------------- - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -请选择:1 -读取数据 -请输入文件名:a -a: No such file or directory - -``` - - - -#### C11: 将图书保存保存到文件 - -选择菜单命令 `2`,提示输入文件名,将所有库存记录以 CSV 格式保存到指定的文件中。 - -``` -请选择:2 -保存数据 -请输入文件名:b.csv -保存 4 记录 - -``` - - - -#### C12: 以图表方式显示图书记录 - -选择菜单命令 `9`,以图表方式显示库存记录。 - -``` -请选择:9 -图表 - 103 : 程序设计 | ******** (80) - 104 : 离散数学 | ************ (88) - 101 : 老人与海 | ******************** (90) - 102 : 高等数学 | ********** (100) - -1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 -6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 - -``` - - -## 概要设计 - -系统主要分为用户界面和数据处理两大模块。 -用户界面模块包括系统初始化(init),显示菜单(display_menu),选择菜单命令(make_choice)、确认(confirm)、退出(quit)等子模块。 -数据处理模块包括读取数据(read_data)、保存数据(save_data)、打印数据(print_data)、查询数据(query_data)、添加数据(add_data)、更新数据(update_data)、删除数据(delete_data)、数据排序(sort_data)和生成图表(make_chart)等子模块。其中查询、添加、更新和删除数据还会用到根据编号查询数据的方法(find)。 - -上述各模块通过主程序(main)进行调用,系统模块图如下。 - - -![系统模块图](main.svg) - -各模块的主要功能如下: - -#### main - -系统主函数模块,显示菜单,根据用户选择的菜单命令,执行相关操作。 - -#### init - -系统初始化。 - -#### display_menu - -显示菜单命令。 - - -## 详细设计 - -针对概要设计 - -#### main - -Step 1: 初始化 -Step 2: 根据用户选择的命令执行对应的操作 -Step 2.1: 显示菜单 -Step 2.2: 选择菜单命令 c -Step 2.3: if c == CMD_READ then 读取数据 -Step 2.4: if c == CMD_SAVE then 保存数据 -Step 2.5: if c == CMD_PRINT then 打印数据 -Step 2.6: - - -![主程序流程图](main.svg) - - -#### save_data - -Step 1: 输入文件名 -Step 2: 打开文件 -Step 3: if 打开文件失败 then 提示打开文件失败并结束 -Step 4: 将所有库存记录写入文件 -Step 5: 关闭文件 - - -![保存数据流程图](picture-save.svg) - -#### add_data - -Step 1: if 数据库满 then 提示数据库满并结束 -Step 2: 输入图书编号 -Step 3: if 图书已存在 then 提示图书已存在并结束 -Step 4: 输入图书名和图书数量 -Step 5: 添加新图书到数据 -Step 6: 提示添加成功 - -![添加库存记录流程图](picture-add.svg) - - -### query_data -Step 1:提示输入图书编号,并输入编号 -Step 2:for i = 0 to num_parts开始查询 -Step 3:查询最后一个图书结束 -Step 4:if未查询到提示图书不存在 -Step 5:else打印图书信息 - -![查询流程图](query_data.svg) - - -### printf_data -Step 1:打印图书编号和图书名 -Step 2:for i = 1 to num_parts -Step 3:打印借阅次数 - -![打印记录流程图](printf_data.svg) - -#### update_data -Step 1:输入图书编号 -Step 2:查找图书是否已录入 -Step 3:if 不存在then 直接退出 -Step 4:else 输出图书信息 -![修改学生信息](pictureupdata.svg) - -#### delete_data - -Step 1: 输入图书编号 -Step 2: 查找图书所在的位置 -Step 3: if 没有该图书then 则输出图书不存在 -Step 4: 将查找到的图书后面的依次往前移动信息 -Step 5: 将图书总数减一 -Step 6: 提示删除成功 -![打印记录流程图](deletesortupdate.svg) - - -#### sort_data - -Step 1: 进行冒泡排序 -Step 2: 将按图书借阅次数排序,若前面的比后面的大,则交换 -Step 3: 每次遍历记录是否交换,若没有交换,则排序结束 -Step 4: 若借阅次数相同,则按照编号从小到大排序 -![打印记录流程图](sort1.svg) - - -#### read_data -Step 1:输入文件名 -Step 2:查看输入的文件名是否和已有的文化相匹配 -Step 3:若匹配成功,则打开文件 -Step 4:若不成功,则返回错误值 -Step 5:打开后利用循环,依次输出文件里各个图书信息; -Step 6:关闭文件 -![读取流程图](read_data.svg) - - -#### make_chart -Step 1:打印表头 -Step 2:循环打印图书名和图书编号 -Step 3:循环套循环打印图表 -Step 4:打印结束后换行继续循环 -Step 5:打印成功 -![读取流程图](make_chart.svg) diff --git a/README.md b/README.md index b07c16d..913013d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,447 @@ -# ssssss +# 图书管理系统 + +金雨佳、宋岱瑾、费良荣 + +## 项目简介 + +本系统是程序设计与问题求解课程设计项目,实现了库存零件 CSV 格式数据文件的读取和保存,以及数据的增删改查(CRUD)、排序和图表显示等功能。项目采用 C 语言编程实现,在 VS Code 集成开发环境(IDE)中用 GCC 进行编译。系统采用模块化设计,程序结构清晰,采用菜单驱动的命令行界面,操作便捷,能够用 CSV 格式读取和保存数据,通用性强,能够用图表展示数据,直观清楚。 + +下载地址:https://code.educoder.net/pfh4wq3fa/ssssss + +项目开发过程中采用 Kanban(看板)进行任务管理和分工协作,并使用 Git 对程序代码和文档进行版本管理。任务分工情况如下: + +| 任务 | 设计 | 开发 | 测试 | 文档 | +| ---- | ---- | ---- | ---- | ---- | +| C1-C3 菜单驱动的用户界面 | 宋岱瑾 | 宋岱瑾 | 金雨佳 | 宋岱瑾 | +| C4 添加图书记录 | 姚震 | 姚震 | 费良荣 | 姚震 | +| C5 查询图书记录 | 金雨佳 | 金雨佳 | 宋岱瑾 | 金雨佳 | +| C6 打印图书列表 | 金雨佳 | 金雨佳 | 姚震 | 金雨佳 | +| C7 修改图书记录 | 费良荣 | 费良荣 | 宋岱瑾 | 费良荣 | +| C8 删除图书记录 | 姚震 | 姚震 | 费良荣 | 姚震 | +| C9 图书记录排序 | 姚震 | 姚震 | 金雨佳 | 姚震 | +| C10 从文件中读取图书记录 | 费良荣 | 费良荣 | 宋岱瑾 | 费良荣 | +| C11 将图书保存到文件 | 宋岱瑾 | 宋岱瑾 | 费良荣 | 宋岱瑾 | +| C12 以图表方式显示图书记录 | 宋岱瑾 | 宋岱瑾 | 金雨佳. | 宋岱瑾 | + +每个成员的工作量(百分比): + +| 姚震 | 金雨佳 | 宋岱瑾 | 费良荣 | +| ---- | ---- | ---- | ---- | +| 25 | 25 | 25 | 25 | + + +## 关于图书管理系统 + +设计一个图书管理系统,要求采用命令行菜单界面进行交互,具备读取、保存、打印、查询、修改、插入、删除和排序等基本功能,能够以表格和图表形式展示数据,采用 CSV 格式保存数据。 + +系统的功能性需求: +- 数据的读取、保存、打印、查询、修改、插入、删除、排序和图表展示。 + +系统的非功能性需求: +- 菜单驱动的命令行交互界面。 + + +## 需求分析 + +分析系统的功能需求和界面需求,编制用户手册如下。 + +#### C1: 启动程序 + +命令行中执行命令 `./app`,系统启动,显示提示信息,然后显示功能菜单,等待用户输入命令。 +``` +图书管理系统启动 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择: +``` + + + +#### C2: 显示命令菜单 + +``` +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择: +``` + + + +#### C3: 退出程序 + +选择菜单命令 `0`,再输入 `y` 确认,则退出程序。 + +``` +请选择:0 +确定要退出吗?(Y/N): y +程序退出 +``` + + + +#### C4: 添加记录 + +选择菜单命令 `5`,提示输入图书编号,若该图书不存在,则继续输入图书名、图书编号、图书借阅次数,并提示完成;若图书编号已存在,则提示学图书已存在,并结束。 + +``` +请选择:5 +输入图书编号:101 +输入图书名称:老人与海 +输入图书索引号:123456 +图书 101 已添加 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:5 +输入图书编号:101 +图书已存在. +``` + + +#### C5: 查询图书记录 + +选择菜单命令 `4`,提示输入图书编号,若该图书存在,则输出图书信息;否则提示图书不存在并结束。 + +``` +请选择:4 +输入图书编号:101 +图书编号:101 +图书名称:老人与海 +图书索引号:123456 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:4 +输入图书索引号:100 +图书不存在. + +``` + + + +#### C6: 打印图书列表 + +选择菜单命令 `3`,打印 + +``` +请选择:3 +------------------------------------------------------- +| NUMBER | NAME | ON HAND | +------------------------------------------------------- +| 101 | 老人与海 | 80 | +------------------------------------------------------- + +``` + + + +#### C7: 修改图书记录 + +选择菜单命令 `6`,根据提示输入图书编号,若图书存在,则继续输入新的图书编号和图书,并修改图书记录;否则,提示图书不存在并结束。 + +``` +请选择:6 +输入图书编号:101 +输入图书名称:张 +输入图书索引号:90 +图书 101 已更新 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:3 +------------------------------------------------------- +| NUMBER | NAME | ON HAND | +------------------------------------------------------- +| 101 | 老人与海 | 90 | +------------------------------------------------------- + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:6 +输入图书编号:100 +图书不存在. + +``` + + + +#### C8: 删除图书记录 + +选择菜单命令 `7`,根据提示输入图书编号,若图书存在,则删除之;否则提示图书不存在并结束。 + +``` +请选择:7 +输入图书编号:100 +图书不存在. + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:7 +输入图书编号:101 +图书 101 已删除 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:3 +------------------------------------------------------- +| NUMBER | NAME | ON HAND | +------------------------------------------------------- +------------------------------------------------------- + +``` + + + +#### C9: 图书记录排序 + +选择菜单命令 `8`,对库存记录按图书借阅次数由高到低排序,若次数相同,则按编号从小到大排序。 + +``` +请选择:3 +------------------------------------------------------- +| NUMBER | NAME | ON HAND | +------------------------------------------------------- +| 101 | 老人与海 | 80 | +| 100 | 战争与和平 | 90 | +------------------------------------------------------- + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:8 +排序 +排序已完成 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:3 +------------------------------------------------------- +| NUMBER | NAME | ON HAND | +------------------------------------------------------- +| 100 | 战争与和平 | 90 | +| 101 | 老人与海 | 80 | +------------------------------------------------------- + +``` + + + +#### C10: 从文件中读取图书记录 + +选择菜单命令 `1`,提示输入文件名,若文件存在,则打开文件读取 CSV 格式保存的所有库存记录;否则,若文件不存在,则给出错误信息并结束。 + +假设文件 `a.csv` 中,以 CSV (Comma-Separated Values)格式保存了如下记录: + +``` +103,程序设计,80 +104,离散数学,88 +101,老人与海,90 +102,高等数学,100 +``` + +则读取记录的过程如下: + +``` +请选择:1 +读取数据 +请输入文件名:a.csv +读取 4 记录 + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:3 +------------------------------------------------------- +| NUMBER | NAME | ON HAND | +------------------------------------------------------- +| 103 | 程序设计 | 80 | +| 104 | 离散数学 | 88 | +| 101 | 老人与海 | 90 | +| 102 | 高等数学 | 100 | +------------------------------------------------------- + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +请选择:1 +读取数据 +请输入文件名:a +a: No such file or directory + +``` + + + +#### C11: 将图书保存保存到文件 + +选择菜单命令 `2`,提示输入文件名,将所有库存记录以 CSV 格式保存到指定的文件中。 + +``` +请选择:2 +保存数据 +请输入文件名:b.csv +保存 4 记录 + +``` + + + +#### C12: 以图表方式显示图书记录 + +选择菜单命令 `9`,以图表方式显示库存记录。 + +``` +请选择:9 +图表 + 103 : 程序设计 | ******** (80) + 104 : 离散数学 | ************ (88) + 101 : 老人与海 | ******************** (90) + 102 : 高等数学 | ********** (100) + +1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加 +6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出 + +``` + + +## 概要设计 + +系统主要分为用户界面和数据处理两大模块。 +用户界面模块包括系统初始化(init),显示菜单(display_menu),选择菜单命令(make_choice)、确认(confirm)、退出(quit)等子模块。 +数据处理模块包括读取数据(read_data)、保存数据(save_data)、打印数据(print_data)、查询数据(query_data)、添加数据(add_data)、更新数据(update_data)、删除数据(delete_data)、数据排序(sort_data)和生成图表(make_chart)等子模块。其中查询、添加、更新和删除数据还会用到根据编号查询数据的方法(find)。 + +上述各模块通过主程序(main)进行调用,系统模块图如下。 + + +![系统模块图](main.svg) + +各模块的主要功能如下: + +#### main + +系统主函数模块,显示菜单,根据用户选择的菜单命令,执行相关操作。 + +#### init + +系统初始化。 + +#### display_menu + +显示菜单命令。 + + +## 详细设计 + +针对概要设计 + +#### main + +Step 1: 初始化 +Step 2: 根据用户选择的命令执行对应的操作 +Step 2.1: 显示菜单 +Step 2.2: 选择菜单命令 c +Step 2.3: if c == CMD_READ then 读取数据 +Step 2.4: if c == CMD_SAVE then 保存数据 +Step 2.5: if c == CMD_PRINT then 打印数据 +Step 2.6: + + +![主程序流程图](main.svg) + + +#### save_data + +Step 1: 输入文件名 +Step 2: 打开文件 +Step 3: if 打开文件失败 then 提示打开文件失败并结束 +Step 4: 将所有库存记录写入文件 +Step 5: 关闭文件 + + +![保存数据流程图](picture-save.svg) + +#### add_data + +Step 1: if 数据库满 then 提示数据库满并结束 +Step 2: 输入图书编号 +Step 3: if 图书已存在 then 提示图书已存在并结束 +Step 4: 输入图书名和图书数量 +Step 5: 添加新图书到数据 +Step 6: 提示添加成功 + +![添加库存记录流程图](picture-add.svg) + + +### query_data +Step 1:提示输入图书编号,并输入编号 +Step 2:for i = 0 to num_parts开始查询 +Step 3:查询最后一个图书结束 +Step 4:if未查询到提示图书不存在 +Step 5:else打印图书信息 + +![查询流程图](query_data.svg) + + +### printf_data +Step 1:打印图书编号和图书名 +Step 2:for i = 1 to num_parts +Step 3:打印借阅次数 + +![打印记录流程图](printf_data.svg) + +#### update_data +Step 1:输入图书编号 +Step 2:查找图书是否已录入 +Step 3:if 不存在then 直接退出 +Step 4:else 输出图书信息 +![修改学生信息](pictureupdata.svg) + +#### delete_data + +Step 1: 输入图书编号 +Step 2: 查找图书所在的位置 +Step 3: if 没有该图书then 则输出图书不存在 +Step 4: 将查找到的图书后面的依次往前移动信息 +Step 5: 将图书总数减一 +Step 6: 提示删除成功 +![打印记录流程图](deletesortupdate.svg) + + +#### sort_data + +Step 1: 进行冒泡排序 +Step 2: 将按图书借阅次数排序,若前面的比后面的大,则交换 +Step 3: 每次遍历记录是否交换,若没有交换,则排序结束 +Step 4: 若借阅次数相同,则按照编号从小到大排序 +![打印记录流程图](sort1.svg) + + +#### read_data +Step 1:输入文件名 +Step 2:查看输入的文件名是否和已有的文化相匹配 +Step 3:若匹配成功,则打开文件 +Step 4:若不成功,则返回错误值 +Step 5:打开后利用循环,依次输出文件里各个图书信息; +Step 6:关闭文件 +![读取流程图](read_data.svg) + + +#### make_chart +Step 1:打印表头 +Step 2:循环打印图书名和图书编号 +Step 3:循环套循环打印图表 +Step 4:打印结束后换行继续循环 +Step 5:打印成功 +![读取流程图](make_chart.svg) +