100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 用户友好图书信息管理系统

用户友好图书信息管理系统

时间:2020-06-27 19:29:03

相关推荐

用户友好图书信息管理系统

图书信息管理系统实验报告

一、实验摘要

实现一个图书信息管理系统,实现的功能有采编、查询和借阅、还书与续借、书目删除、以及管理员直接操作数据库的模式。本程序的几处特色是处理输入不符合规范的字符(串)、代码重用、数据即时更新、根据当前窗口状态将主窗口与其它窗口的并行输出、操作的可撤回性和连惯性,以及数据库的保护隐藏。

二、实验平台

机型:ThinkPad E465 | 系统:Win10 | 软件:记事本、cmd | 编译环境:G++

三、实验目的

1、通过构造数据库加深对数据结构的认识,主要是自定义类与结构体的实现使用。2、加深对数据遍历方式的认识,这里主要用到了线性遍历。3、掌握线性表的优化,如存储空间上的优化、查找性能上的优化等。

四、实验原理

总体来看,本程序采用自顶向下的设计方法,先确定管理系统的大致框架,即一个主窗口加上采编、查询和借阅、还书与续借、书目删除、以及管理员直接操作数据库的模式的窗口,再实现各窗口的布局和功能,最后定义一个Database类以及相关全局变量逐个实现这些功能。Database类中包括自定义的书籍结构体数组用于存放书籍名称、作者、出版社、借阅情况等信息,以及辅助变量记录书本书目数量、书本总量、书本剩余量等,类的方法实现了如上所述功能,此外还有一些用于判断状态、选择相应选项的全局变量,在后面解释各个函数的功能时会一一介绍。在数据库的安全方面。本系统的数据库文件采用了NTFS文件流加密,即只能通过本系统访问这个数据库,从系统外部不能轻易打开并修改数据库文件内的重要数据(当然,如果懂得相关技术可以将此文件解密出来进行修改)。把数据库打包成压缩文件时需在“高级”选项中勾选“保存文件流数据”才能保证数据库的完整。这样提高了数据库的安全性。此外,在每个功能结束后即时重写数据库文件,更新数据库,避免系统突发故障中止时丢失数据。根据窗口状态来输出各个窗口。这里将各个功能窗口用各个函数实现(包括主窗口),用一个while(now != m_exit){…}循环无限执行判断窗口状态(now)的命令,再根据now的值调用各个窗口的函数,该循环是系统的核心。当然,当窗口状态now被标记为m_exit时,退出该循环,即意味着退出系统。通过状态判断来输出各个窗口有一个好处,那就是可以方便地在各个窗口间调换:当从一个窗口退出时,根据选择将窗口状态now设置为其他窗口的状态,只要该状态不是m_exit,就可以在main()中下一轮循环中执行相应的窗口。一般由主窗口跳到其他窗口的选择是最多的,而其他窗口在结束时将窗口状态now标记为main_w以返回主窗口,也有标记成m_exit的情况以直接退出系统。代码重用。本程序中大量重复的多选项的选择操作(在0,1,2,…,n中选择)、Yes/No选择,与即时保存数据库文件等操作各只用一个函数实现,在需要的时候调用这些函数;比如多项操作选择函数,先在Database.h头文件中定义void MyChoice(int csmall, int cbig);其中csmall 是选项容许的最小值,cbig是选项容许的最大值,当用户的选项超出最小值到最大值的范围时,就会处理这个错误的输入,这样就可以根据每个窗口中列出的选项灵活地使用该函数来选择,再根据全局变量中的mychoice变量(在本函数中的选择结果保存在此变量中)来运行相应选项对应的函数。在编写程序时考虑代码重用带来了巨大的便利,让我把更多的精力投入到其他函数的设计上。非法输入的处理是本系统的一大特色。本系统对于不符合规范的输入有过滤和重新输入两种处理方式。当一次输入带有空格的内容时,一般会把空格后的的内容当成下一次输入,造成不可测的混乱,于是在每次输入后采用guolv()这个函数进行过滤,原理是

while(std::cin.get() != ‘\n’);

将第一个空格后到回车之间的输入都过滤掉了。Guolv()函数的重用率也是非常高的。除了过滤之外,选择选项(0,1,2,…,n或者[Y/N])时对于不符合选项的输入采取了提示重新输入的办法,这样做的基础是将输入当成是一个std::string类的输入,再对该std::string变量进行合法性分析。非法输入的处理健壮了程序,使用户只能按规定输入,避免不可知的错误。操作的可撤回性与连惯性是本系统的一大特色。

在设计上实现进行了下述功能,使得几乎在任何时刻都可以即时返回与撤销操作:

在采编未将书名、作者、出版社都没有输入完毕时,可通过输入exit返回主窗口;在借阅书籍、归还、续借、逐本删除时均可输入0撤消当前操作;在逐本删除功能结束后会提示是否保存,选择不保存就相当于没有进行删除操作;在进行一些重要操作时会提示是否进行该操作。

如此,使人为操作造成的失误可即时撤回,提高操作的安全性。在操作的连惯性方面,有如下设计:

