题目要求
编写一个程序模拟图书管理系统。用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择。读者菜单包括借书、还书、查询等功能。管理员菜单包括图书和读者信息录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。
命令行参数如下: Libsim –a(-u) xxxx
第一个参数为可执行程序名称;第二个参数为用户身份,-a 表示管理员,-u 表示读者;第三个参数为用户名
涉及知识点
涉及知识点:文件读写、内存管理、结构体定义、基本数据结构、高级格式化输入输出
问题分析
问题要求模拟一个图书馆管理系统,要考虑的细节问题很多,但最主要的问题在于:
- 文档中需要存储哪些关于图书馆的信息?怎么组织这些信息?
- 如何将文档中的信息录入程序处理并将程序处理后的信息重新录入原来的文档?
- 在程序该如何处理这些数据达到以下功能
读者:
借阅图书
归还图书
查询图书信息
查看借阅信息
管理员:
录入图书信息
录入读者信息
修改图书信息
修改读者信息
删除图书信息
删除图书信息
查询图书信息
查看读者信息 - 如何实现管理系统与使用者的交互?
- 除了上述题目要求的功能,还需要加入哪些功能来让管理系统更加完善?
解决方案(思路)
- .建立四个 txt 文档(administratorlist.txt,booklist.txt,bookborrowedlist.txt,readerlist.txt)
四个文档的内容为:
administratorlist.txt: 管理员的编号 + 管理员的姓名 + 管理员的密码
booklist.txt: 图书的编号 + 图书的名字 + 馆藏数量
bookborrowedlist.txt: 出借的图书名字 + 借书的读者姓名
readerlist.txt: 读者的编号 + 读者的姓名 + 读者的密码 - 建立三种结构体
reader结构体: 内部成员为读者的编号 number,读者的名字 name,读者的密码,读者借阅的图书数量 bookborrowedsum,读者借阅的图书 bookborrowed (为一个二维字符数组)。
book 结构体: 内部成员为图书的编号 number,图书的名字 name,该图书馆藏数量 totalnumber,已出借数量。
Administrator 结构体: 内部为管理员的编号 number,管理员的名字 name,管理员的密码。
建立三个对应的结构体数组 reader_list、book_list、administrator_list。
建立三个全局变量 booksum、readersum、administratorsum 记录操作中随时会发生变动的馆藏书种类数、读者总数、管理员总数为后续的数组遍历所用。
在程序的开始把文件内容解析读入对应的结构体数组,管理系统的一系列操作都针对结构体数组的内容进行改写。所有操作结束后再一次性将结构体的内容写入文件同时退出系统。 - 通过打印出菜单实现和用户的交互,用户按下数字就会调用相关函数完成菜单上所提示的对应功能。
- 可以增加容错机制来尽量避免因为输入的问题而造成程序崩溃以增加代码的健壮性。
*登录和验证功能
题目没有要求验证用户的身份和密码,但是为了更完善程序要根据用户输入的命令行参数确定是哪个用户,通过验证用户输入的密码是否等于文件中保存的该用户的密码,若不相等则直接退出。可以增加用户注册模块。还可以增加用户修改密码模块。
*读者附加功能
显示自己目前借阅的书目和借阅的图书数量,还可以显示借阅日期(可选)
*管理员附加功能
查看所有的书目信息和所有读者的信息
算法分析
程序开始后调用不同的 load 函数初始化结构体数组并将 txt 文档内的信息读入结构体数组。
之后根据命令行参数要求进行用户身份验证,密码正确则根据用户的身份弹出管理员界面或读者界面,根据菜单栏提示键入操作对应的数字实现交互。所有操作结束后输入 0 退出图书管理系统并调用不同的 save 函数遍历结构体数组将结构体数组的数据写入 txt 文档。
在操作过程中键入数字后会调用相应的函数,各个操作对应的函数机理如下,每个函数基本都是遍历和修改数组操作,相对比较简单,故不仔细进行说明。
读者
- 0->退出循环,结束程序
- 1->借阅图书
一开始要求输入想要借阅的图书的名字,然后遍历若读者借阅的书总数超过 10本则输出提示信息并终止操作。否则若找不到书则输出提示信息,若找到时发现此时馆藏库存为 0 同样输出提示信息,若发现该读者已经借阅过该书同样不能借阅。否则完成借阅操作。 - 2->归还图书
一开始要求输入想要归还的图书的名字。若发现要归还的书不属于馆藏书目则输出提示信息,否则完成归还操作。 - 3->查询图书信息
要求输入数字选择采用名字还是编号的方式查询图书信息。根据输入的数字遍历数组,若找不到图书则输出提示信息,否则输出馆藏总数和已借出数量。 - 4->查看借阅信息
遍历数组找到自己对应的单元输出借阅的图书数量和借阅的书目,输出后按任意键可以实现清屏操作并重新显示读者菜单。
管理员
- 1->录入图书信息
要求输入新书的编号、名字、馆藏总数和已借出数量。遍历数组发现编号和名字重复则输出提示信息阻止操作继续进行。否则添加新元素。 - 2->录入读者信息
要求输入读者的编号、名字、密码。遍历数组发现编号和名字重复则输出提示信息阻止操作继续进行。否则添加新元素。 - 3->修改图书信息
要求输入图书编号,寻找对应图书。若找不到就输出提示信息,若找到则输出该书的信息并重新输入图书的馆藏总数和已借出数量。 - 4->修改读者信息
要求输入读者编号,遍历 reader_list 寻找对应读者。若找不到就输出提示信息,若找到则输出该读者的信息并要求重新输入该读者借阅的图书总数,根据该总数要求依次输入读者借阅的图书,若发现输入的图书不属于馆藏书目则输出提示信息强制要求重新输入。 - 5->删除图书信息
要求输入要删除的图书编号,遍历数组进行删除。若发现这本书存在外借未归还的现象则输出提示信息表示无法删除,若找不到这本书同样要输出提示信息。 - 6->删除读者信息
要求输入要删除的读者编号,遍历数组进行删除操作。若发现该读者存在未归还图书的现象则输出提示信息表示无法删除,若找不到该读者同样输出提示信息。 - 7->查询图书信息
要求输入数字选择采用名字还是编号的方式查询图书信息。根据输入的数字遍历数组,若找不到图书则输出提示信息,否则输出馆藏总数、已借出数量和借阅的读者编号。 - 8->查看读者信息
遍历数组输出要查看的读者信息,包括该读者的编号、用户名、借阅的图书数量和借阅的书目。输出后按任意键可以实现清屏操作并重新显示管理员菜单。
具体代码
因为csdn没有办法直接穿附件上来,所以我把整个代码上传到“资源”区了
下附下载链接:简单文件数据库-模拟图书馆管理系统
具体上级报告如有需要可以私信我。
水平有限,欢迎指正。