# 图书馆管理系统
## 一、功能需求分析
本项目主要构建了一个图书馆管理系统。根据需求,我们可以确定系统主要有两种用户:管理员和读者。
系统总体的功能要实现用户的登陆,记录用户相关行为信息。
管理员方面需要实现的功能有 1.添加注册新读者;2.查看读者信息并决定是否对读者进行禁言;3.查看图书信息;4.采编图书入库;5.下架图书。
读者方面实现的功能有 1.借书;2.还书;3.对归还的书进行评论;4.查看图书评论。
针对这些不同特点的需求,本系统主要通过面向对象编程方法实现。
## 二、总体设计
### 1.开发环境
首先对于本次开发的开发环境,本人使用的是 minGW 的 g++ 编译器,开发工具为 cmake 和 vscode。
文件结构如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/26/90d28f3a59047e1441639d73c93c4085.writebug)
其中 data 文件夹用于存储数据,inc 文件夹为所包含自定义头文件,src 文件夹为 cpp 源文件。
### 2.关键类及其功能设计
类家族以及各种类组合的总体设计如下:
![](https://www.writebug.com/myres/static/uploads/2021/10/26/aba82d42b7caddd3f7a15c4a33ed96f7.writebug)
每个用户(user)有 4 个的属性:id, name, password, table,分别表示用户的登陆账号,姓名,密码和图书索引表。同时根据用户的共性,定义如上图所示的 3 个虚方法。根据登陆的用户和不同,用户有 2 个派生子类读者(reader)和管理员(admin)。根据读者和用户的不同行为,对基类的虚方法进行复写,同时定义了其自身的属性和方法。
在进行系统之前,读者的登陆是直接采用固定账号密码登陆,即直接在文件中读取读者的账号密码信息进行匹配;管理员的登陆为动态密码登陆,管理员的账号固定为 961017025,而其登陆密码为动态生成的,并发送到邮箱,登陆时需要在邮箱查看动态验证码。
管理员进入系统后可选择的功能有 1.增加新读者,即向 readers.txt 文件中增加一条数据; 2.查看读者信息并选择是否对读者禁言处理,即读取 readers.txt 文件中数据并修改在写回文件;3.查看图书信息,即读取 book_data.txt 文件中的数据并展示; 4.采编入库,即根据图书编号查找 book_data.txt 文件中的数据,决定是否增加新的一条数据或修改原有数据;5.下架图书,根据图书编号查找 book_data.txt 文件中的数据,决定是否删除一条数据或修改原有数据。根据用户的选择调用 admin 类中相应的函数实现。
读者进入系统后可选择的功能有 1.借书,即把学生对应的借书记录存储到 borrow_list 文件夹中。 2.还书,即查看 borrow_list 文件夹中对应文件数据,并选择删除其中一条记录。3.查看图书评论,即查看 comments 文件夹中的评论数据。根据用户选择调用 reader 类中的相应函数实现。
采用这种设计方案能够将各个功能模块划分开来,保持各个模块之间相对独立,在模块内部操作不影响外部,能够有效保障系统的安全性、数据的完整性,同时也更容易维护。
### 3.数据结构设计
用户和图书的数据存储主要是通过基于数组的线性表来实现。对于图书数据,利用书号建立索引表,查找时对索引进行二分查找。假设索引表长度为 n,相比于线性查找的时间复杂度 O(n),二分查找的时间复杂度 O(log n)更小,提高了查找效率。查找之前要对索引表按索引进行排序,本系统采用快速排序实现。
索引设计:
![](https://www.writebug.com/myres/static/uploads/2021/10/26/1dd5fd8a049af251edd1e6cce8a4ad09.writebug)
二分查找设计实现:
```c
Index*IndexTable::binSearch( intid )
{
intlow = 0;
inthigh = number - 1;
intmid;
while ( low <= high )
{
mid = (low + high) / 2;
intval = data[mid].getID();
if ( id == val )
return(&data[mid]);
elseif( id < val ) high = mid - 1;
elseif( id > val ) low = mid + 1;
}
returnNULL;
}
```
快速排序设计实现:
```c
voidIndexTable::quickSort( intlow, inthigh )
{
int i = low;
int j = high;
Index midEle = data[low];
int key = midEle.getID();
if ( i < j )
{
while ( i < j )
{
while ( i < j && data[j].getID() >= key )
j--;
data[i] = data[j];
while ( i < j && data[i].getID() < key )
i++;
data[j] = data[i];
}
data[i] = midEle;
quickSort( low, i - 1 );
quickSort( i + 1, high );
}
}
```
对于用户做出的评论,本系统会进行敏感词过滤,主要通过前缀树算法实现,即根据敏感词表构建一颗前缀树,进行过滤匹配时,利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率大大提高。
前缀树有以下特点:1.根节点不包含字符,除根节点外每一个节点都只包含一个字符; 2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 3.每个节点的所有子节点包含的字符都不相同。
利用前缀树匹配字符串的方法为:1.从根结点开始一次搜索;2.取得要查找关键词的第一个字符,并根据该字符选择对应的子树并转到该子树继续进行检索;3.在相应的子树上,取得要查找关键词的第二个字符,并进一步选择对应的子树进行检索。4.迭代以上过程;5.在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。具体实现在下一部分展示。
## 三、详细设计与程序实现
本程序主要用到的类为Email、Index、IndexTable、SensitiveWords、user、admin、reader,主要用到的结构体为Book、reader_data, Comment。它们的原型如下:
```c
class Email {
private:
char sendBuf[BUFSIZ], recBuf[BUFSIZ], recMail[BUFSIZ], subject[BUFSIZ], content[BUFSIZ],
sendMail[BUFSIZ], pass[BUFSIZ];
char *pstr = NULL;
const char *host = "smtp.163.com";
int port = 25;
SOCKET sock;
char dppsw[20];
public:
void disconnect(SOCKET sock);
void sendMsg(SOCKET sock, char *msg);
void recMsg(SOCKET sock);
void setDppsw(int code);
int getDppsw();
char* base64_encode(const char *data, int len);
SOCKET connectServer(const char *host, int port);
void sendTo();
Email(const char *);
};
class Index
{
private:
int ID;
Book *data;
public:
Index();
Index(int id, char *na, char* au, int cur, int inv);
void addStorage(int num); // 采编入库
bool borrow(); // 借阅
void giveBack(); // 归还
int getID(); // 查看书号
Book* getData(); // 查看数据
~Index();
};
class IndexTable
{
private:
int number; // 图书种类数量
Index data[maxTableLen]; // 索引表
public:
IndexTable();
int getNum(); // 返回图书种类数量
Index* getData(); // 返回索引表
void quickSort(int low, int high); // 对索引表从小到大排序
void sort(); // 封装排序函数
Index* binSearch(int id); // 在索引表上二分查找
bool insert(Index *e); // 插入数据
bool del(int book_id); // 删除数据
void getIndexTableData(); // 从文件中读取图书数据
void saveIndexTableData(); // 将索引表数据保存到文件
~IndexTable();
};
class SensitiveWords {
private:
struct Node {
char data;
bool last;
Node *sibling;
Node *next;
};
public:
SensitiveWords();
void getWor
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现的(控制台)图书馆管理系统【100012896】
共76个文件
txt:11个
json:9个
cmake:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 150 浏览量
2023-07-01
10:22:30
上传
评论
收藏 2.34MB ZIP 举报
温馨提示
本项目主要构建了一个图书馆管理系统。根据需求,我们可以确定系统主要有两种用户:管理员和读者。 系统总体的功能要实现用户的登陆,记录用户相关行为信息。 管理员方面需要实现的功能有 1.添加注册新读者;2.查看读者信息并决定是否对读者进行禁言;3.查看图书信息;4.采编图书入库;5.下架图书。 读者方面实现的功能有 1.借书;2.还书;3.对归还的书进行评论;4.查看图书评论。 针对这些不同特点的需求,本系统主要通过面向对象编程方法实现。
资源推荐
资源详情
资源评论
收起资源包目录
100012896-基于C++实现的(控制台)图书馆管理系统.zip (76个子文件)
library
inc
IndexTable.h 604B
SensitiveWords.h 501B
user.h 2KB
Book.h 548B
Index.h 325B
Email.h 647B
CMakeLists.txt 540B
.vscode
c_cpp_properties.json 365B
settings.json 1KB
launch.json 751B
src
Sensitive_Word.cpp 4KB
Email.cpp 4KB
user.cpp 1KB
admin.cpp 6KB
main.cpp 3KB
IndexTable.cpp 3KB
Index.cpp 678B
reader.cpp 8KB
data
keyword.txt 11KB
readers.txt 138B
comments
1.txt 28B
2.txt 15B
8.txt 16B
book_data.txt 245B
borrow_list
40401.txt 0B
LICENSE 1KB
build
CMakeFiles
Makefile2 3KB
CMakeDirectoryInformation.cmake 657B
cmake.check_cache 85B
Makefile.cmake 3KB
progress.marks 2B
CMakeOutput.log 66KB
Library_System.dir
includes_CXX.rsp 45B
CXX.includecache 389B
objects.a 1.19MB
link.txt 480B
src
main.cpp.obj 102KB
Sensitive_Word.cpp.obj 236KB
Index.cpp.obj 101KB
Email.cpp.obj 217KB
IndexTable.cpp.obj 110KB
user.cpp.obj 108KB
admin.cpp.obj 168KB
reader.cpp.obj 163KB
depend.internal 935B
linklibs.rsp 107B
objects1.rsp 397B
depend.make 663B
flags.make 254B
DependInfo.cmake 2KB
cmake_clean.cmake 734B
build.make 15KB
progress.make 190B
3.15.0-rc3
CMakeRCCompiler.cmake 230B
CompilerIdC
CMakeCCompilerId.c 20KB
a.exe 53KB
CMakeDetermineCompilerABI_CXX.bin 53KB
CMakeCXXCompiler.cmake 5KB
CMakeSystem.cmake 380B
CMakeCCompiler.cmake 3KB
CMakeDetermineCompilerABI_C.bin 53KB
CompilerIdCXX
CMakeCXXCompilerId.cpp 19KB
a.exe 53KB
TargetDirectories.txt 217B
cmake_install.cmake 1KB
Makefile 11KB
compile_commands.json 3KB
bin
Library_System.exe 1.08MB
CMakeCache.txt 15KB
.cmake
api
v1
reply
cache-v2-5c6d456619f36967056f.json 23KB
target-Library_System-Debug-1c7aba36d8fbcc061402.json 3KB
codemodel-v2-b293013da603120de800.json 907B
index-2020-02-18T09-26-43-0184.json 1KB
query
client-vscode
query.json 76B
报告书.doc 1.53MB
README.md 43KB
共 76 条
- 1
资源评论
神仙别闹
- 粉丝: 2674
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现用有限元法计算电磁场的Matlab工具 .rar
- 基于matlab实现有限元算法 计算电磁场问题 边界条件包括第一类边界和第二类边界.rar
- 基于matlab实现用于计算不同车重下的电动汽车动力性和经济性.rar
- 基于matlab实现遗传算法求解多车场车辆路径问题 有多组算例可以用.rar
- 浏览器.apk
- 基于matlab实现是一个matlab中的power system 中搭建的一个模型
- 基于JSP毕业设计-教学管理系统(源代码+论文).zip
- 基于JSP毕业设计-家政管理系统-毕业设计.zip
- 基于Python实现淘宝商品评论采集(含逆向)源代码
- 基于matlab实现多目标进化算法NSGAⅡ&Matlab讲解.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功