在有可能需要连续操作的功能中引入循环,通过判断是否继续(Yes_or_Not())来决定下一步是退出该功能还是继续该功能,如可以继续查询、继续借阅、继续归还、继续续借、继续删除……将查询与借阅功能归并,在查询后提供“借阅”的选项,用户选择该选项即可马上借阅搜寻到的书籍;大部分窗口和功能中都有“返回主菜单”或“退出”的选项,使用户无需一步一步返回上一级再进行其他选项或退出,一步直达。

如此,提高了系统的用户友好程度,更加方便用户使用。管理员模式[*]。管理员模式下可以直接操作数据库文件,即把数据库文件打开,直接修改其中的数据,这个也只有管理员才看得懂了。打开之前需输入管理员密码,关闭数据库文件后提示“数据库已改变,是否重新载入?”,这么做也是减小修改失误带来的风险。输入密码也是删除书目[*]和清空数据库[*]这两个重要功能的必经之路。

五、实验内容

非法输入的纠正:当输入非指定选项时提示重新输入

带空格输入的过滤:只认定第一个输入是有效的

这里输入了一串从1-10的选项,但只有第一项是有效的,所以选择了第一项“采编”,如下图。

功能的连惯性:执行功能后提示是否继续

功能的可撤消性:

输入0返回:如下图,不小心进入了借阅选项后可以输入0返回

删除书目的可撤消性:如下图,在误删书目后,可以选择不保存来撤消之前的删除操作

从系统外部打开数据库文件:不显示数据库内容。(若想打开,需在cmd下用

notepad database.dat:data.txt

此命令打开)

主窗口:与其他窗口同级,只是使用率大。

采编:当输错了书籍信息时,可通过即时输入exit返回(注意最迟是在输入出版社名称时可撤回,到了之后选择书籍类别就不能撤回了)

查询:查询成功之后会显示书目的详细信息,包括书名、作者、出版社、借阅情况等

书名是模糊查找方式:如下图,按书名查找,输入“自然”二字可以查找到《自然哲学中的数学原理》一书,此外书名、作者、出版社查询均不区分大小写

按类别查找:可通过输入相应书目类别的序号进行查找,注意最多只能显示10本相应的书目

借阅:在查询操作之后,选择2即可借阅,也可继续查询、返回主界面或者退出等

还书:需要输入借阅者姓名,之后按本显示读者的借阅情况,在输入显示的书目序号之后,该书籍即被归还(在该书籍下方会显示“已归还”),之后提示是否继续归还,输入0也可退出归还

续借:与归还类似,需要输入读者的姓名,之后列出读者所有借阅过的书籍,通过输入书籍的序号对相应书籍进行续借,续借后可选择是否继续续借

删除:

按本删除:在输入管理员密码密码列出了所有

清空数据库:像这种重要的操作,首先提示是否继续,再输入管理员密码,如果密码错误,则可输入exit返回

管理员模式:输入管理员密码,打开数据库文件,可在此文件中修改管理员密码,在此模式下一定要谨慎修改内容,防止数据被改得不完整而造成重新载入时系统崩溃

在关闭数据库文件时,系统提示是否重新载入信息,若不重新载入,则之前的修改作废,数据库仍然为修改前的内容

若重新载入,则提示是否继续,若选择退出,可直接退出系统,否则返回主菜单

代码重用:下述代码(函数)的重用率极高

void MyChoice(int csmall, int cbig);//选择选项,修改的全局变量:mychoicevoid guolv(); //每次输入后,过滤空格后的输入void Yes_or_Not();//多用在是否继续的判断上,全局变量:yesvoid Database::saveNoneWord();//各种操作后即时将数据保存至数据库

六、实验总结

本实验最大的体会是自顶向下设计的设计方式,首先明确各个功能,再明确各个功能的函数实现,由总体规划(各个窗口的显示、转换)到各个细节的实现(各个功能用类,函数来实现)。在细节上采用代码重用使设计更加简洁高效。

学会了使程序输入更加健壮的做法。通过过滤、判断std::string类输入是否符合规范来纠正输入错误。一系列用户友好设计,连惯性、可即时撤回性的实现,让用户使用起来更加方便。

在时间复杂度方面,主要体现在查找书籍方面,在查找书籍上使用线性探索,时间复杂度为O(N),空间复杂度为O(1)。储存上的复杂度为O(M),M为总书本数量。

七、参考文献

C++string中用于查找的find系列函数浅析 - 同勉共进 - 博客园c++输入隐藏密码的实现 - CSDN博客C++中如何用cout实现输出的填充,宽度,对齐及其精度控制 - PrConstantin - CSDN博客NTFS交换数据流隐写的应用 - Chesky - 博客园string::find - C++ Reference隐写NTFS STREAM - CSDN博客

八、代码

