当前位置:   article > 正文

小型图书借阅管理系统_小型图书管理系统

小型图书管理系统
  • 1.实验要求

【问题描述】
调研、选择一个小型图书借阅管理案例,实现学生管理、图书信息、借阅信息等数据管理维护功能。
学生信息包括:学号(唯一)、姓名、专业、班级、已借图书数量等
图书信息包括:图书登记号(唯一)、书号(ISBN号)、书名、作者,单价、库存数量、出版时间、出版单位、价格、图书状态(已借出、未借出、丢失、销毁等)等。
借阅信息包括:借阅序列号、学生学号、图书登记号、借阅时间、归还时间等。  

  • 2.基本功能 

【基本功能】
1、采用可视化界面设计学生信息管理、图书信息管理和借阅管理等功能。
2、设计文本文件格式,保存学生信息、图书信息和图书借阅记录,并在程序启动时从文件中加载数据。
3、修改记录:能对任意存在的记录进行修改,并能显示修改后的数据。 

  • 3.完整代码 
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include<fstream>
  4. #include <cstring>
  5. using namespace std;
  6. //图书管理模块
  7. //图书类
  8. class book {
  9. public:
  10. int no; //图书编号
  11. char name[20]; //图书名称
  12. int b_flag; //1:在架 2:借出
  13. int b_del; //1:存在 2:删除
  14. public:
  15. book() {} //无参构造函数
  16. void setno(int n); //设置图书编号
  17. int getno(); //返回图书编号值
  18. void setname(char na[]);//设置图书名称
  19. char* getname(); //返回图书名称
  20. void borbook();//借书
  21. void delbook();//删除
  22. void addbook(int no, char na[]); //增加图书功能
  23. };
  24. //图书类函数实现
  25. void book::setno(int n) {
  26. no = n;
  27. }
  28. int book::getno() {
  29. return no;
  30. }
  31. void book::setname(char na[]) {
  32. strcpy_s(name, na);
  33. }
  34. char* book:: getname() {
  35. return name;
  36. }
  37. void book::borbook() {
  38. b_flag = 2; //借书标志
  39. }
  40. void book::delbook() {
  41. b_del = 2; //删除标志
  42. }
  43. void book::addbook(int no, char na[]) {
  44. setno(no);
  45. setname(na);
  46. b_flag = 1;
  47. b_del = 1;
  48. }
  49. //图书数据库类
  50. const int BMAX = 50; //定义书本最大值
  51. class bdatabase {
  52. public:
  53. book btarray[BMAX]; //图书集合
  54. int top;//数组的大小
  55. public:
  56. bdatabase();
  57. ~bdatabase(); //析构函数,将btarray[]写到book.txt文件中
  58. void addbooks(); //在图书数据库中添加图书
  59. int findbooks(int suffix); //查找图书,该函数用于借书操作,suffix是数组下标
  60. int findbooks(); //查找图书,该函数用于图书维护
  61. void editbooks(); //编辑图书
  62. void delbooks(); //删除图书
  63. void listbooks(); //显示全部图书
  64. };
  65. bdatabase::bdatabase() {
  66. book b; //建立book类对象并b
  67. top = -1; //数组下标从0开始,此处top值置为-1可保证从数组第一个元素开始存储信息
  68. fstream file("book.txt", ios::in);//打开文件进行读操作,若文件不存在则出错.输入输出指:内存与硬盘间的信息传递
  69. while (1) {
  70. file.read((char*)&b, sizeof(b));//从文件中读取b个字符到char*指向的缓存中(book类对象b的地址)
  71. if (!file) //若读取到文件尾EOF,返回非0值(一般为1),结束书本数量的计数,关闭文件
  72. break;
  73. top++;
  74. btarray[top] = b;
  75. }
  76. file.close();
  77. }
  78. bdatabase::~bdatabase() {
  79. fstream file("book.txt", ios::out);//输出:内存->硬盘
  80. for (int i = 0; i <= top; i++) {
  81. if (btarray[i].b_del == 1)//图书存在
  82. file.write((char*)&btarray[i], sizeof(btarray[i]));
  83. }
  84. file.close();
  85. }
  86. void bdatabase::addbooks() {
  87. book bk; //创建book类对象bk
  88. int no; //书号
  89. char bname[20]; //书名 用数组存放
  90. cout << "请输入书号:";
  91. cin >> no;
  92. cout << endl << "请输入书名:";
  93. cin >> bname;
  94. cout << endl;
  95. bk.b_flag = 1;//让图书的状态为在架
  96. bk.addbook(no, bname); //类中成员函数addbook(),设置书号与书名 修改标志
  97. top++;//记录存入书的个数
  98. btarray[top] = bk;//将新添加的书放入数组
  99. return; //返回上个操作界面
  100. }
  101. int bdatabase::findbooks(int suffix) {
  102. int no;
  103. cout << "请输入书号:";
  104. cin >> no;
  105. for (int i = 0; i <= top; i++) {
  106. if (btarray[i].no == no && btarray[i].b_del == 1) {//此书存在并且为存在状态
  107. return i;
  108. }
  109. }
  110. return -1;
  111. }
  112. int bdatabase::findbooks() {
  113. int no;
  114. char value[6];
  115. cout << "请输入书号:";
  116. cin >> no;
  117. for (int i = 0; i <= top; i++) {
  118. if (btarray[i].no == no && btarray[i].b_del == 1) {
  119. if (btarray[i].b_flag == 1)
  120. strcpy_s(value, "在架");
  121. if (btarray[i].b_flag == 2)
  122. strcpy_s(value, "借出");
  123. cout << "书号:" << btarray[i].no << " " << "书名:" << btarray[i].name << " " << "图书状态:" << value << endl;
  124. return i;
  125. }
  126. }
  127. return -1;
  128. }
  129. void bdatabase::editbooks() {
  130. int cur;
  131. cur = findbooks();
  132. if (cur == -1) {
  133. cout << "该书不存在" << endl;
  134. return;
  135. }
  136. cout << "当前图书信息--" << "书号:" << btarray[cur].no << " " << "书名:" << btarray[cur].name << endl;
  137. cout << endl;
  138. cout << "请继续操作以修改图书信息" << endl;
  139. cout << endl << "书名:";
  140. cin >> btarray[cur].name;
  141. return;
  142. }
  143. void bdatabase::delbooks() {
  144. int cur;
  145. cur = findbooks();
  146. if (cur == -1) {
  147. return;
  148. }
  149. if (btarray[cur].b_flag == 2) { //删除时判断图书是否借出
  150. cout << "该图书已经借出,请归还后删除!" << endl;
  151. return;
  152. }
  153. btarray[cur].b_del = 2;
  154. return;
  155. }
  156. void bdatabase::listbooks() {
  157. char value[6];
  158. for (int i = 0; i <= top; i++) {
  159. if (btarray[i].b_del == 1) {
  160. if (btarray[i].b_flag == 1)
  161. strcpy_s(value, "在架");
  162. if (btarray[i].b_flag == 2)
  163. strcpy_s(value, "借出");
  164. cout << "书号:" << btarray[i].no << " 书名:" << btarray[i].name << " 图书状态:" << value << endl;
  165. }
  166. }
  167. return;
  168. }
  169. //读书管理模块
  170. //读者类
  171. class reader {
  172. public:
  173. int no;//学号
  174. char name[20];//姓名
  175. int r_del; //1存在 2删除
  176. int r_bor; //1借过书 2未借书
  177. book brbook;
  178. public:
  179. void addreader(int id, char na[]); //增加读者
  180. void setbrbook(book bt); //设置借书标记
  181. book getbrbook() {
  182. return brbook; //返回借书信息
  183. }
  184. };
  185. //读书管理模块
  186. //读者类函数实现
  187. void reader::addreader(int id, char na[]) {
  188. no = id;
  189. strcpy_s(name, na);
  190. r_del = 1;
  191. }
  192. void reader::setbrbook(book bt) {
  193. brbook = bt;
  194. }
  195. //读者数据库类
  196. class rdatabase {
  197. public:
  198. reader rdarray[BMAX];
  199. int top;
  200. public:
  201. rdatabase();
  202. ~rdatabase();
  203. void addreaders(); //添加读者
  204. int findreaders(int suffix); //查找读者,该函数用于借书还书操作,suffix是数组下标
  205. int findreaders(); //查找读者,该函数用于读者维护操作
  206. void editreaders(); //编辑读者信息
  207. void delreaders(); //删除读者,读者如果借书,需要还书后才能删除
  208. void listreaders(); //显示所有读者
  209. };
  210. void readersmange();
  211. rdatabase::rdatabase() {
  212. reader rd;
  213. top = -1;
  214. fstream file("reader.txt", ios::in);
  215. while (1) {
  216. file.read((char*)&rd, sizeof(rd));
  217. if (!file) break;
  218. top++;
  219. rdarray[top] = rd;
  220. }
  221. file.close();
  222. }
  223. rdatabase::~rdatabase() {
  224. fstream file("reader.txt", ios::out);
  225. for (int i = 0; i <= top; i++) {
  226. if (rdarray[i].r_del == 1)
  227. file.write((char*)&rdarray[i], sizeof(rdarray[i]));
  228. }
  229. file.close();
  230. }
  231. void rdatabase::addreaders() {
  232. reader rd;
  233. int no;
  234. char rname[20];
  235. cout << "请输入学号:";
  236. cin >> no;
  237. cout << endl << "请输入姓名:";
  238. cin >> rname;
  239. cout << endl;
  240. rd.addreader(no, rname);
  241. rd.r_bor = 2;
  242. top++;
  243. rdarray[top] = rd;
  244. return;
  245. }
  246. int rdatabase::findreaders(int suffix) {
  247. int no;
  248. cout << "请输入学号:";
  249. cin >> no;
  250. for (int i = 0; i <= top; i++) {
  251. if (rdarray[i].no == no && rdarray[i].r_del == 1) {
  252. return i;
  253. }
  254. }
  255. return -1;
  256. }
  257. int rdatabase::findreaders() {
  258. int no;
  259. char value[3];
  260. cout << "请输入学号:";
  261. cin >> no;
  262. for (int i = 0; i <= top; i++) {
  263. if (rdarray[i].no == no && rdarray[i].r_del == 1) {
  264. if (rdarray[i].r_bor == 1)
  265. strcpy_s(value, "借");
  266. if (rdarray[i].r_bor == 2)
  267. strcpy_s(value, "无");
  268. cout << "学号:" << rdarray[i].no << " " << "姓名:" << rdarray[i].name << " " << "是否借书:" << value << endl;
  269. return i;
  270. }
  271. }
  272. return -1;
  273. }
  274. void rdatabase::editreaders() {
  275. int cur;
  276. cur = findreaders();
  277. if (cur == -1) {
  278. cout << "未找到该学生" << endl;
  279. return;
  280. }
  281. cout << "请修改数据:" << endl;
  282. cout << endl << "姓名:";
  283. cin >> rdarray[cur].name;
  284. return;
  285. }
  286. void rdatabase::delreaders() {
  287. int cur;
  288. cur = findreaders();
  289. if (cur == -1) {
  290. return;
  291. }
  292. if (rdarray[cur].r_bor == 1) {
  293. cout << "该用户已借出图书,请归还后删除!" << endl;
  294. return;
  295. }
  296. rdarray[cur].r_del = 2;
  297. return;
  298. }
  299. void rdatabase::listreaders() {
  300. char value[3];
  301. for (int i = 0; i <= top; i++) {
  302. if (rdarray[i].r_del == 1) {
  303. if (rdarray[i].r_bor == 1)
  304. strcpy_s(value, "借");
  305. if (rdarray[i].r_bor == 2)
  306. strcpy_s(value, "无");
  307. cout << "学号:" << rdarray[i].no << " " << "姓名:" << rdarray[i].name << " " << "是否借书:" << value << endl;
  308. }
  309. }
  310. return;
  311. }
  312. void booksmanage(); //图书信息管理界面 声明
  313. void borrow_or_return(char br);//借出还是归还
  314. //界面
  315. void login();
  316. void Main_Interface();
  317. void Book_Maintenance_Interface();
  318. void Reader_Maintenance_Interface();
  319. void UI();
  320. void readersmange();
  321. int main() {
  322. char in = -1;
  323. login();
  324. do{//退出系统限制条件
  325. UI(); //系统界面改变
  326. Main_Interface();
  327. cin >> in;
  328. switch (in) {
  329. case'1':
  330. borrow_or_return(in);
  331. break;
  332. case'2':
  333. borrow_or_return(in);
  334. break;
  335. case'3':
  336. booksmanage();
  337. break;
  338. case'4':
  339. readersmange();
  340. break;
  341. case'0': {
  342. cout << "感谢您使用本系统,再见!" << endl;
  343. break;
  344. }
  345. default:
  346. cout << "In Put Error!!! Please try again!!!" << endl;
  347. }
  348. } while (in != '0');
  349. system("pause");
  350. return 0;
  351. }
  352. //函数的实现
  353. void borrow_or_return(char br) { //借书、还书函数,参数br:判断 “借书”,“还书”. 1 借书 2 还书
  354. int reader_ID = 0; //读者id
  355. int book_ID = 0; //书的id
  356. int rsuffix, bsuffix;
  357. bdatabase t_bd;
  358. rdatabase t_rd;
  359. if (br == '1') { //借书
  360. rsuffix = t_rd.findreaders(reader_ID);
  361. bsuffix = t_bd.findbooks(book_ID);
  362. if (rsuffix == -1 || bsuffix == -1)
  363. return;
  364. if (t_bd.btarray[bsuffix].b_flag == 2) {
  365. cout << "图书已经借出,请选择其它图书" << endl;
  366. return;
  367. }
  368. t_bd.btarray[bsuffix].b_flag = 2;
  369. t_rd.rdarray[rsuffix].r_bor = 1;
  370. t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
  371. return;
  372. }
  373. if (br == '2') {
  374. rsuffix = t_rd.findreaders(reader_ID);
  375. bsuffix = t_bd.findbooks(book_ID);
  376. if (rsuffix == -1 || bsuffix == -1)
  377. return;
  378. if (t_rd.rdarray[rsuffix].brbook.no == t_bd.btarray[bsuffix].no) {
  379. t_bd.btarray[bsuffix].b_flag = 1;
  380. t_rd.rdarray[rsuffix].r_bor = 2;
  381. t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
  382. }
  383. else {
  384. cout << "请重新输入,读者借阅图书书号错误" << endl;
  385. return;
  386. }
  387. return;
  388. }
  389. }
  390. void booksmanage() {
  391. char in;
  392. bdatabase bd;
  393. do {
  394. system("pause");
  395. system("cls");//切换UI时,刷新缓冲区当前内容,完成下次更新
  396. UI();
  397. Book_Maintenance_Interface();
  398. cin >> in;
  399. switch (in) {
  400. case'1':
  401. bd.addbooks();
  402. break;
  403. case'2':
  404. bd.editbooks();
  405. break;
  406. case'3':
  407. bd.delbooks();
  408. break;
  409. case'4':
  410. bd.findbooks();
  411. break;
  412. case'5':
  413. bd.listbooks();
  414. break;
  415. case'6':
  416. break;
  417. default:
  418. cout << "In Put Error!!! Please try again!!!" << endl;
  419. }
  420. } while (in != '6');
  421. return;
  422. }
  423. void login() {
  424. char passward[2] = "2"; //此变量用于存储登录密码
  425. char s[2];//获取输入的密码,用于验证和登录密码是否相同
  426. int n = 3; //限定输入错误次数是3次
  427. cout << "请输入登录密码: ";
  428. cin >> s;
  429. if (!strcmp(s, passward)) { //若密码正确
  430. cout << "恭喜您登陆成功!!!请稍等......\n\n";
  431. system("pause");
  432. }
  433. else {
  434. cout << "Waring!!!密码输入错误,请退出系统后重新尝试\n";
  435. system("pause");
  436. exit(0);
  437. }
  438. }
  439. void Main_Interface() { //主界面
  440. system("cls"); //清屏函数 clean screen
  441. system("title 图书管理系统 项目开发人员 : 韩女士 ");//对控制台文件名重命名
  442. cout << "\n\n\n\n\n";
  443. cout << "\t\t\t***************欢 迎 进 入 图 书 管 理 系 统***********************\n";//与case顺序一致
  444. cout << "\t\t\t*\t 1. 借书 * \n ";
  445. cout << "\t\t\t*\t 2. 还书 * \n ";
  446. cout << "\t\t\t*\t 3. 图书信息管理 * \n ";
  447. cout << "\t\t\t*\t 4. 读者信息管理 * \n ";
  448. cout << "\t\t\t*\t 0. 退出 * \n ";
  449. cout << "\t\t\t*******************************************************************\n ";
  450. cout << " ";
  451. cout << "\t\t\t Copyright (C) 2020-2021. All Rights Reserved \n ";
  452. cout << "\t\t\t\n请选择您要执行的操作编号(1-4-0): ";
  453. cout << endl;
  454. }
  455. void Book_Maintenance_Interface() { //图书维护子菜单
  456. cout << "\n\n\n\n\n";
  457. cout << "\t\t\t***************图 书 信 息 维 护 管 理 员 后 台********************\n";//与case顺序一致
  458. cout << "\t\t\t*\t 1. 添加 * \n ";
  459. cout << "\t\t\t*\t 2. 修改 * \n ";
  460. cout << "\t\t\t*\t 3. 删除 * \n ";
  461. cout << "\t\t\t*\t 4. 查找 * \n ";
  462. cout << "\t\t\t*\t 5. 显示 * \n ";
  463. cout << "\t\t\t*\t 6. 返回上级操作 * \n ";
  464. cout << "\t\t\t*******************************************************************\n ";
  465. cout << " ";
  466. cout << "\t\t\t\n请选择您要执行的操作编号(1-6): ";
  467. cout << endl;
  468. }
  469. void Reader_Maintenance_Interface() { //读者维护子菜单
  470. cout << "\n\n\n\n\n";
  471. cout << "\t\t\t***************读 者 信 息 维 护 管 理 员 后 台********************\n";//与case顺序一致
  472. cout << "\t\t\t*\t 1. 添加 * \n ";
  473. cout << "\t\t\t*\t 2. 修改 * \n ";
  474. cout << "\t\t\t*\t 3. 删除 * \n ";
  475. cout << "\t\t\t*\t 4. 查找 * \n ";
  476. cout << "\t\t\t*\t 5. 显示 * \n ";
  477. cout << "\t\t\t*\t 6. 返回上级操作 * \n ";
  478. cout << "\t\t\t*******************************************************************\n ";
  479. cout << " ";
  480. cout << "\t\t\t\n请选择您要执行的操作编号(1-6): ";
  481. cout << endl;
  482. }
  483. //0 = 黑色 8 = 灰色
  484. //1 = 蓝色 9 = 淡蓝色
  485. //2 = 绿色 A = 淡绿色
  486. //3 = 浅绿色 B = 淡浅绿色
  487. //4 = 红色 C = 淡红色
  488. //5 = 紫色 D = 淡紫色
  489. //6= 黄色 E = 淡黄色
  490. //7 = 白色 F = 亮白色
  491. void UI() //自定义函数实现颜色变化
  492. {
  493. system("color F0");//前景黑 背景亮白 白底黑字
  494. }
  495. void readersmange() {
  496. char in;
  497. rdatabase bd;
  498. do {
  499. system("pause"); //暂停界面,以便显示所需数据
  500. system("cls");
  501. UI();
  502. Reader_Maintenance_Interface();
  503. cin >> in;
  504. switch (in) {
  505. case'1':
  506. bd.addreaders();
  507. break;
  508. case'2':
  509. bd.editreaders();
  510. break;
  511. case'3':
  512. bd.delreaders();
  513. break;
  514. case'4':
  515. bd.findreaders();
  516. break;
  517. case'5':
  518. bd.listreaders();
  519. break;
  520. case'6':
  521. break;
  522. default:
  523. cout << "In Put Error!!! Please try again!!!" << endl;
  524. }
  525. } while (in != '6');
  526. return;
  527. }
  • 4.说明: 

本实验代码,是我在其他博主那借鉴的,然后进行运行操作,并对代码进行更深的了解,希望整理出来,也可以对你们有用。 

  • 5.代码讲解 

首先就是针对背景颜色的设计:

 //0 = 黑色 8 = 灰色
//1 = 蓝色 9 = 淡蓝色
//2 = 绿色 A = 淡绿色
//3 = 浅绿色 B = 淡浅绿色
//4 = 红色 C = 淡红色
//5 = 紫色 D = 淡紫色
//6= 黄色 E = 淡黄色
//7 = 白色 F = 亮白色
void UI() //自定义函数实现颜色变化
{
    system("color F0");//前景黑 背景亮白 白底黑字 
}

这是我自己从网上搜索了一下关于变化颜色的操作,以及对应的颜色。

好啦,今天的分享就到这里啦,如果你们还有什么疑问的话,可以私信我哟! 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/724089
推荐阅读
相关标签
  

闽ICP备14008679号