首页 > 代码库 > 图书管理系统
图书管理系统
该图书馆里系统能实现基本的对图书信息的操作和借阅、归还功能。
一、主要内容:
本课程设计结合本学期所学C语言知识,数组、函数、结构体、指针、链表、文件读取操作等等,准备设计开发一个简单的图书管理系统。设计开发这个系统需要用到链表、文件读取操作、结构体、函数、指针、等C语言知识。本课程设计将会实现对图书信息的账号登录、注册账号、密码修改、密码查找、查找、输出、排序、备份、恢复、图书借阅和归还功能。本着简单、易用的设计原则,本课程设计在尽量优化界面在保证输入输出美观的同时又不失友好的交互界面。
本次设计主要学习内容包括:
(一)进一步学习并熟练掌握C语言语法和编程思想。
(二)学习C语言提供的库函数,熟悉CodeBlocks的开发工具。
(三)学习C语言函数、链表、结构体、文件读取、指针等知识。
(四)学习软件的设计与开发过程中所需要思想和细节。
二、基本要求:
(一)质量要求
(1)图书管理系统的基本功能模块的设计应包括:账号登录和修改、图书信息的浏览和保存、图书的借阅和归还。
(2)对图书管理系统设计并进行调试、修复、完善、测试。测试图书信息的输入输出是否正确、测试文件的读取与存储是否正常、测试账号切换后是否各项功能是否正常运行、测试评估界面是否合理,友好。
(3)定期主动向指导教师汇报任务进度,认真填写相关报告文档。
(4)按时完成各阶段工作,不突击,不抄袭。
(二)进度要求
(2)明确课程设计任务,搜集资料:2017年2月28日—3月14日。
(3)完成程序的设计与实现,撰写课程设计论文初稿:2017年3月15日—5月15日。
(4)与指导教师沟通,完成课程设计论文定稿:2016年5月16日—2017年5月28日。
(5)进入课程设计论文审阅阶段,准备答辩:2017年5月29日—6月9日。
三、主要参考资料:
完 成 期 限: xxxx年x月xx日
指导教师签名:
年 月 日
目 录
1概述. 1
1.1 设计思想. 1
1.2 设计原则. 1
1.3 课程设计报告内容及分工情况. 1
1.3.1 课程设计报告内容. 1
1.3.2 课程设计分工情况. 2
2总体设计. 3
2.1 功能模块图. 3
2.2 主函数 main() 3
2.3 程序流程图. 4
3 详细设计. 5
3.1 函数. 5
3.2 函数流程图. 8
4运行结果与调试. 13
4.1 运行结果. 13
4.2 软件调试. 15
结束语. 17
参考资料. 18
附录. 19
1概述
1.1 设计思想
(1)该系统的设计分成几个相对独立的模块,这些模块都进行集中式管理。
(2)分层的模块化程序设计思想,整个系统采用模块化结构设计作为应用程序,有较强的可操作性和扩展性。
(3)合理的数据设计,在应用系统设计中,相对独立的模块间以数据相互连接,使各模块间的耦合性较低,方便系统运行,提高系统安全性 。
1.2 设计原则
为了使本系统功能齐全完备,操作简便,最大限度的提高用户的使用的体验,从而满足用户的实际需要,在设计开发过程中遵循了如下原则:
(1)合法性原则:规范录入各种图书信息和各种数据,对用户的账号信息进行规范保存。
(2)实用性原则:根据用户对图书信息浏览和借阅的基本需求设计各种功能,并能够处理一些特殊情况的要求,此外,尽可能预留空间,以便扩充功能。
(3)易操作原则:要求设计的系统功能齐全,界面友好,操作方便,必要的地方进行提示。
(4)源程序可读性原则:为了便于其他设计,维护人员读懂代码或以后的代码修改,软件升级维护,即可能做好代码注释工作。
1.3 课程设计报告内容及分工情况
1.3.1 课程设计报告内容
(1)系统功能模块结构图和程序流程图
(2)数据结构设计及用法说明
(3)程序结构(画功能模块图或流程图)
(4)各模块的功能
(5).实验结果(包括输入数据和输出结果)
(6)设计体会
(7)参考文献
1.3.2 课程设计分工情况
本组共有3人,具体分工情况如下:
(1)学号:xx,姓名:xxx,xxx
(2)学号:xxx,姓名:xxx,xxx
(3)学号:xx,姓名:xxx,xxx。
2总体设计
2.1 功能模块图
本图书管理系统分为三个功能模块,分别是账号管理功能、图书信息管理功能、图书借还管理功能。账号管理功能可以进行账号登录、注册账号、找回密码、修改密码:图书信息管理功能可以对图书信息进行查找、排序、修改、恢复、和备份功能:图书借还管理功能可以查询用户的借书记录、借书、还书功能。
图2-1图书管理系统模块图
2.2 主函数 main()
函数的功能: 用于联系各个功能函数模块,以及退出程序时的退出画面提示。
函数的入口: 整个程序是从主函数开始的。
函数的出口: 当从main()的ove函数开始中进入,即显示出欢迎使用界面;跳出while循环,然后退出main()函数,即:退出整个程序。
函数调用关系:该函数不被其它函数调用
2.3 程序流程图
本图书管理系统在启动后会先进入登录界面进行登录或各种账号操作,然后进入图书信息管理、图书借还管理等实用性功能的操作。
图2-2图书管理系统流程图
3 详细设计
3.1 函数
(1) 功能函数ling()
函数的功能: 登录账号
函数的入口: 从main()中进入。
函数调用关系: 被主函数调用。
函数的出口: 当账号登录成功返回1然后结束该函数,或输入密码错误超过三次结束结束整个程序。
(2)功能函数FindByNum()
函数的功能: 按书号对图书进行查找并输出。
函数的入口: 程序从Find()的switch()开关结构中进入,即sclele的值为1时,开始进入该函数,进入函数后,在存储图书信息的stu结构数组中进行查找,找到后进行输出,若没找到则输出“未找到该数”。
函数调用关系:被Find()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。
函数的出口: 当输出结果信息用printf()标准输出到屏幕上,然后结束该函数,而执行Find()函数中“break;”跳出switch()开关函数,继续执行while循环结构。
(3)功能函数SortByScore
函数的功能: 对所有图书信息按书名的首字母进行排序,并保存到文件“缓存区”中。
函数的入口: 从Sort()的switch()开关结构中进入,即sexh的值为1的时侯,进入该函数,开始对图书信息按书名的首字母进行排序,然后将排序结果保存到文件“缓存区”中。
函数调用关系:被Sort()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。
函数的出口:把“排序完成”用printf()标准输出到屏幕上,然后结束该函数,而执行Sort()函数中“break;”跳出switch()开关函数,继续执行while循环结构。
(4)功能函数output()
函数的功能: 输出所有图书信息
函数的入口: 从Find()的switch()开关结构中进入,即sclele的值为4时,进入该函数。并调用PrintRecord()函数对每一条图书信息进行输出。
函数调用关系: 被Find()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。
函数的出口: 将所有图书信息都输入到屏幕上后,执行Find()函数中“break;”跳出switch()开关函数,继续执行while循环结构。
(5)功能函数Huifu ()
函数的功能: 将所有图书的信息恢复至备份时的状态
函数的入口: 从Menu ()的switch()开关结构中进入,即select的值为4时,进入该函数。用freopen("图书信息库.txt","r",stdin)将里边的所有图书信息都存入内存,然后再调用save()将所有图书信息都存入到“缓存区”中。
函数调用关系: 被Menu()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。
函数的出口: 将所有图书信息都存入到“缓存区”中后,执行Menu()函数中“break;”跳出switch()开关函数,继续执行while循环结构。
(6)功能函数BorrowBook()
函数的功能: 借阅图书
函数的入口: 从Borrow ()的switch()开关结构中进入,即shl的值为2时,进入该函数。之后对用户的信誉值进行判断,若低于60将无法借书。然后调用FindByName()函数对所借图书进行搜索,若存在则输入借书时间,否则借书失败。
函数调用关系: 被Borrow()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。
函数的出口: 将借书结果输入到屏幕上后,执行Borrow()函数中“break;”跳出switch()开关函数,继续执行while循环结构。
(7)功能函数SendBook ()
函数的功能: 归还图书
函数的入口: 从Borrow ()的switch()开关结构中进入,即shl的值为3时,进入该函数。之后先判断该用户是否有借书记录,并调用FindByName()函数找到还的图书并对其数量进行修改,最后判断是否按期归还图书和图书有无破损。
函数调用关系: 被Borrow()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。
函数的出口: 还书完成后后,执行Borrow()函数中“break;”跳出switch()开关函数,继续执行while循环结构。
3.2 函数流程图
(1)账号登录流程如图3-1所示。
图3-1 账号登录流程图
(2)按书号查找图书流程如图3-2所示。
图3-2按书号查找流程图
(3)按书名首字母排序流程图如图3-3所示 。
图3-3按书名首字母排序流程图
(4)输出所有图书信息流程如图3-4所示。
图3-4输出所有图书信息流程图
(5)恢复备份功能流程如图3-5所示。
图3-5恢复备份流程图
(6)借阅图书流程如图3-6所示。
图3-6借阅图书流程图
(7)归还图书流程如图3-7所示。
图3-7归还图书流程图
4运行结果与调试
4.1 运行结果
(1)在程序开始是进入登录界面进行登录界面或选择切换账号时输出登录界面。该界面可以进行登录操作、注册新账号、找回账号密码、修改密码和退出系统。
图4-1 账号登陆界面
(2)该界面为主界面,在登录完成后或者从下一级界面返回后输出该界面。该主界面可以选择图书信息管理功能、图书借还功能、查看系统功能介绍、开发人员信息和退出系统的操作。
图4-2 主界面
(3)该界面为图书管理功能的主界面,可以选择执行查找、排序、修改、恢复图书信息、备份图书信息的操作、返回上一级菜单的功能。
图4-3图书信息管理功能界面
(4)该界面可以实现图书信息查找功能,可以按书号查找、按书名查找、按作者查找、查看全部图书信息、返回上一级菜单的功能。
图4-4 查找功能界面
(5)该界面可以进行排序的操作。可以进行按书名首字母排序、按图书单价升序排序、按图书单价降序排序,还可以返回上一级菜单。排序功能是在内存中进行,所以不进行输出。
图4-5排序功能界面
(6)该界面可以实现添加图书、删除图书、删除全部图书信息、返回上一级菜单的功能。
图4-6修改功能界面
(7)该界面可以实现对用户借书记录查询、图书借阅、图书归还、返回上一级菜单的功能。
图4-7图书借还管理功能界面
4.2 软件调试
(1)每个选择界面之后,前一屏幕的内容依旧存在,影响界面的美观;经过老会长的帮助及上网搜索,发现利用“system(“cls”);”可以消去前一屏幕的内容;然而接下来又出现新的问题:每次在执行完讲数据保存到文件的函数后都会输出紊乱。经过多次调试和修改后,发现把是因为freopen(”CON”,stdout)运行不稳定导致,在更换了保存数据的方法后结决了此问题。
(2)在增加了切换账号功能后,在创建新账号后保存到文件的用户借还书记录总是出错但内存中没错,经过调试发现是因为在新增账号时用于存储新账号借还书记录的指针名与一个变量名相同造成每次都判断错误。最后更换了变量名,并使该指针每次使用前都指向NULL。
(3)在借书时不能判断是因为图书数量不足导致不能借阅还是因为没用该图书导致的不能借阅,最后给每种情况标记变量都设置了一不同的值来区分两种不同的情况。
(4)最开始在每次关闭程序后在下次使用前需要手动恢复文件中的数据,不能连续的使用数据,最后加了一个文件来保存各类数据的数量以使数据能够连续自主的调用,不需要再人工修改。
结束语
本系统包含51个函数,基本实现了图书管理系统所需的基本功能。系统功能大致分为三个模块,分别是登录功能、图书信息管理功能和图书借还功能。启动程序后首先执行的是登录功能。在此功能中可以实现账号登录、注册账号、找回账号密码、修改账号密码功能。登录时,若输入密码错误次数达到三次系统将自动关闭。在注册账号时若注册的账号已存在则不能再进行注册。修改密码时增加了验证码功能。在图书信息管理模块中可以进行图书查找、排序、添加、删除、备份图书信息、回复图书信息、切换账号等功能。在图书借还功能模块可以进行图书的借阅、归还、借书记录查询功能。本系统在信息存储时用了两种方式。在存储图书信息和账号信息时用的是结构数组,在存储用户借书记录时用的是链表。通过此次图书管理系统的设计熟练了结构数组、链表、文件的操作,同时对编写小型的系统有了一定的了解,对于细节方面考虑的比以前有很大提升。
xxx:在该设计中主要完成了所有代码的实现,并最终调试实现了该图书管理系统的全部功能。还完成了大部分的设计报告。在设计的过程中熟练了对文件的各种操作,链表和结构数组的使用,清屏函数和暂停函数的使用,对做一个项目的过程有了一个大概的认识,知道了大致的规划。在设计过程中发现一些文件的操作和清屏函数会有冲突,通过改变对文件的操作解决了此问题;
xxx:除了xxx设计的这个图书管理系统,我自己也尝试着设计了一个图书管理系统的功能,因此也发现了很多问题,比如说:在用add()函数添加新增图书信息时,我就忘了字符型数据本身会吃掉回车的这一特点,忘了在%c前面加上空格,导致程序在循环的过程中一直无法正常显示结果。但是,通过仔细耐心的检查与对错误的分析,又在课本的相关章节进行了查阅,最终发现了这一问题。同时,我更加熟悉了结构体的使用,对函数的调用方式更加清楚。还有就是初步了解了函数指针的概念,能够使用基础的函数指针。同时,这也是我第一次尝试画各种各样的流程图,虽然画的不好,但这确实是我的第一次尝试,也觉得充满了乐趣。
xxx:在本系统的设计中我参加设计了少量函数语句以及制作流程图等任务,在这次的设计前我原本对函数和结构体等了解并不太清楚,通过这次的设计我清楚了这些语句的运用,并且我学会了文件的操作,在文件的修改等地方出现了问题,后来通过查阅资料和讨论解决了这个问题。
参考资料
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include <windows.h>#include<algorithm>using namespace std;struct library{ int ID; char name[30]; double price; char author[30]; int quan; char itd[2000];}stu[100];struct asccount{ char AcName[30]; char password[12]; char nickname[30];}sta[100];struct Book{ char Name[30]; char time[40];};struct node{ char users[30]; int sexes; struct Book book[30]; int r; node *Next;};typedef struct node *L;L pre, hnj=NULL, kl = new node;L HEAD = new node;char strr[30];int num=42,LLL,jj=2,logo=0,h=0,F=1,k=2,huan,oo;void display(void);//显示图书信息管理菜单*void load(void);//把图书信息加载到内存*void save(void);//将数据保存到磁盘*void Sort(void);//排序*void SortByScore(void);//按书名首字母排序*void AscendVyPick(void);//按单价升序排序*void DesendByPick(void);//按单价降序排序*int cmp1(library a, library b);//按书名首字母排序判断*int cmp2(library a, library b);//按单价升序排序判断*int cmp3(library a, library b);//按单价降序排序判断*void IdArrange(void);//重新整理书号*void Find(void);//查找*void add(void);//添加*void edit(void);//修改*void DeleteAll(void);//删除所有信息*void PrintRecord(void);//输出一条记录*void FindByName(void);//按书名查找*void FindByNum(void);//按书号查找*void FindByAuthor(void);//按作者查找*void output(void);//输出所有图书信息*void over(void);//结束程序*void Huifu(void);//恢复出厂设置*void PrinEdit(void);//输出修改菜单*void FindEdit(void);//输出查找菜单*void PrintSort(void);//输出排序菜单*void CheckUser(void);//检验账号的合法性*void addUser(void);//新建账号*void findPassword(void);//找回密码*void EditPassword(void);//修改密码*void loadUser(void);//将账号读入内存*void saveUser(void);//将账号存入磁盘*void printuser(void);//输出账号菜单*int ling(void);//账号登录*void PrintBorrow(void);//打印借书管理系统菜单*void Menu(void);//图书信息管理*void Borrow(void);//图书借还系统*void BorrowRecord(L q);//借书记录*void BorrowBook(L q, L y);//借书*void SendBook(L q, L y);//还书*L LookUser(L head);//用户搜索*void loadBorrow(L head);//将借书记录加载到内存*void saveBorrow(L head);//将用户借书记录加载到磁盘*void FuactionIntrod(void);//系统功能介绍*void Intropeople(void);//开发人员介绍*void Mainmenu(void);//打印主菜单*void hhk(void);//打印操作错误 *void loaduu(void);//数据数加载到内存*void saveuu(void);//数据数加载到磁盘*void Cpy(void);//备份图书信息*void HideCursor(void);//隐藏光标*void inwrong(void);//判断输入是否正确*void shan(void);void beifen(void);int main(){ int i,selt; HideCursor(); LLL = 1; loaduu(); if(!ling()) return 0; system("cls"); load(); while(1){ Mainmenu(); oo = scanf("%d",&selt); if(!oo){ inwrong(); continue; } switch(selt){ case 1: Menu(); saveuu(); break; case 2: Borrow(); break; case 3: FuactionIntrod(); break; case 4: system("cls"); Intropeople(); break; case 5: system("cls"); if(ling() == 0){return 0;} system("cls"); break; case 6: saveuu(); system("cls"); over(); return 0; default : system("cls"); hhk(); system("cls"); break; } } return 0;}//判断输入是否正确void inwrong(void){ char s[50]; gets(s); system("cls"); printf("\t\t\t输入错误!!\n"); system("PAUSE");system("cls");}//隐藏光标void HideCursor(){ CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}//数据数加载到内存void loaduu(void){ FILE *fp; fp = fopen("数据个数.txt", "r"); fscanf(fp, "%d", &num); fscanf(fp, "%d", &jj); fclose(fp); k = jj;}//数据数加载到磁盘void saveuu(void){ FILE *fp; fp = fopen("数据个数.txt", "w"); fprintf(fp, "%d\n", num); fprintf(fp, "%d\n", jj); fclose(fp);}//备份图书信息void Cpy(void){ FILE *fp; int i; shan(); fp = fopen("图书信息库.txt", "w"); for(i = 0; i < num; i++){ fprintf(fp, "%d\n",stu[i].ID); fprintf(fp, "%s\n",stu[i].name); fprintf(fp, "%.2lf\n",stu[i].price); fprintf(fp, "%s\n",stu[i].author); fprintf(fp, "%d\n",stu[i].quan); fprintf(fp, "%s\n",stu[i].itd); } fclose(fp); saveuu(); printf("\n\n\t\t\t备份成功!!\n"); system("PAUSE"); system("cls");}//打印主菜单void Mainmenu(void){ printf("\t ************************************************************\n"); if(LLL){ printf("\t * 欢迎使用29组的图书管理系统 *\n"); LLL = 0; } else{ printf("\t * *\n"); printf("\t * 您可以进行以下操作: *\n"); } printf("\t * *\n"); printf("\t * 图书信息管理 请按 1 *\n"); printf("\t * *\n"); printf("\t * 图书借还管理 请按 2 *\n"); printf("\t * *\n"); printf("\t * 系统功能介绍 请按 3 *\n"); printf("\t * *\n"); printf("\t * 开发人员介绍 请按 4 *\n"); printf("\t * *\n"); printf("\t * 切换账号 请按 5 *\n"); printf("\t * *\n"); printf("\t * 退出系统 请按 6 *\n"); printf("\t * *\n"); printf("\t ************************************************************\n\n");}//系统功能介绍void FuactionIntrod(void){ system("cls"); printf("本系统能执行以下操作:\n\n"); printf("一、登录界面功能介绍\n\n"); printf("1.登录账号\n\n2.注册新账号\n\n3.密码找回\n\n4.修改密码\n\n\t\t\t "); system("PAUSE"); system("cls"); printf("二、图书信息管理系统功能介绍\n\n"); printf("1. 查找功能\n\n"); printf("1)按书号查找\n2)按书名查找\n3)按作者查找\n4)输出所有图书信息\n\n"); printf("2. 排序功能\n\n"); printf("1)按书名首字母排序\n2)按单价升序排序\n3)按单价降序排序\n\n"); printf("3. 修改功能\n\n"); printf("1)添加\n\n 可添加任意本书\n\n2)删除一本图书\n3)删除全部图书\n\n"); printf("4. 恢复图书信息\n\n 如错误删除图书信息,可恢复上一次备份的图书信息\n\n"); printf("5.备份图书信息\n\n\t\t\t "); system("PAUSE"); system("cls"); printf("三、图书借还系统功能介绍\n\n"); printf("1.借阅图书功能\n\n"); printf("此功能可使用户借阅本系统中现存的图书\n\n"); printf("2.还书功能\n\n"); printf("此功能可方便用户还书\n\n"); printf("3. 用户借书还书记录查询功能\n\n"); printf("此功能可查询个人借书和还书记录\n\n"); printf("4. 用户借书还书信誉查询功能\n\n"); printf("此功能可查询借书者的个人信誉值,若信誉值低于60将不能再通过本系统借书,同时,每一年年末都会对信誉值进行统计,\n"); printf("并将所有用户信誉值恢复为100。\n\n"); printf("信誉值扣除标准:\n\n"); printf("1)借的书需在两个工作日内归还,逾期还书 每次扣除信誉值 5。\n"); printf("2)对图书造成损坏或丢失的 每次扣除信誉值 10 , 并原价赔偿。\n"); printf("3)超过还书时间一个工作日的,信誉值将被直接清零,并不能在本系统进行任何操作。\n\n"); printf("四、切换账号功能\n\n 可以切换账号\n\n\t\t\t "); system("PAUSE"); system("cls");}//检验账号的合法性void CheckUser(void){ int i,flag = 0; char ss[30],sf[10]; printf("\t\t\t\t请输入登录账号:\n\n\t\t\t\t "); scanf("%s",ss); for(i = 0; i < jj; i++){ if(strcmp(sta[i].AcName, ss) == 0){ strcpy(strr, ss); flag = 1; break; } } if(!flag){ printf("\n\t\t\t\t此账号还未注册!!\n\n\t\t\t "); system("PAUSE"); system("cls"); return; } printf("\t\t\t\t请输入密码:\n\n\t\t\t\t "); scanf("%s",sf); if(strcmp(sta[i].password, sf) == 0){ h = 0; flag = 2; } if(flag == 1){ system("cls"); printf("\t\t\t\t密码错误!!\n\n\t\t\t "); system("PAUSE"); system("cls"); h++; return ; } else if(flag == 2) logo = 1;}//将账号存入磁盘void saveUser(void){ int i; FILE *fp; fp = fopen("账号.txt", "w"); for(i = 0; i <= jj; i++){ fprintf(fp, "%s\n", sta[i].AcName); fprintf(fp, "%s\n", sta[i].password); fprintf(fp, "%s\n", sta[i].nickname); } fclose(fp);}//新建账号void addUser(void){ FILE *fp; int j=0,i; char c[12],str[30]; printf("\t\t\t请输入账号:\n\n\t\t\t "); scanf("%s",str); for(i = 0; i < jj; i++){ if(strcmp(sta[i].AcName, str) == 0){ printf("\t\t\t该账号已被注册,请重新申请!!\n\n\t\t\t "); system("PAUSE"); return ; } } strcpy(sta[jj].AcName, str); printf("\t\t\t请输入密码(密码长度不超过十个字符):\n\n\t\t\t "); scanf("%s", sta[jj].password); printf("\t\t\t请再输入一次密码:\n\n\t\t\t "); scanf("%s",c); if(strcmp(sta[jj].password, c) != 0){ printf("\t\t\t两次密码不一致请从新申请\n\n\t\t\t"); system("PAUSE"); system("cls"); printf("\n"); addUser(); j = 1; } if(j) return ; printf("\n\t\t\t请输入昵称\n\n\t\t\t "); scanf("%s",sta[jj].nickname); saveUser(); printf("\t\t\t\t账号申请成功!!\n\n\t\t\t"); jj++; strcpy(kl->users, sta[jj-1].AcName); kl->sexes = 0; strcpy(kl->book[0].Name, "0"); strcpy(kl->book[0].time, "0"); kl->r = 100; kl->Next = NULL; hnj = kl; saveuu(); loadBorrow(HEAD); saveBorrow(HEAD); system("PAUSE");}//找回密码void findPassword(void){ int i; char a[30]; printf("\t\t\t请输入要找回的账号:\n\t\t\t\t"); scanf("%s",a); for(i = 0; i < jj; i++) if(strcmp(sta[i].AcName, a) == 0){ printf("\t\t\t密码:%s\n",sta[i].password); system("PAUSE"); return ; } printf("\t\t\t\t查无此账号!!\n\n\t\t\t"); system("PAUSE");}//修改密码void EditPassword(void){ int i,K=0,KK=0; char a[30]; printf("\t\t\t 请输入要修改密码的账号:\n\t\t\t "); scanf("%s",a); for(i = 0; i < jj; i++) if(strcmp(sta[i].AcName, a) == 0){ printf("\n\t\t\t 请输入原密码:\n\t\t\t "); scanf("%s",a); if(strcmp(sta[i].password, a) != 0){ printf("\n\t\t\t\t密码错误!!\n\n\t\t\t "); system("PAUSE"); system("cls"); return ; } printf("\n\t\t\t 请输入新密码:\n\t\t\t "); scanf("%s",a); if(strcmp(sta[i].password, a) == 0){ printf("\n\t\t\t新密码与原密码重复,请从新修改!!\n\n\t\t\t "); system("PAUSE"); system("cls"); return ; } strcpy(sta[i].password, a); printf("\t\t\t 请输入下面的验证码:\n"); srand((unsigned)time(NULL)); K = rand(); printf("\n\t\t\t\t %d\n\t\t\t\t ",K); scanf("%d",&KK); if(KK != K){ printf("\n\t\t\t验证码错误!!\n"); system("PAUSE"); system("cls"); return ; } printf("\n\t\t\t\t修改密码成功!!\n"); saveUser(); system("PAUSE"); system("cls"); return ; } printf("\n\t\t\t\t查无此账号!!\n\n\t\t\t"); system("PAUSE");}//将账号读入内存void loadUser(void){ int i; freopen("账号.txt", "r", stdin); for(i = 0; i < jj; i++){ scanf("%s",sta[i].AcName); scanf("%s",sta[i].password); scanf("%s",sta[i].nickname); } freopen("CON", "r", stdin);}//输出账号菜单void printuser(void){ printf("\t\t\t************************************\n"); printf("\t\t\t* 登录 请按 1 *\n"); printf("\t\t\t* 注册新账号 请按 2 *\n"); printf("\t\t\t* 找回密码 请按 3 *\n"); printf("\t\t\t* 修改密码 请按 4 *\n"); printf("\t\t\t* 退出程序 请按 5 *\n"); printf("\t\t\t************************************\n");}//账号登录int ling(void){ int sh,i; hnj=NULL, kl = new node; h = logo = 0; while(1){ printuser(); loadUser(); loaduu(); oo = scanf("%d",&sh); if(!oo){ inwrong(); continue; } switch(sh){ case 1: CheckUser(); break; case 2: addUser(); saveuu(); system("cls"); break; case 3: findPassword(); system("cls"); break; case 4: EditPassword(); break; case 5: system("cls"); printf("\n"); printf("\t\t\t欢迎下次使用小哥哥的图书管理系统\n"); return 0; default : system("cls"); hhk();system("cls"); break; } if(logo) return 1; if(h == 3){ printf("\t\t\t密码错误三次,系统将自动关闭!!\n\n"); printf("\t\t\t欢迎下次使用小哥哥的图书管理系统\n"); return 0; } }}//恢复出厂设置void Huifu(void){ beifen(); saveuu(); int i = num; freopen("图书信息库.txt", "r",stdin); for(i = 0; i < num; i++){ scanf("%d",&stu[i].ID); scanf("%s",stu[i].name); scanf("%lf",&stu[i].price); scanf("%s",stu[i].author); scanf("%d",&stu[i].quan); scanf("%s",stu[i].itd); } freopen("CON", "r", stdin); save(); printf("\n\n\t\t\t恢复成功!!\n"); system("PAUSE"); system("cls");}void PrintRecord(int i)//输出一条记录{ printf("\t\t\t书号:%04d\n",stu[i].ID); printf("\t\t\t书名:%s\n",stu[i].name); printf("\t\t\t价格:%.2lf\n",stu[i].price); printf("\t\t\t作者:%s\n",stu[i].author); printf("\t\t\t库存:%d\n",stu[i].quan); printf("\n简介:%s\n\n",stu[i].itd);}//图书信息管理void Menu(void){ int select; system("cls"); load(); while(1){ display(); oo = scanf("%d",&select); if(!oo){ inwrong(); continue; } switch(select){ case 1: Find(); break; case 2: Sort(); break; case 3: edit(); break; case 4: Huifu(); break; case 5: Cpy(); break; case 6: system("cls"); return ; default : hhk(); system("cls"); break; } }}//显示图书信息管理菜单void display(void){ char str[3][20] = {"查找 请按 1","排序 请按 2","修改 请按 3"}; int i,j; printf("\t ************************************************************\n"); printf("\t * *\n"); printf("\t * 您可以进行以下操作: *\n"); printf("\t * *\n"); printf("\t * 查找 请按 1 *\n"); printf("\t * *\n"); printf("\t * 排序 请按 2 *\n"); printf("\t * *\n"); printf("\t * 修改 请按 3 *\n"); printf("\t * *\n"); printf("\t * 恢复图书信息 请按 4 *\n"); printf("\t * *\n"); printf("\t * 备份图书信息 请按 5 *\n"); printf("\t * *\n"); printf("\t * 返回上一级菜单 请按 6 *\n"); printf("\t * *\n"); printf("\t ************************************************************\n\n");}//打印开发人员信息void Intropeople(void){ printf("\t ************************************************************\n"); printf("\t * *\n"); printf("\t * 开发人员信息 *\n"); printf("\t * *\n"); printf("\t * 计科二班 贾迪 *\n"); printf("\t * *\n"); printf("\t * 计科二班 阚雯雯 *\n"); printf("\t * *\n"); printf("\t * 计科二班 李正玉 *\n"); printf("\t ************************************************************\n\n"); system("PAUSE"); system("cls");}void hhk(void)//打印操作错误{ printf("\n"); printf("\t\t\t 操作错误,请从新选择操作选项!!\n\n"); system("PAUSE");}//结束程序void over(){ printf("\n\t\t\t29组图书管理系统祝您阅读愉快!!!\n");}//把图书信息加载到内存void load(){ int i; freopen("缓存区.txt", "r", stdin); for(i = 0; i < num; i++){ scanf("%d",&stu[i].ID); scanf("%s",stu[i].name); scanf("%lf",&stu[i].price); scanf("%s",stu[i].author); scanf("%d",&stu[i].quan); scanf("%s",stu[i].itd); } freopen("CON", "r", stdin);}//将数据保存到磁盘void save(){ int i; FILE *fp; fp = fopen("缓存区.txt", "w"); for(i = 0; i < num; i++){ fprintf(fp, "%d\n",stu[i].ID); fprintf(fp, "%s\n",stu[i].name); fprintf(fp, "%.2lf\n",stu[i].price); fprintf(fp, "%s\n",stu[i].author); fprintf(fp, "%d\n",stu[i].quan); fprintf(fp, "%s\n",stu[i].itd); } fclose(fp);}//输出修改菜单void PrinEdit(){ printf("\t ************************************************************\n"); printf("\t * *\n"); printf("\t * 您可以进行以下操作: *\n"); printf("\t * *\n"); printf("\t * 添加 请按 1 *\n"); printf("\t * *\n"); printf("\t * 删除一本图书 请按 2 *\n"); printf("\t * *\n"); printf("\t * 删除全部图书 请按 3 *\n"); printf("\t * *\n"); printf("\t * 返回上一级菜单 请按 4 *\n"); printf("\t * *\n"); printf("\t ************************************************************\n\n");}void add()//添加{ FILE *fp; fp = fopen("缓存区.txt","a"); int n,p,i; double q; char str[30],st[1000]; printf("\t\t\t 亲,请输入你需要添加几项\n\n\t\t\t "); oo = scanf("%d",&n); if(!oo){ inwrong(); return ; } for(i = num+1; i <= num+n; i++){ fprintf(fp, "%d\n",i); stu[i-1].ID = i; printf("\t\t\t 请输入书名\n\n\t\t\t "); scanf("%s",str); strcpy(stu[i-1].name, str); fprintf(fp, "%s\n",str); printf("\t\t\t 请输入价格\n\n\t\t\t "); scanf("%lf",&q); stu[i-1].price = q; fprintf(fp, "%.2lf\n",q); printf("\t\t\t 请输入作者\n\n\t\t\t "); scanf("%s",str); strcpy(stu[i-1].author, str); fprintf(fp, "%s\n",str); printf("\t\t\t 请输入该书的数量\n\n\t\t\t "); scanf("%d",&p); stu[i-1].quan = p; fprintf(fp, "%d\n",p); printf("\t\t\t 请输入该书的简介\n\n\t\t\t "); scanf("%s",st); strcpy(stu[i-1].itd, st); fprintf(fp, "%s\n",st); } num += n; fclose(fp); save(); saveuu(); system("PAUSE"); system("cls");}void beifen(void){ FILE *fp; if((fp = fopen("删除.txt", "r")) == NULL){ printf("数据库加载失败,请重启本系统!\n"); return ; } fscanf(fp, "%d",&num); fclose(fp);}void shan(void){ FILE *fp; if((fp = fopen("删除.txt", "w")) == NULL){ printf("数据库加载失败,请重启本系统!\n"); return ; } fprintf(fp, "%d\n", num); fclose(fp);}//删除所有信息void DeleteAll(){ FILE *fp; if((fp = fopen("缓存区.txt", "w")) == NULL){ printf("数据库加载失败,请重启本系统!\n"); return ; } fprintf(fp, "0"); printf("\t\t\t删除成功,若想恢复请恢复备份!!\n\t\t\t"); fclose(fp); num = 0; saveuu(); system("PAUSE"); system("cls");}void DeleteRecord()//删除一条信息{ int j,i,flag = 0; printf("\t\t\t 请输入书号\n\t\t\t "); oo = scanf("%d",&j); if(!oo){ inwrong(); return ; } if(j == num){ num--; save(); printf("\t\t\t 删除成功!\n\t\t\t "); system("PAUSE"); system("cls"); return ; } for(i = 0 ; i < num-1; i++){ if(stu[i].ID == j) flag = 1; if(flag){ strcpy(stu[i].name, stu[i+1].name); stu[i].price = stu[i+1].price; strcpy(stu[i].name, stu[i+1].name); stu[i].quan = stu[i+1].quan; strcpy(stu[i].itd, stu[i+1].itd); } } num--; save(); saveuu(); printf("\t\t\t删除成功!\n"); system("PAUSE"); system("cls");}//修改void edit(){ system("cls"); load(); int i,sele; while(1){ PrinEdit(); oo = scanf("%d",&sele); if(!oo){ inwrong(); continue; } switch(sele){ case 1: add(); break; case 2: DeleteRecord(); break; case 3: DeleteAll(); break; case 4: system("cls"); return ; default : system("cls"); hhk(); break; } }}//输出查找菜单void FindEdit(){ printf("\t ************************************************************\n"); printf("\t * *\n"); printf("\t * 您可以进行以下操作: *\n"); printf("\t * *\n"); printf("\t * 按书号查找 请按 1 *\n"); printf("\t * *\n"); printf("\t * 按书名查找 请按 2 *\n"); printf("\t * *\n"); printf("\t * 按作者查找 请按 3 *\n"); printf("\t * *\n"); printf("\t * 输出所有图书信息 请按 4 *\n"); printf("\t * *\n"); printf("\t * 返回上一级菜单 请按 5 *\n"); printf("\t * *\n"); printf("\t ************************************************************\n\n");}//按书号查找void FindByNum(void){ system("cls"); if(num == 0){ printf("\n\n\t\t\t数据库中暂没有图书信息,请添加图书信息\n\n\t\t\t "); system("PAUSE"); return ; } int i,sex; printf("\t\t\t 请输入要查找的书号:\n\n\t\t\t\t"); oo = scanf("%d",&sex); if(!oo){ inwrong(); return ; } if(sex > num){ printf("\t\t\t\t未找到该书!!\n\n\t\t\t "); system("PAUSE"); return ; } for(i = 0; i < num; i++){ if(stu[i].ID == sex){ PrintRecord(i); printf("\t\t\t "); system("PAUSE"); return; } }}//按书名查找void FindByName(){ system("cls"); if(num == 0){ printf("\n\n\t\t\t数据库中暂没有图书信息,请添加图书信息\n\n\t\t\t "); system("PAUSE"); return ; } int i; char s[30]; printf("\t\t\t 请输入要查找的书名:\n\n\t\t\t "); scanf("%s",s); for(i = 0; i < num; i++){ if(strcmp(stu[i].name, s) == 0){ if(F == 1) PrintRecord(i); else if(!F){ if(stu[i].quan == 0 && huan == 1) F = 99998; else if(stu[i].quan != 0 || huan == 0){ PrintRecord(i); F = i; } } printf("\t\t\t "); system("PAUSE"); return ; } } F = 99999; printf("\n\t\t\t 未找到该书!!\n"); printf("\n\t\t\t "); system("PAUSE");}//按作者查找void FindByAuthor(){ system("cls"); if(num == 0){ printf("\n\n\t\t\t数据库中暂没有图书信息,请添加图书信息\n\n\t\t\t "); system("PAUSE"); return ; } int i; char s[30]; printf("\t\t\t 请输入要查找的作者\n\n\t\t\t "); scanf("%s",s); for(i = 0; i < num; i++){ if(strcmp(stu[i].author, s) == 0){ PrintRecord(i); printf("\t\t\t "); system("PAUSE"); return ; } } printf("\n\t\t\t\t未找到有关该作者的书!!\n\n\t\t\t "); system("PAUSE");}//输出所有图书信息void output(){ int i; if(num == 0){ printf("\n\n\t\t\t数据库中暂没有图书信息,请添加图书信息\n\n\t\t\t "); system("PAUSE"); system("cls"); return ; } for(i = 0; i < num; i++){ PrintRecord(i); } printf("\t\t\t "); system("PAUSE");}//查找void Find(){ system("cls"); int i,sclele; F = 1; while(1){ FindEdit(); oo = scanf("%d",&sclele); if(!oo){ inwrong(); continue; } switch(sclele){ case 1: FindByNum(); break; case 2: FindByName(); break; case 3: FindByAuthor(); break; case 4: output(); break; case 5: system("cls"); return ; default : system("cls"); hhk(); break; } system("cls"); }}//排序void Sort(){ system("cls"); int sexh; while(1){ system("cls"); PrintSort(); oo = scanf("%d",&sexh); if(!oo){ inwrong(); continue; } switch(sexh){ case 1: SortByScore(); break; case 2: AscendVyPick(); break; case 3: DesendByPick(); break; case 4: system("cls"); return ; default : system("cls"); hhk(); break; } }}//输出排序菜单void PrintSort(){ printf("\t ************************************************************\n"); printf("\t * *\n"); printf("\t * 您可以进行以下操作: *\n"); printf("\t * *\n"); printf("\t * 按书名首字母排序 请按 1 *\n"); printf("\t * *\n"); printf("\t * 按单价升序排序 请按 2 *\n"); printf("\t * *\n"); printf("\t * 按单价降序排序 请按 3 *\n"); printf("\t * *\n"); printf("\t * 返回上一级菜单 请按 4 *\n"); printf("\t * *\n"); printf("\t ************************************************************\n\n");}//按书名首字母排序判断int cmp1(library a, library b){ if(strcmp(a.name, b.name) == -1) return 1; else return 0;}//按单价升序排序判断int cmp2(library a, library b){ return a.price < b.price;}//按单价降序排序判断int cmp3(library a, library b){ return a.price > b.price;}//重新整理书号void IdArrange(){ int i; for(i = 0; i < num; i++) stu[i].ID = i+1;}//按书名首字母排序void SortByScore(){ int i; sort(stu, stu+num, cmp1); IdArrange(); save(); printf("\n\t\t\t\t排序完成!!\n\n\t\t\t "); system("PAUSE");}//按单价升序排序void AscendVyPick(){ int i; sort(stu, stu+num, cmp2); IdArrange(); save(); printf("\n\t\t\t\t排序完成!!\n\n\t\t\t "); system("PAUSE");}//按单价降序排序void DesendByPick(){ int i; sort(stu, stu+num, cmp3); IdArrange(); save(); printf("\n\t\t\t\t排序完成!!\n\n\t\t\t "); system("PAUSE");}//打印借书菜单void PrintBorrow(void){ printf("\t ************************************************************\n"); printf("\t * *\n"); printf("\t * 您可以进行以下操作: *\n"); printf("\t * *\n"); printf("\t * 借书记录查询 请按 1 *\n"); printf("\t * *\n"); printf("\t * 图书借阅 请按 2 *\n"); printf("\t * *\n"); printf("\t * 图书归还 请按 3 *\n"); printf("\t * *\n"); printf("\t * 返回上一级菜单 请按 4 *\n"); printf("\t * *\n"); printf("\t ************************************************************\n\n");}//将用户借书记录加载到磁盘void saveBorrow(L head){ int i; L p = head->Next; FILE *fp; fp = fopen("借书记录.txt", "w"); while(p){ fprintf(fp, "%s\n", p->users); fprintf(fp, "%d\n", p->sexes); for(i = 0; i < p->sexes; i++){ fprintf(fp, "%s\n", p->book[i].Name); fprintf(fp, "%s\n", p->book[i].time); } fprintf(fp, "%d\n", p->r); p = p->Next; } fclose(fp);}//将借书记录加载到内存void loadBorrow(L head){ int i,j; L p, rear = head; freopen("借书记录.txt", "r", stdin); for(i = 0; i < k; i++){ p = new node; scanf("%s",p->users); scanf("%d",&p->sexes); for(j = 0; j < p->sexes; j++){ scanf("%s",p->book[j].Name); scanf("%s",p->book[j].time); } scanf("%d\n",&p->r); rear->Next = p; rear = p; } rear->Next = NULL; freopen("CON", "r", stdin); if(hnj != NULL){ rear->Next = kl; rear = kl; } rear->Next = NULL; saveBorrow(head);}//用户搜索L LookUser(L head){ L p = head; while(p){ p = p->Next; if(strcmp(p->users, strr) == 0) break; } return p;}//借书记录void BorrowRecord(L q){ int i; system("cls"); printf("\t\t借书的数量:%d\n\n",q->sexes); for(i = 0; i < q->sexes; i++){ printf("\t\t%d.%s\n",i+1, q->book[i].Name); printf("\t\t 借书时间:%s\n\n",q->book[i].time); } printf("\t\t信誉值:%d\n\n",q->r); printf("\t\t\t "); system("PAUSE"); system("cls");}//借书void BorrowBook(L q, L y){ int o,i; char str[30]; huan = 1; system("cls"); if(q->r < 60){ printf("\n\n"); printf("\t\t\t信誉值低于60,不能进行借书操作!!\n\n\t\t\t "); system("PAUSE"); system("cls"); return ; } F = 0; FindByName(); if(F == 99998){ printf("\n"); printf("\t\t\tSORRY,该书已没有库存!!\n\n\t\t\t "); system("PAUSE"); system("cls"); F = 1; return ; } else if(F == 99999){ system("cls"); return ; } strcpy(q->book[q->sexes].Name, stu[F].name); stu[F].quan--; printf("\n\t\t请输入借书时间(格式为year/month/day):\n\n\t\t\t "); scanf("%s",str); strcpy(q->book[q->sexes].time, str); q->sexes++; F = 1; save(); saveBorrow(y); printf("\n\t\t\t\t借书成功!!\n\n\t\t\t "); system("PAUSE"); system("cls");}//还书void SendBook(L q, L y){ system("cls"); int i,kk=0,flag = 1; char st[30]; F = huan = 0; if(q->sexes == 0){ printf("\n\t\t\t 您还没有借书哦!!\n\n\t\t\t "); system("PAUSE"); system("cls"); return ; } FindByName(); if(F == 99999){ system("cls"); return ; } for(i = 0; i < q->sexes; i++) if(strcmp(q->book[i].Name, stu[F].name) == 0) flag = 0; if(flag){ system("cls"); printf("\n\t\t\t 您还没有借该书哦!!\n\n\t\t\t "); system("PAUSE"); system("cls"); return ; } for(i = 0; i < q->sexes; i++){ if(strcmp(q->book[i].Name, stu[F].name) == 0 && kk == 0){ strcpy(st, q->book[i].time); if(i == q->sexes-1) break; kk = 1; } if(kk){ strcpy(q->book[i].Name, q->book[i+1].Name); strcpy(q->book[i].time, q->book[i+1].time); } } q->sexes--; stu[F].quan++; save(); for(i = 1; i <= 16; i++) printf(" "); printf("\t\t\t借书时间:%s\n\n",st); printf("\t\t 请管理员判断是否逾期还书或图书有破损\n\n\t\t\t "); system("PAUSE"); printf("\n\t\t 按时还书 请按 1\n\n"); printf("\t\t 逾期还书但不超过一个工作日 请按 2\n\n"); printf("\t\t 还书时间超过一个工作日 请按 3\n\n"); printf("\t\t 图书有破损 请按 4\n\n\t\t "); scanf("%d",&kk); if(kk == 1) printf("\n\t\t\t\t感谢您的使用!!\n\n"); else if(kk == 2){ q->r -= 5; if(q->r < 60) printf("由于您的不良行为较多,信誉值已不足60,本年度将不能在本系统借书!!\n\n"); else printf("请保持良好的借书行为,信誉不足将无法在本系统借书!!\n\n"); } else if(kk == 3){ q->r = 0; printf("由于您的还书时间超过规定时间一个工作日,所以本年度将不能在本系统借书!!\n\n"); } else if(kk == 4){ q->r -= 10; printf("\t\t\t由于图书有破损,请原价赔偿!!\n\n"); for(i = 0; i < num; i++) if(strcmp(stu[i].name, stu[F].name) == 0){ printf("\t\t\t\t原价:%.2lf\n\n",stu[i].price); break; } if(q->r < 60) printf("由于您的不良行为较多,信誉值已不足60,本年度将不能在本系统借书!!\n\n"); else printf("请保持良好的借书行为,信誉不足将无法在本系统借书!!\n\n"); } saveBorrow(y); printf("\t\t\t "); system("PAUSE"); system("cls");}//图书借还系统void Borrow(void){ system("cls"); int shl,i; L head = new node; loadBorrow(head); pre = LookUser(head); while(1){ PrintBorrow(); oo = scanf("%d", &shl); if(!oo){ inwrong(); continue; } switch(shl){ case 1: BorrowRecord(pre); break; case 2: BorrowBook(pre, head); break; case 3: SendBook(pre, head); break; case 4: system("cls"); return ; default : system("cls"); hhk(); break; } }}
图书管理系统