// Database.h#ifndef DATABASE_H_#define DATABASE_H_#include <string>#include <windows.h>#include <time.h>#include <conio.h>#define PWDLENTH 100#define MAX_NUM 200#define MAX_BOOK 100000#define PAUSETIME 1000#define FILEPATH "database.dat:data.txt"#define UNSECRET_PATH "database.dat"#define EXIT "exit"#define TYPE_NUM 12#define FIND_TYPE 10#define DEFAULT_PASSWORD "12345678"typedef struct kuChun{bool used;std::string reader;int year, month, day;}kuChun;typedef struct Book{std::string name;std::string writer;std::string company;int type;int ku_num;int left;kuChun ku[MAX_NUM];}Book;typedef struct Record{int book_no;int ku_no;}Record;class Database{private:Book book[MAX_BOOK];int book_num;int book_all;int book_left;void delayThirty(int, int);Record book_record[MAX_NUM];int record;public:int getBook_num();int getBook_all();int getBook_left();int find_add[MAX_BOOK];int find_num;void Initial();void addBook();void saveData();void saveNoneWord();void borrowBook();void backBook();void delayBook();void find_name();void find_writer();void find_company();void find_n_w();void find_n_c();void find_w_c();void find_n_w_c();void find_type();void clear();void clear_all();void showInfo(int);void showRecord(int, int);};void jiXu();void jiXu_find();void jiXuChoice(int, int);void MyChoice(int, int);void guolv();void Yes_or_Not();void inputPwd(std::string &, int);std::string trans(std::string);std::string yes;Database data;int mychoice;int jixu_choice;enum state{mainw, find_borrow, add, del, back_delay, m_exit, admin};state now;enum find_state{finding, f_exit};find_state now_find;enum back_state{backing, b_exit};back_state now_back;enum del_state{deling, d_exit};del_state now_del;std::string types[TYPE_NUM] = {"[1.科学百科]", "[2.历史文献]", "[3.小说 ]", "[4.期刊报纸]","[5.计算机 ]", "[6.数理 ]", "[7.哲学 ]", "[8.天文 ]","[9.机械 ]", "[10.经济 ]", "[11.语言 ]", "[12.其它 ]"};SYSTEMTIME st = {0};std::string add_name;std::string add_writer;std::string add_company;std::string PASSWORD;#endif // DATABASE_H_

// Database.cpp#include "Database.h"#include <iostream>#include <fstream>#include <cstdlib>int Database::getBook_num(){return book_num;}int Database::getBook_all(){return book_all;}int Database::getBook_left(){return book_left;}std::string trans(std::string origin){for (int i = 0; i < origin.length(); i ++)if (origin[i] >= 'a' && origin[i] <= 'z')origin[i] -= 'a' - 'A';return origin;}void guolv(){while (std::cin.get() != '\n');}void MyChoice(int csmall, int cbig){std::string str;while(std::cin >> str){guolv(); bool not_num = false; mychoice = 0;for (int i = 0; i < str.length(); i ++){if (str[i] < '0' || str[i] > '9') {not_num = true; break;}mychoice = mychoice * 10 + str[i] - '0';}if (not_num || mychoice < csmall || mychoice > cbig){std::cout << str << ":无效的选项!\n";std::cout << "请重新输入:";}else break;}}void jiXuChoice(int csmall, int cbig){std::string str;while(std::cin >> str){guolv();jixu_choice = str[0] - '0';if (str.length() != 1 || jixu_choice < csmall || jixu_choice > cbig){std::cout << str << ":无效的选项!\n";std::cout << "请重新输入:";}else break;}}void jiXu(){std::cout << "继续采编?[1.继续 2.返回主界面 3.退出]\n";jiXuChoice(1, 3);switch(jixu_choice){case 1: break;case 2: now = mainw; break;case 3: now = m_exit; break;}}void jiXu_find(){std::cout << "[1.继续查询 2.借阅 3.返回主界面 4.退出]\n";jiXuChoice(1, 4);switch(jixu_choice){case 1: break;case 2: data.borrowBook(); break;case 3: now_find = f_exit; now = mainw; break;case 4: now_find = f_exit; now = m_exit; break;}}void Database::Initial(){system("cls");std::ifstream infile;infile.open(FILEPATH, std::ios::in);if (!infile.is_open()){infile.close();std::cout << "找不到数据库文件!\n";std::cout << "是否创建新的数据库?[Y/N]\n";std::string yes;while (std::cin >> yes){guolv();if (yes == "Y" || yes == "y"){PASSWORD = DEFAULT_PASSWORD;book_num = 0;book_left = 0;book_all = 0;saveNoneWord();return;}else if (yes == "N" || yes == "n"){std::cout << "已退出!\n";now = m_exit;return;}else {std::cout << "请输入Y[y]或者N[n]!\n";}}}infile >> PASSWORD;infile >> book_num >> book_all >> book_left;std::cout << "正在载入。。。。。。\n";for (int i = 0; i < book_num; i ++){infile >> book[i].name >> book[i].writer >> book[i].company;infile >> book[i].type >> book[i].ku_num >> book[i].left;for (int j = 0; j < book[i].ku_num; j ++){infile >> book[i].ku[j].used>> book[i].ku[j].reader>> book[i].ku[j].year>> book[i].ku[j].month>> book[i].ku[j].day;}}Sleep(PAUSETIME);std::cout << "成功载入!";now = mainw;infile.close();}void Database::addBook(){std::cout << "(输入" << EXIT << "返回)\n";std::cout << "请输入书名:";std::cin >> add_name; guolv();if (add_name == EXIT) return;std::cout << "请输入作者名:";std::cin >> add_writer; guolv();if (add_writer == EXIT) return;std::cout << "请输入出版社名:";std::cin >> add_company; guolv();if (add_company == EXIT) return;int i;for (i = 0; i < book_num; i ++){if (book[i].name == add_name&& book[i].writer == add_writer&& book[i].company == add_company){std::cout << "该书已有" << book[i].ku_num << "本,还可添加" << MAX_NUM - book[i].ku_num << "本。\n";std::cout << "请输入添加的本数(1--" << MAX_NUM - book[i].ku_num << "本):";MyChoice(1, MAX_NUM - book[i].ku_num);for (int j = 0; j < mychoice; j ++){book[i].ku[book[i].ku_num].used = false;book[i].ku[book[i].ku_num].reader = 'N';book[i].ku[book[i].ku_num].year = 0;book[i].ku[book[i].ku_num].month = 0;book[i].ku[book[i].ku_num].day = 0;}book[i].ku_num += mychoice;book[i].left += mychoice;book_left += mychoice;book_all += mychoice;break;}}if (i == book_num){std::cout << '\n';for (int j = 0; j < TYPE_NUM; j ++){std::cout << types[j];if ((j + 1) % 4 == 0)std::cout << '\n';}std::cout << "请选择文献类别:\n";MyChoice(1, TYPE_NUM); mychoice --;book[i].name = add_name;book[i].writer = add_writer;book[i].company = add_company;book[i].type = mychoice;std::cout << "请输入添加的本数(1-" << MAX_NUM << "本):";MyChoice(1, MAX_NUM);book[i].ku_num = book[i].left = mychoice;for (int j = 0; j < mychoice; j ++){book[i].ku[j].used = false;book[i].ku[j].reader = 'N';book[i].ku[j].year = 0;book[i].ku[j].month = 0;book[i].ku[j].day = 0;}book_left += mychoice;book_all += mychoice;book_num ++;}std::cout << "添加成功!\n";}void Database::saveData(){system("cls");std::cout << "正在保存。。。。。。\n";saveNoneWord();Sleep(PAUSETIME);std::cout << "成功退出!";system("cls");}void Database::saveNoneWord(){std::ofstream outfile;outfile.open(UNSECRET_PATH, std::ios::out);GetLocalTime(&st);system("cls");outfile << "**************************\n";outfile << "*****图书信息管理系统*****\n";outfile << "**************************\n";outfile << "** 数据库文件**\n";outfile << "**************************\n";outfile << "上次保存于:" << st.wYear << '/' << st.wMonth << '/' << st.wDay << '\n';outfile << " ";std::string week; switch(st.wDayOfWeek){case 0: week = "周日"; break;case 1: week = "周一"; break;case 2: week = "周二"; break;case 3: week = "周三"; break;case 4: week = "周四"; break;case 5: week = "周五"; break;case 6: week = "周六"; break;} outfile << week << ' ' << st.wHour << ':' << st.wMinute << ':' << st.wSecond;outfile.close();outfile.open(FILEPATH, std::ios::out);outfile << PASSWORD << '\n';outfile << book_num << '\n' << book_all << ' ' << book_left << '\n' << '\n';for (int i = 0; i < book_num; i ++){outfile << book[i].name << ' '<< book[i].writer << ' '<< book[i].company << '\n';outfile << book[i].type << ' ' << book[i].ku_num << ' ' << book[i].left << '\n';for (int j = 0; j < book[i].ku_num; j ++){outfile << book[i].ku[j].used << ' '<< book[i].ku[j].reader << ' '<< book[i].ku[j].year << ' '<< book[i].ku[j].month << ' '<< book[i].ku[j].day << '\n';}outfile << '\n';}outfile.close();}void Database::showInfo(int no){std::cout << " 书 名:" << "《" << book[no].name << "》" << '\n'<< " 作 者:" << book[no].writer << '\n'<< " 出版社:" << book[no].company << '\n'<< " 类 型:" << types[book[no].type] << '\n'<< " 库 存:" << book[no].left << " | "<< "已借阅数:" << book[no].ku_num - book[no].left << '\n';for (int i = 0; i < book[no].ku_num; i ++){if (book[no].ku[i].used){std::cout.setf(std::ios::left);std::cout << "\t借阅者:"; std::cout.width(20); std::cout << book[no].ku[i].reader;std::cout.unsetf(std::ios::left);std::cout << "归还期限:" << book[no].ku[i].year << '/'<< book[no].ku[i].month << '/'<< book[no].ku[i].day << '\n';}}std::cout << '\n';}void Database::find_name(){std::cout << "请输入书名:";std::string f_name; std::cin >> f_name;guolv();find_num = 0;for (int i = 0; i < book_num; i ++){std::size_t found = trans(book[i].name).find(trans(f_name));if (found != std::string::npos)find_add[find_num ++] = i;}}void Database::find_writer(){std::cout << "请输入作者名:";std::string f_writer; std::cin >> f_writer;guolv();find_num = 0;for (int i = 0; i < book_num; i ++){if (trans(f_writer) == trans(book[i].writer))find_add[find_num ++] = i;}}void Database::find_company(){std::cout << "请输入出版社名:";std::string f_company; std::cin >> f_company;guolv();find_num = 0;for (int i = 0; i < book_num; i ++){if (trans(f_company) == trans(book[i].company))find_add[find_num ++] = i;}}void Database::find_n_w(){std::cout << "请输入书名和作者名:";std::string f_name, f_writer; std::cin >> f_name >> f_writer;guolv();find_num = 0;for (int i = 0; i < book_num; i ++){std::size_t found = trans(book[i].name).find(trans(f_name));if (found != std::string::npos && trans(f_writer) == trans(book[i].writer))find_add[find_num ++] = i;}}void Database::find_n_c(){std::cout << "请输入书名和出版社:";std::string f_name, f_company; std::cin >> f_name >> f_company;guolv();find_num = 0;for (int i = 0; i < book_num; i ++){std::size_t found = trans(book[i].name).find(trans(f_name));if (found != std::string::npos && trans(f_company) == trans(book[i].company))find_add[find_num ++] = i;}}void Database::find_w_c(){std::cout << "请输入作者名和出版社:";std::string f_writer, f_company; std::cin >> f_writer >> f_company;guolv();find_num = 0;for (int i = 0; i < book_num; i ++){if (trans(f_writer) == trans(book[i].writer) && trans(f_company) == trans(book[i].company))find_add[find_num ++] = i;}}void Database::find_n_w_c(){std::cout << "请输入书名、作者名和出版社:";std::string f_name, f_writer, f_company; std::cin >> f_name >> f_writer >> f_company;guolv();find_num = 0;for (int i = 0; i < book_num; i ++){std::size_t found = trans(book[i].name).find(trans(f_name));if (found != std::string::npos && trans(f_writer) == trans(book[i].writer) && trans(f_company) == trans(book[i].company))find_add[find_num ++] = i;}}void Database::find_type(){std::cout << "\n\n";for (int i = 0; i < TYPE_NUM; i ++){std::cout << types[i];if ((i + 1) % 4 == 0) std::cout << '\n';} std::cout << "请输入类别序号(输入0返回):";MyChoice(0, TYPE_NUM); mychoice --;find_num = 0; if (mychoice == -1) return;for (int i = 0; i < book_num && find_num < FIND_TYPE; i ++){if (book[i].type == mychoice) find_add[find_num ++] = i;}}void Database::borrowBook(){if (find_num == 0){std::cout << "没有可供借阅的书籍!\n";std::cout << "按Enter返回。。。。。。";guolv();Sleep(PAUSETIME);return;}else {bool jixu = true;while(jixu){/************************************/int sum = 0;for (int i = 0; i < find_num; i ++){sum += book[find_add[i]].left;}if (sum == 0){std::cout << "所找书籍库存为零!\n";std::cout << "按Enter返回。。。。。。";guolv();Sleep(PAUSETIME);break;}/************************************/std::cout << "(输入0 返回)\n";std::cout << "请输入要借阅的序号:";MyChoice(0, find_num);mychoice --; if (mychoice == -1) break;if (book[find_add[mychoice]].left == 0){std::cout << "库存为零,无法借阅!继续借阅?[Y/N]\n";Yes_or_Not();if (yes == "N" || yes == "n") jixu = false;continue;}/************************************/std::cout << "请输入借阅者姓名:";std::string readername; std::cin >> readername; guolv();book[find_add[mychoice]].left --;GetLocalTime(&st);for (int i = 0; i < book[find_add[mychoice]].ku_num; i ++){if (!book[find_add[mychoice]].ku[i].used){book[find_add[mychoice]].ku[i].used = true;book[find_add[mychoice]].ku[i].year = st.wYear;book[find_add[mychoice]].ku[i].month = st.wMonth;book[find_add[mychoice]].ku[i].day = st.wDay;book[find_add[mychoice]].ku[i].reader = readername;delayThirty(find_add[mychoice], i);break;}}/************************************/system("cls");for (int i = 0; i < data.find_num; i ++){std::cout << "序号" << i + 1 << ":\n";data.showInfo(data.find_add[i]);}book_left --;std::cout << "借阅成功!是否继续借阅?[Y/N]\n";Yes_or_Not();if (yes == "N" || yes == "n") jixu = false;}}saveNoneWord();}void Database::delayThirty(int book_no, int ku_no){int max_day; int add_days = 30;while (add_days != 0) {if (book[book_no].ku[ku_no].month == 2){if ((book[book_no].ku[ku_no].year % 400 == 0) ||(book[book_no].ku[ku_no].year % 4 == 0 && book[book_no].ku[ku_no].year % 100 != 0))max_day = 29;else max_day = 28;}else if (book[book_no].ku[ku_no].month == 1 ||book[book_no].ku[ku_no].month == 3 ||book[book_no].ku[ku_no].month == 5 ||book[book_no].ku[ku_no].month == 7 ||book[book_no].ku[ku_no].month == 8 ||book[book_no].ku[ku_no].month == 10 ||book[book_no].ku[ku_no].month == 12 )max_day = 31;else max_day = 30;/************************************/if (add_days > max_day - book[book_no].ku[ku_no].day){add_days -= max_day - book[book_no].ku[ku_no].day;book[book_no].ku[ku_no].day = 0;book[book_no].ku[ku_no].month ++;if (book[book_no].ku[ku_no].month > 12){book[book_no].ku[ku_no].month = 1;book[book_no].ku[ku_no].year ++;}}else {book[book_no].ku[ku_no].day = add_days;add_days = 0;}}saveNoneWord();}void Yes_or_Not(){while (std::cin >> yes){guolv();if (yes != "Y" && yes != "y" && yes != "N" && yes != "n"){std::cout << "请输入Y[y]或者N[n]!\n";}else break;}}void inputPwd(std::string & str, int size){char c; int count = 0;char * password = new char[size];while ((c = getch()) != '\r'){if (c == 8){if (count == 0) continue;putchar('\b');putchar(' ');putchar('\b');count --;}if (count == size - 1) continue;if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')){putchar('*');password[count] = c;count ++;}}password[count] = '\0';str = password;std::cout << '\n';}void Database::backBook(){if (book_left == book_all){std::cout << "无任何借阅记录!按Enter继续。。。。。。";guolv();return;}bool jixu = true;while (jixu){std::cout << "请输入借阅者姓名:";std::string b_name; std::cin >> b_name; guolv();record = 0;for (int i = 0; i < book_num; i ++){for (int j = 0; j < book[i].ku_num; j ++){if (book[i].ku[j].used && book[i].ku[j].reader == b_name){book_record[record].book_no = i;book_record[record].ku_no = j;record ++;}}}if (record == 0){std::cout << "未查询到借阅信息,请保证正确输入您的姓名,是否继续?[Y/N]\n";Yes_or_Not();if (yes == "N" || yes == "n") jixu = false;continue;}system("cls");for (int i = 0; i < record; i ++){std::cout << "序号" << i + 1 << ":\n";showRecord(book_record[i].book_no, book_record[i].ku_no);std::cout << '\n';}bool jixuback = true;while(jixuback){std::cout << "(输入0 返回)\n";std::cout << "请输入要归还书籍的序号:";MyChoice(0, record);mychoice --; if (mychoice == -1) {jixu = false; break;}if (!book[book_record[mychoice].book_no].ku[book_record[mychoice].ku_no].used){std::cout << "此书已归还!\n";}else {book[book_record[mychoice].book_no].ku[book_record[mychoice].ku_no].used = false;book[book_record[mychoice].book_no].ku[book_record[mychoice].ku_no].reader = "N";book[book_record[mychoice].book_no].ku[book_record[mychoice].ku_no].year = 0;book[book_record[mychoice].book_no].ku[book_record[mychoice].ku_no].month = 0;book[book_record[mychoice].book_no].ku[book_record[mychoice].ku_no].day = 0;system("cls");for (int i = 0; i < record; i ++){std::cout << "序号" << i + 1 << ":\n";showRecord(book_record[i].book_no, book_record[i].ku_no);std::cout << '\n';}std::cout << "归还成功!\n";book[book_record[mychoice].book_no].left ++;book_left ++;}std::cout << "是否继续归还?[Y/N]";Yes_or_Not();if (yes == "N" || yes == "n") {jixuback = jixu = false;}}}saveNoneWord();}void Database::delayBook(){if (book_left == book_all){std::cout << "无任何借阅记录!按任意键继续。。。。。。";guolv();return;}bool jixu = true;while (jixu){std::cout << "请输入借阅者姓名:";std::string b_name; std::cin >> b_name; guolv();record = 0;for (int i = 0; i < book_num; i ++){for (int j = 0; j < book[i].ku_num; j ++){if (book[i].ku[j].used && book[i].ku[j].reader == b_name){book_record[record].book_no = i;book_record[record].ku_no = j;record ++;}}}if (record == 0){std::cout << "未查询到借阅信息,请保证正确输入您的姓名,是否继续?[Y/N]\n";Yes_or_Not();if (yes == "N" || yes == "n") jixu = false;continue;}system("cls");for (int i = 0; i < record; i ++){std::cout << "序号" << i + 1 << ":\n";showRecord(book_record[i].book_no, book_record[i].ku_no);std::cout << '\n';}bool jixujie = true;while(jixujie){std::cout << "(输入0 返回)\n";std::cout << "请输入要续借书籍的序号:";MyChoice(0, record);mychoice --; if (mychoice == -1) {jixu = false; break;}delayThirty(book_record[mychoice].book_no, book_record[mychoice].ku_no);std::cout << "正在处理。。。。。。";system("cls");for (int i = 0; i < record; i ++){std::cout << "序号" << i + 1 << ":\n";showRecord(book_record[i].book_no, book_record[i].ku_no);std::cout << '\n';}std::cout << "续借成功!是否继续续借?[Y/N]\n";Yes_or_Not();if (yes == "N" || yes == "n") {jixujie = jixu = false;}}}saveNoneWord();}void Database::showRecord(int book_no, int ku_no){std::cout << " 书 名:" << "《" << book[book_no].name << "》" << '\n'<< " 作 者:" << book[book_no].writer << '\n'<< " 出版社:" << book[book_no].company << '\n'<< " 类 别:" << types[book[book_no].type] << '\n';if (book[book_no].ku[ku_no].used)std::cout << "归还期限:"<< book[book_no].ku[ku_no].year << '/'<< book[book_no].ku[ku_no].month << '/'<< book[book_no].ku[ku_no].day << '\n';elsestd::cout << " 已归还!\n";}void Database::clear(){std::cout << "请输入管理员密码:";std::string pwd;while (inputPwd(pwd, PWDLENTH), pwd != PASSWORD){if (pwd == EXIT) {now = mainw; return;}std::cout << "密码错误!请重新输入(返回输入" << EXIT << "):";}system("cls"); std::cout << "正在载入。。。。。。";bool is_del[MAX_BOOK] = {false}; int del_num = 0;system("cls");for (int i = 0; i < book_num; i ++){std::cout << "序号" << i + 1 << ":\n";showInfo(i);}bool jixu = true;while (jixu){std::cout << "(输入0 返回)\n";std::cout << "请输入要删除的书籍的序号:";MyChoice(0, book_num); mychoice --;if (mychoice == -1) break;if (is_del[mychoice]){std::cout << "该书已删除!按Enter继续。。。。。。";guolv(); continue;}if (book[mychoice].left != book[mychoice].ku_num)std::cout << "该书籍尚有未归还的记录,是否";std::cout << "确认删除该书籍?[Y/N]\n";Yes_or_Not();if (yes == "Y" || yes == "y"){is_del[mychoice] = true;del_num ++;}system("cls");for (int i = 0; i < book_num; i ++){std::cout << "序号" << i + 1 << ":";if (is_del[i]) std::cout << "(注意:该书籍已删除!)";std::cout << '\n';showInfo(i);}if (yes == "Y" || yes == "y"){std::cout << "删除成功!\n";}else continue;std::cout << "继续删除?[Y/N]";Yes_or_Not();if (yes == "N" || yes == "n") jixu = false;}if (del_num > 0){std::cout << "是否保存?(不保存可恢复删除的书籍)[Y/N]\n";Yes_or_Not();if (yes == "Y" || yes == "y"){for (int i = 0; i < book_num; i ++) if (is_del[i]){book_all -= book[i].ku_num;book_left -= book[i].left;for (int j = i; j < book_num - 1; j ++){book[j] = book[j + 1];is_del[j] = is_del[j + 1];}book_num --;}saveNoneWord();}}}void Database::clear_all(){std::cout << "即将清空文件,"<< (book_left == book_all ? "" : "尚存在未归还的书籍,")<< "是否继续?[Y/N]\n";Yes_or_Not();if (yes == "N" || yes == "n") return;std::cout << "请输入管理员密码:";std::string pwd;while (inputPwd(pwd, PWDLENTH), pwd != PASSWORD){if (pwd == EXIT) {now = mainw; return;}std::cout << "密码错误!请重新输入(返回输入" << EXIT << "):";}book_num = book_left = book_all = 0;std::cout << "操作成功!按Enter继续。。。。。。";guolv();saveNoneWord();}

// Main.cpp#include "Database.cpp"void mainWindow();void findborrowWindow();void addWindow();void delWindow();void backdelayWindow();void adminWindow();int main(int argc, char * argv[]){data.Initial();while (now != m_exit){switch (now){case mainw: mainWindow(); break;case find_borrow: findborrowWindow(); break;case add: addWindow(); break;case del: delWindow(); break;case back_delay: backdelayWindow(); break;case admin: adminWindow();}}data.saveData();return 0;}void mainWindow(){system("cls");std::cout << "**************************\n";std::cout << "*****图书信息管理系统*****\n";std::cout << "**************************\n";std::cout << "** Welcome,欢迎使用! **\n";std::cout << "**************************\n";std::cout.setf(std::ios::left);std::cout << "** 总库存 :"; std::cout.width(10); std::cout << data.getBook_num(); std::cout << " **\n";std::cout << "** 书籍总量:"; std::cout.width(10); std::cout << data.getBook_all(); std::cout << " **\n";std::cout << "** 剩余数量:"; std::cout.width(10); std::cout << data.getBook_left(); std::cout << " **\n";std::cout.unsetf(std::ios::left);std::cout << "**************************\n";std::cout << "* 1.采编 *\n";std::cout << "* 2.找书/借阅 *\n";std::cout << "* 3.还书/续借 *\n";std::cout << "* 4.删除[*] *\n";std::cout << "* 5.退出 *\n";std::cout << "* 6.管理员模式[*] *\n";std::cout << "**************************\n";std::cout << "请选择您的操作:";MyChoice(1, 6);switch(mychoice){case 1: now = add; break;case 2: now = find_borrow; break;case 3: now = back_delay; break;case 4: now = del; break;case 5: now = m_exit; break;case 6: now = admin; break;}}void findborrowWindow(){now_find = finding;while (now_find != f_exit){system("cls");std::cout << "**************************\n";std::cout << "*****图书信息管理系统*****\n";std::cout << "**************************\n";std::cout << "** 找书 **\n";std::cout << "**************************\n";std::cout << "* 1.按书名 *\n";std::cout << "* 2.按作者 *\n";std::cout << "* 3.按出版社 *\n";std::cout << "* 4.按书名与作者 *\n";std::cout << "* 5.按书名与出版社*\n";std::cout << "* 6.按作者与出版社*\n";std::cout << "* 7.按书名、作者与出版社*\n";std::cout << "* 8.按类别(最多10本) *\n";std::cout << "* 9.返回*\n";std::cout << "* 10.退出*\n";std::cout << "**************************\n";std::cout << "(!书名为模糊识别)\n";std::cout << "(!作者和出版社为精确识别)\n";std::cout << "(!均不区分大小写)\n";std::cout << "请选择您的操作:";MyChoice(1, 10);switch(mychoice){case 1: data.find_name(); break;case 2: data.find_writer(); break;case 3: data.find_company(); break;case 4: data.find_n_w(); break;case 5: data.find_n_c(); break;case 6: data.find_w_c(); break;case 7: data.find_n_w_c(); break;case 8: data.find_type(); break;case 9: now_find = f_exit; now = mainw; break;case 10: now_find = f_exit; now = m_exit; break;}if (now_find == finding){if (mychoice == -1) continue;if (data.find_num == 0) {std::cout << "未查询到相关书籍!\n";}else {system("cls");for (int i = 0; i < data.find_num; i ++){std::cout << "序号" << i + 1 << ":\n";data.showInfo(data.find_add[i]);}}jiXu_find();}}}void addWindow(){system("cls");std::cout << "**************************\n";std::cout << "*****图书信息管理系统*****\n";std::cout << "**************************\n";std::cout << "** 采编 **\n";std::cout << "**************************\n";data.addBook();if (add_name == EXIT || add_writer == EXIT || add_company == EXIT)now = mainw;else { jiXu(); data.saveNoneWord(); }}void backdelayWindow(){now_back = backing;while (now_back != b_exit){system("cls");std::cout << "**************************\n";std::cout << "*****图书信息管理系统*****\n";std::cout << "**************************\n";std::cout << "** 还书/续借**\n";std::cout << "**************************\n";std::cout << "* 1.还书 *\n";std::cout << "* 2.续借 *\n";std::cout << "* 3.返回 *\n";std::cout << "* 4.退出 *\n";std::cout << "**************************\n";std::cout << "请选择您的操作:";MyChoice(1, 4);switch(mychoice){case 1: data.backBook(); break;case 2: data.delayBook(); break;case 3: now_back = b_exit; now = mainw; break;case 4: now_back = b_exit; now = m_exit; break;}}}void delWindow(){now_del = deling;while (now_del != d_exit){system("cls");std::cout << "**************************\n";std::cout << "*****图书信息管理系统*****\n";std::cout << "**************************\n";std::cout << "** 删除 **\n";std::cout << "**************************\n";std::cout << "* 1.按本删除[*]*\n";std::cout << "* 2.清空数据库[*] *\n";std::cout << "* 3.返回 *\n";std::cout << "* 4.退出 *\n";std::cout << "**************************\n";std::cout << "请选择您的操作:";MyChoice(1, 4);switch(mychoice){case 1: data.clear(); break;case 2: data.clear_all(); break;case 3: now_del = d_exit; now = mainw; break;case 4: now_del = d_exit; now = m_exit; break;}}}void adminWindow(){std::cout << "数据宝贵,谨慎操作!是否继续?[Y/N]\n";Yes_or_Not();if (yes == "Y" || yes == "y"){system("cls");std::cout << "**************************\n";std::cout << "*****图书信息管理系统*****\n";std::cout << "**************************\n";std::cout << "**管理员模式**\n";std::cout << "**************************\n";std::cout << "请输入管理员密码:";std::string pwd;while (inputPwd(pwd, PWDLENTH), pwd != PASSWORD){if (pwd == EXIT) {now = mainw; return;}std::cout << "密码错误!请重新输入(返回输入" << EXIT << "):";}std::cout << "数据库已打开!\n";std::string cmd_1 = "notepad ";std::string cmd_2 = FILEPATH;system((cmd_1 + cmd_2).c_str());std::cout << "更改成功,是否重新载入?[Y/N]";Yes_or_Not();if (yes == "Y" || yes == "y") data.Initial();else {data.saveNoneWord(); now = mainw; return;}std::cout << "是否继续?[Y(继续)/N(退出)]";Yes_or_Not();if (yes == "N" || yes == "n") now = m_exit;else now = mainw;}else now = mainw;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。