c语言课程设计--多功能图书管理系统

在这里插入图片描述
https://zionlove.site/library/#more

源代码链接:https://pan.baidu.com/s/1HMP4ZfcMITprYm4x_nNR6g 密码:17mg

基本框架来源于
[外链图片转存失败(img-71uAMMhZ-1562720365982)(/blog_image/library.png)]

完全使用链表
密码不回显(linux)
选项合法性检查

思路:
1.读入用户帐号信息,图书信息,借还图书信息,数据信息(用户个数,图书个数,借书用户个数)到全局变量的链表
2.增删的时候都会保存信息到磁盘

待完善的地方:
1.缺少初始化和恢复备份(已有)
2.新书发布提醒(已有)
3.用户还书时间提醒(已有)
4.全局变量不安全(传参失败)

缺少图书模糊搜索
应限制用户用户名不与图书名冲突
用户还书增加库存时也要判断是否为其他用户所预约
恢复出厂前设置应删除相应txt

环境DevC++

windows环境

/*************************************************************************> File Name: library_system.cpp> Author: zion> Mail: 1842212797@qq.com> Created Time: Tue 26 Feb 2019 16:56:47 PM CST************************************************************************/
//没有头节点,
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;typedef struct library
{int ID;//char name[50];//char author[50];//double price;char type[30];//类型按照中国图书馆图书分类法int ku;struct library *next;
}L,*LP;struct book
{char name[50];char author[50];int btime;int etime;
};typedef struct User
{char username[50];char password[50];int borrow;struct User *next;}U,*UP;typedef struct Borrow
{char user[50];int bronum;struct book b[50];struct Borrow *next;
}B,*BP;UP head = NULL;
LP headd = NULL;
BP headdd = NULL;
UP tail;
LP taill;
BP tailll;
int usernum;
int booknum;
int borrownum;void init();//文件初始化
void mainjm();//主界面
void ptdengrujm();//用户登入界面
void pt();//用户
void pt2(UP ct);//用户
void gl();//管理
void adduser();//注册
void refindpw();//找回密码
void changepw(UP ct);//修改密码
void ptjm(UP ct);//用户
void gljm();//管理
void addbook();//新增图书
void loaduser();//从磁盘导入用户信息到内存
void loadbook();//从磁盘导入图书信息到内存
void saveuser();//保存用户信息到磁盘
void savebook();//保存图书信息到磁盘
void findbookjm();//查询图书界面
void findbook();//查询图书
void findbyid();//按id查找
void findbyname();//按书名
void findbytype();//按类型
void findbyauthor();//按作者
void sortjm();//排序界面
void _fflush();//清空缓冲区,相当于fflush(stdin)
void checkc(int *c);//检验输入合法性
void checkp();//检验密码
void nodisplaypw(char *m,int *i);//密码不回显
void displ();//显示用户信息
void displb();//显示图书信息
void savedate();//保存数据信息到磁盘
void loaddate();//导入数据信息到内存
void deletbook();//删除图书
void backupbook();//备份图书
void sortbook();//排序
void sortname();//按书名首字母排序
void sortp1();//按价格降序
void sortp2();//按价格升序
void resort();//按id排序
void addborrow(UP ct);//借书
void saveborrow();//保存借书信息到磁盘
void loadborrow();//导入借书信息到内存
void delborrow(UP ct);//还书
void printbook(LP t);//打印图书信息
void displbb(UP ct);//显示借书记录
void gldisplbb();//显示 所有借书记录
void readme();
void encode(char *s);//加密
void decode(char *s);//
void reset();//恢复出厂前设置
void resetbackup();//恢复备份
void readmejm();
void readme1();
void readme3();
void readme2();
void changeku();//修改库存
void deluser();//注销
void systemnote1();//管理的系统消息
void systemnote2(UP ct);//用户的系统消息
void count();void init()
{FILE *fp1;FILE *fp2;FILE *fp3;FILE *fp4;fp1 = fopen("user.txt","a");	fclose(fp1);fp2 = fopen("date.txt","a");	fclose(fp2);fp3 = fopen("book.txt","a");	fclose(fp3);fp4 = fopen("borrow.txt","a");	fclose(fp4);
}void checkc(int *c)
{while(1){if ( cin.peek() == ' '){printf("\t\t\t非法字符!请重新输入:");_fflush();continue;}if (scanf("%d",c) != 1){printf("\t\t\t您的输入不符合要求!请重新输入:");}else if ( cin.peek() != '\n' ){printf("\t\t\t非法字符!请重新输入:");_fflush();continue;}elsebreak;_fflush();}}void _fflush()
{char ch;while(ch != EOF && (ch = getchar() != '\n'));
}
void nodisplaypw(char m[],int *i)
{//当i<0时,退格键会清除界面,加以判断char c;while((c = getch()) != '\r' ){//printf("%d",c);if(*i <= 0 && c == 8){continue;}else if (c != 8)//删除键127,退格键8{m[*i] = c;putchar('*');*i += 1;}else{putchar('\b');putchar(' ');putchar('\b');*i -= 1;}}m[*i] = '\0';//	_fflush();
}void mainjm()
{printf("\t\t\t****欢迎来到图书管理系统1.0*********\n");printf("\t\t\t*    1.我是普通用户                *\n");printf("\t\t\t*    2.我是管理员                  *\n");printf("\t\t\t*    3.readme                      *\n");printf("\t\t\t*    4.统计                        *\n");printf("\t\t\t*    5.退出系统                    *\n");printf("\t\t\t************************************\n");printf("\t\t\t请输入您的选择:");
}void ptdengrujm()
{system("cls");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************************************\n");printf("\t\t\t请输入您的选择:");
}void pt()
{while(1){int c;ptdengrujm();checkc(&c);switch(c){case 1:checkp();break;case 2:_fflush();adduser();break;case 3:refindpw();break;//	case 5:displ();break;case 4:system("cls");_fflush();return ;default :printf("\t\t\t无此选项!请重新输入:\n");system("cls");break;}}
}
void pt2(UP ct)
{while(1){int c;ptjm(ct);checkc(&c);switch(c){case 1:system("cls");findbook();system("cls");break;case 2:system("cls");sortbook();system("cls");break;case 3:system("cls");addborrow(ct);system("cls");break;case 4:system("cls");displbb(ct);system("cls");break;case 5:system("cls");delborrow(ct);system("cls");break;case 6:system("cls");changepw(ct);system("cls");break;case 7:system("cls");systemnote2(ct);system("cls");break;case 8:system("cls");_fflush();return ;default :printf("\t\t\t无此选项!请重新输入:\n");system("cls");break;}}
}void displbb(UP ct)
{int i;if(ct->borrow == 0){printf("\t\t\t您还没有借书!\n\t\t\t");_fflush();system("pause");return ;}BP t = headdd;while(t != NULL){if(strcmp(ct->username,t->user) == 0){printf("\t\t\t您共借了 %d 本书:\n",t->bronum);for (i = 0;i < t->bronum;i++){printf("\t\t\t书名:%s\n\t\t\t作者:%s\n\t\t\t借书时间:%d\n\t\t\t还书时间:",t->b[i].name,t->b[i].author,t->b[i].btime);if(t->b[i].etime == 0)printf("暂未归还!\n\n");elseprintf("%d\n\n",t->b[i].etime);}printf("\t\t\t");_fflush();system("pause");return ;}t = t->next;}
}void addborrow(UP ct)
{int year,mon,day,flag = 0;LP t = headd;char a[50],aa[50];printf("\t\t\t请输入您要借的书名:");scanf("%s",a);_fflush();printf("\t\t\t为您找到如下信息:\n");while(t != NULL){if(strcmp(t->name,a) == 0){printbook(t);flag = 1;}t = t->next;}if (flag == 0){printf("\t\t\t未找到该图书!\n");system("pause");return ;}t = headd;printf("\t\t\t请输入您要借的书作者:");scanf("%s",aa);flag = 0;while(t != NULL){if(strcmp(t->name,a) == 0 && strcmp(t->author,aa) == 0){if(t->ku == 0){printf("\t\t\t库存不足!已经自动帮您预约!\n\t\t\t");FILE *fp;char m[50];strcpy(m,t->name);if((fp = fopen(strcat(m,".txt"),"a")) == NULL){printf("\t\t\t文件打开失败!");}char mm[50];strcpy(mm,ct->username);fprintf(fp,"%s\n",strcat(mm,".txt"));fclose(fp);_fflush();system("pause");return ;}else{flag = 1;break;}}t = t->next;}if (flag == 0){printf("\t\t\t未找到该图书!\n");system("pause");return ;}else{printf("\t\t\t借书成功!请于一周内归还!\n");t->ku--;printbook(t);}time_t tt = time(NULL);tm *p = localtime(&tt);year = (1900 + p->tm_year);mon = (1 + p->tm_mon);day = (p->tm_mday);if(ct->borrow == 0){borrownum++;BP tn;tn = (struct Borrow *)malloc(sizeof(struct Borrow));strcpy(tn->user,ct->username);strcpy(tn->b[0].name,t->name);strcpy(tn->b[0].author,t->author);tn->b[0].btime = year*10000 + mon*100 + day;tn->b[ct->borrow].etime = 0;tn->bronum = ++ct->borrow;if(headdd != NULL){tailll->next = tn;tn->next = NULL;}else{headdd = tn;tn->next = NULL;}tailll = tn;}else{BP tn = headdd;while(tn != NULL && strcmp(tn->user,ct->username) != 0)tn = tn->next;strcpy(tn->b[ct->borrow].name,t->name);strcpy(tn->b[ct->borrow].author,t->author);tn->b[ct->borrow].btime = year*10000 + mon*100 + day;tn->b[ct->borrow].etime = 0;tn->bronum = ++ct->borrow;}saveuser();savedate();saveborrow();printf("\t\t\t");_fflush();system("pause");
}
void delborrow(UP ct)
{int i;char a[50],aa[50];int flag = 0;if(ct->borrow == 0){printf("\t\t\t您没有待归还的图书!");_fflush();system("pause");return ;}BP t = headdd;BP pre = NULL;while(t != NULL && strcmp(t->user,ct->username) != 0){pre = t;t = t->next;}printf("\t\t\t请输入您要还的书名:");scanf("%s",a);_fflush();printf("\t\t\t为您找到如下信息:\n");for(i = 0;i < t->bronum ; i++){if(strcmp(t->b[i].name,a) == 0 && t->b[i].etime == 0){printf("\t\t\t书名:%s\n\t\t\t作者:%s\n\t\t\t借书时间:%d\n\t\t\t还书时间:暂未归还!\n",t->b[i].name,t->b[i].author,t->b[i].btime);flag = 1;}}if(flag == 0){printf("\t\t\t您没有借此图书!");_fflush();system("pause");return ;}printf("\t\t\t请输入您要还的书作者:");scanf("%s",aa);flag = 0;for(i = 0;i < t->bronum;i++){if(strcmp(t->b[i].name,a) == 0 && strcmp(t->b[i].author,aa) == 0 && t->b[i].etime == 0){//ct->borrow = --t->bronum;time_t tt = time(NULL);tm *p = localtime(&tt);int year,mon,day;year = (1900 + p->tm_year);mon = (1 + p->tm_mon);day = p->tm_mday;t->b[i].etime = year*10000 + mon*100 + day;flag = 1;}}if(flag == 0){printf("\t\t\t您没有借此图书!");_fflush();system("pause");return ;}else{printf("\t\t\t还书成功!");LP ttt = headd;while(ttt != NULL){if(strcmp(ttt->name,a) == 0 && strcmp(ttt->author,aa) == 0){ttt->ku++;break;}ttt = ttt->next;}}if(ct->borrow == 0){printf("$\n");if(pre == NULL){headdd = t->next;}else{pre->next = t->next;}free(t);borrownum--;}saveuser();savedate();saveborrow();printf("\n\t\t\t");_fflush();system("pause");
}
void loadborrow()
{int i,j;FILE *fp;BP tnew;if((fp = fopen("borrow.txt","r")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}//判断文件是否为空fseek(fp,0L,SEEK_END);int size = ftell(fp);if(size == 0)return ;fclose(fp);fp = fopen("borrow.txt","r");for(i = 0;i < borrownum;i++){tnew = (struct Borrow *)malloc(sizeof(struct Borrow));fscanf(fp,"%s\t%d",tnew->user,&tnew->bronum);for(j = 0;j < tnew->bronum;j++){fscanf(fp,"%s\t%s\t%d\t%d",tnew->b[j].name,tnew->b[j].author,&tnew->b[j].btime,&tnew->b[j].etime);}if(headdd != NULL){tailll->next = tnew;tnew->next = NULL;}else{headdd = tnew;tnew->next = NULL;}tailll = tnew;}fclose(fp);}
void saveborrow()
{int i;FILE *fp;if((fp = fopen("borrow.txt","w")) == NULL){printf("\t\t\t打开文件失败!");exit(1);}BP t = headdd;while(t != NULL){fprintf(fp,"%s\t%d\n",t->user,t->bronum);for(i = 0; i < t->bronum;i++){fprintf(fp,"%s\t%s\t%d\t%d\n",t->b[i].name,t->b[i].author,t->b[i].btime,t->b[i].etime);}t = t->next;}fclose(fp);
}void sortbook()
{while(1){int c;sortjm();checkc(&c);switch(c){case 1:sortname();printf("\t\t\t排序如下!");displb();resort();system("cls");break;case 2:sortp2();printf("\t\t\t排序如下!");displb();resort();system("cls");break;case 3:sortp1();printf("\t\t\t排序如下!");displb();resort();system("cls");break;case 4:system("cls");_fflush();return ;default :printf("\t\t\t无此选项!请重新输入:");system("cls");break;}}
}void sortjm()
{printf("\t\t\t***************************************\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      您可以进行以下操作:            *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      1.按书名首字母排序(不支持中文) *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      2.按单价升序排序               *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      3.按单价降序排序               *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      4.返回上一级菜单               *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t***************************************\n");printf("\t\t\t请输入您的选择:");
}void findbookjm()
{printf("\t\t\t***************************************\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      您可以进行以下操作:            *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      1.按书号查找                   *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      2.按书名与价格区间组合查找     *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      3.按作者与价格区间组合查找     *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      4.按类型查找                   *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      5.输出所有图书信息             *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t*      6.返回上一级菜单               *\n");printf("\t\t\t*                                     *\n");printf("\t\t\t***************************************\n");printf("\t\t\t请输入您的选择:");
}void findbook()
{while(1){int c;findbookjm();checkc(&c);switch(c){case 1:findbyid();system("cls");break;case 2:findbyname();system("cls");break;case 3:findbyauthor();system("cls");break;case 4:findbytype();system("cls");break;case 5:displb();system("cls");break;case 6:system("cls");_fflush();return ;default :printf("\t\t\t无此选项!请重新输入:\n");system("cls");break;}}
}void printbook(LP t)
{printf("\t\t\tID:%d\n",t->ID);printf("\t\t\t书名:%s\n",t->name);printf("\t\t\t作者:%s\n",t->author);printf("\t\t\t类型:%s\n",t->type);printf("\t\t\t价格:%.2f\n",t->price);printf("\t\t\t库存:%d\n\n",t->ku);
}void findbyid()
{if(booknum == 0){printf("\t\t\t库中无图书信息!");_fflush();system("pause");return ;}int i;LP t = headd;printf("\t\t\t请输入要查找的书ID:");scanf("%d",&i);while(t != NULL && t->ID != i)t = t->next;if (t == NULL)printf("\t\t\t没有找到该图书!\n");elseprintbook(t);printf("\t\t\t");_fflush();system("pause");
}void findbyname()
{int flag = 1;char a[50];double l = 0,r = 0x3f3f3f3f;printf("\t\t\t请输入要查找的书名:");scanf("%s",a);_fflush();printf("\t\t\t请输入价格区间(格式:l r)(不输入将输出所有符合条件图书):\n\t\t\t");if(cin.peek() == '\n');elsescanf("%lf %lf",&l,&r);LP t = headd;while(t != NULL){if(strcmp(t->name,a) == 0 && t->price >= l && t->price <= r){flag = 0;printbook(t);}t = t->next;}if (flag)printf("\t\t\t没有找到该图书!\n");printf("\t\t\t");_fflush();system("pause");
}void findbyauthor()
{char a[50];int flag = 1;double l = 0,r = 0x3f3f3f3f;printf("\t\t\t请输入要查找的图书作者:");scanf("%s",a);_fflush();printf("\t\t\t请输入价格区间(格式:l r)(不输入将输出所有符合条件图书):\n\t\t\t");if(cin.peek() == '\n');elsescanf("%lf %lf",&l,&r);LP t = headd;while(t != NULL){if(strcmp(t->author,a) == 0 && t->price >= l && t->price <= r){flag = 0;printbook(t);}t = t->next;}if (flag)printf("\t\t\t没有找到该作者的图书!\n");printf("\t\t\t");_fflush();system("pause");}void findbytype()
{char a[50];int flag = 0;printf("\t\t\t请输入要查找的类型:");scanf("%s",a);LP t = headd;while(t != NULL ){if(strcmp(t->type,a) == 0){printbook(t);flag = 1;}t = t->next;}if (flag == 0)printf("\t\t\t没有找到该类型的图书!\n");printf("\t\t\t");_fflush();system("pause");
}void changepw(UP ct)
{int i = 0,j = 0,flag = 0;char p[50],q[50];_fflush();printf("\t\t\t新密码:");nodisplaypw(p,&i);encode(p);strcpy(ct->password,p);printf("\n\t\t\t请再次输入新密码:");nodisplaypw(q,&j);encode(q);if(strcmp(ct->password,q) != 0){printf("\n\t\t\t两次密码不一样请重新修改!\n");flag = 1;_fflush();changepw(ct);}if(flag)return ;printf("\n\t\t\t修改成功!\n\t\t\t");saveuser();_fflush();system("pause");
}void checkp()
{int flag = 0,k,kk,i = 0;char u[50],p[50],rp[50];printf("\t\t\t账号:");scanf("%s",u);UP ct = head;if (ct == NULL){printf("\t\t\t此账号没有被注册!\n\t\t\t");_fflush();system("pause");return ;}else{while(ct != NULL){if(strcmp(ct->username,u) == 0){flag = 1;strcpy(rp,ct->password);break;}ct = ct->next;}}if(flag == 0){printf("\t\t\t此账号没有被注册!\n\t\t\t");_fflush();system("pause");return ;}printf("\t\t\t密码:");_fflush();nodisplaypw(p,&i);encode(p);if(strcmp(rp,p) == 0){flag = 2;//h = 0;}if(flag == 1){printf("\n\t\t\t密码错误!\n\t\t\t");system("pause");return ;}else if(flag == 2){printf("\n\t\t\t请输入下面的验证码:\n");srand((unsigned)time(NULL));k = rand();printf("\t\t\t----------------\n");printf("\t\t\t-   %d         -\n",k);printf("\t\t\t----------------\n\t\t\t");checkc(&kk);if(kk != k){printf("\t\t\t验证码错误!请重新登入!\n\t\t\t");_fflush();	system("pause");return ;}system("cls");pt2(ct);}
}void refindpw()
{UP tt = head;char t[50];printf("\t\t\t请输入要找回的账号:");scanf("%s",t);while(tt != NULL){if(strcmp(tt->username,t) == 0){strcpy(t,tt->password);decode(t);printf("\t\t\t密码:%s\n\t\t\t",t);_fflush();system("pause");return ;}tt = tt->next;}printf("\t\t\t查无此账号!\n\t\t\t");_fflush();system("pause");}void saveuser()
{int i;UP t = head;FILE *fp;if ((fp = fopen("user.txt","w")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}while(t != NULL){fprintf(fp,"%s %s %d\n",t->username,t->password,t->borrow);t = t->next;}fclose(fp);}void adduser()
{int i = 0,j = 0,k = 0,flag = 0;UP t = head;UP tnew;tnew = (struct User *)malloc(sizeof(struct User));if(tnew == NULL)exit(1);char u[50],p[50],q[50];printf("\t\t\t请输入账号(由字母和数字组成):");while(cin.peek() != '\n'){u[k] = cin.get();if((u[k] >= 48 && u[k] <= 57) || (u[k] >= 65 && u[k] <= 90) || (u[k] >= 97 && u[k] <= 122))k++;else{printf("\t\t\t非法字符!请重新申请!\n");flag = 1;_fflush();adduser();}}if(flag)return ;if(k == 0){printf("\t\t\t申请失败!");system("pause");return ;}u[k] = '\0';while(t != NULL){if(strcmp(t->username,u) == 0){printf("\n\t\t\t该账号已经被注册!请重新申请!\n");_fflush();flag = 1;adduser();}t = t->next;}if(flag)return ;strcpy(tnew->username,u);_fflush();printf("\t\t\t请输入密码:");nodisplaypw(p,&i);encode(p);strcpy(tnew->password,p);printf("\n\t\t\t请再次输入密码:");nodisplaypw(q,&j);encode(q);if(strcmp(tnew->password,q) != 0){printf("\n\t\t\t两次密码不一样!请重新申请!\n");flag = 1;_fflush();adduser();}if(flag)return ;tnew->borrow = 0;if(head != NULL){tail->next = tnew;tnew->next = NULL;}else{head = tnew;tnew->next = NULL;}tail = tnew;saveuser();usernum++;savedate();printf("\n\t\t\t恭喜你成为第 %d 位用户\n\t\t\t",usernum);system("pause");
}
void loaduser()
{UP temp;FILE *fp;if ((fp = fopen("user.txt","r")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}char zh[50];char mima[50];int b;int num,i;fseek(fp,0L,SEEK_END);int size = ftell(fp);if(size == 0)return ;fclose(fp);fp = fopen("user.txt","r");while (fscanf(fp,"%s%s%d",zh,mima,&b) != EOF){temp = (struct User *)malloc(sizeof(struct User));if(temp == NULL)exit(1);strcpy(temp->username,zh);strcpy(temp->password,mima);temp->borrow = b;if(head != NULL){tail->next = temp;temp->next = NULL;}else{head = temp;temp->next = NULL;}tail = temp;}fclose(fp);}
void displ()
{UP t = head;char z[50],m[50];printf("\n\t\t\t系统共有 %d 位用户\n",usernum);printf("\t\t\t用户名\t\t密码\n");while(t != NULL){strcpy(z,t->username);strcpy(m,t->password);decode(m);printf("\t\t\t%s\t\t%s\n",z,m);t = t->next;}printf("\t\t\t");_fflush();system("pause");
}void ptjm(UP ct)
{printf("\n\n\n\n\t\t\t*****************************************\n");printf("\t\t\t*   亲爱的用户 %s 欢迎您的到来 !!  *\n",ct->username);printf("\t\t\t*****************************************\n");printf("\t\t\t************************************\n");printf("\t\t\t*         您可以进行以下操作       *\n");printf("\t\t\t************************************\n");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*           6.更改密码             *\n");printf("\t\t\t*           7.查看系统消息         *\n");printf("\t\t\t*           8.退出登入             *\n");printf("\t\t\t************************************\n");printf("\t\t\t请输入您的选择:");
}void gl()
{char m[50];int i = 0;printf("\t\t\t请输入管理员密码(返回请直接按回车键):");nodisplaypw(m,&i);char gl[20];FILE *fp = fopen("readme.txt","r");if(fp == NULL)strcpy(gl,"04182004");elsefscanf(fp,"管理员密码:%s\n",gl);fclose(fp);if (i == 0){system("cls");return ;}else if (!strcmp(gl,m))printf("\n\t\t\t登入成功!\n");else{printf("\n\t\t\t密码错误!系统退出!\n");exit(0);}//	Sleep(2000);system("cls");while(1){int c;gljm();checkc(&c);switch(c){case 1:system("cls");addbook();system("cls");break;case 2:system("cls");displb();system("cls");break;case 3:system("cls");deletbook();system("cls");break;case 4:system("cls");changeku();system("cls");break;case 5:backupbook();break;case 6:resetbackup();break;case 7:system("cls");displ();system("cls");break;case 8:system("cls");gldisplbb();system("cls");break;case 9:system("cls");deluser();system("cls");break;case 10:reset();break;case 11:system("cls");systemnote1();system("cls");break;case 12:system("cls");_fflush();return ;default :system("cls");break;}}
}
void changeku()
{LP t = headd;int i,tt;printf("\t\t\t请输入您要修改的图书id:");scanf("%d",&i);if(i <= 0 || i > booknum){printf("\t\t\t查无此图书!\n\t\t\t");_fflush();system("pause");return ;}while(t != NULL && t->ID != i)t = t->next;printbook(t);tt = t->ku;printf("\t\t\t请输入该图书新库存:");scanf("%d",&t->ku);savebook();if(t->ku > 0){time_t tt = time(NULL);tm *p = localtime(&tt);int year = (1900 + p->tm_year);int mon = (1 + p->tm_mon);int day = (p->tm_mday);FILE *fp;char m[50];strcpy(m,t->name);if((fp = fopen(strcat(m,".txt"),"r")) == NULL){printf("\t\t\t修改成功!\n\t\t\t");_fflush();system("pause"); return ;}char n[50];while(fscanf(fp,"%s",n) != EOF){FILE *fpp;fpp = fopen(n,"a");fprintf(fpp,"您预约的 %s (作者 %s)已增加库存,请及时借阅!-----%d\n",t->name,t->author,year*10000 + mon*100 + day);fclose(fpp);}fclose(fp);remove(m);}printf("\t\t\t修改成功!\n\t\t\t");_fflush();system("pause");
}void loadbook()
{LP temp;FILE *fp;if((fp = fopen("book.txt","r")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}int ID;char a[20];char n[20];char t[20];double p;int k;fseek(fp,0L,SEEK_END);int size = ftell(fp);if(size == 0)return ;fclose(fp);fp = fopen("book.txt","r");while(fscanf(fp,"%d\t%s\t%s\t%s\t%lf\t%d",&ID,n,a,t,&p,&k) != EOF){temp = (struct library *)malloc(sizeof(struct library));if(temp == NULL)exit(1);temp->ID = ID;strcpy(temp->name,n);strcpy(temp->author,a);strcpy(temp->type,t);temp->price = p;temp->ku = k;if(headd != NULL){taill->next = temp;temp->next = NULL;}else{headd = temp;temp->next = NULL;}taill = temp;}fclose(fp);}
void savebook()
{LP t = headd;FILE *fp;if((fp = fopen("book.txt","w")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}while(t != NULL){fprintf(fp,"%d\t%s\t%s\t%s\t%lf\t%d\n",t->ID,t->name,t->author,t->type,t->price,t->ku);t = t->next;}fclose(fp);}
void addbook()
{LP tnew;tnew = (struct library *)malloc(sizeof(struct library));if (tnew == NULL)exit(1);printf("\t\t\t书名:");scanf("%s",tnew->name);printf("\t\t\t作者:");scanf("%s",tnew->author);printf("\t\t\t类型:");scanf("%s",tnew->type);printf("\t\t\t价格:");scanf("%lf",&tnew->price);if(tnew->price <= 0){printf("\t\t\t价格错误!添加失败!");_fflush();system("pause");return ;}if(tnew->type[0] < 'A' || tnew->type[0] > 'Z'){printf("\t\t\t类型错误!添加失败!");_fflush();system("pause");return ;}tnew->ku = 10;LP t = headd;while(t != NULL){if((strcmp(tnew->name,t->name) == 0) &&  (strcmp(tnew->author,t->author) == 0) && (strcmp(tnew->type,t->type) == 0) && (tnew->price==t->price)){printf("\t\t\t正在新增重复图书!该图书库存+1\n\t\t\t");t->ku++; savebook();_fflush();system("pause");return;}else if((strcmp(tnew->name,t->name) == 0) &&  (strcmp(tnew->author,t->author) == 0) && (strcmp(tnew->type,t->type) == 0)){printf("\t\t\t价格错误!添加失败!\n\t\t\t");_fflush();system("pause");return ;}else if((strcmp(tnew->name,t->name) == 0) &&  (strcmp(tnew->author,t->author) == 0)){printf("\t\t\t类型错误!添加失败!\n\t\t\t");_fflush();system("pause");return ;}t = t->next;}tnew->ID = ++booknum;savedate();if(headd != NULL){taill->next = tnew;tnew->next = NULL;}else{headd = tnew;tnew->next = NULL;}taill = tnew;savebook();UP sys1 = head;time_t tt = time(NULL);tm *p = localtime(&tt);int year = (1900 + p->tm_year);int mon = (1 + p->tm_mon);int day = (p->tm_mday);while(sys1 != NULL){FILE *fp;char m[50];strcpy(m,sys1->username);if((fp = fopen(strcat(m,".txt"),"a")) == NULL){printf("\t\t\t打开文件失败!");exit(1);}fprintf(fp,"新书 %s (作者:%s)强势入驻图书馆,欢迎借阅!  ----%d\n",tnew->name,tnew->author,year*10000 + mon*100 + day);fclose(fp);sys1 = sys1->next;}printf("\t\t\t添加成功!\n\t\t\t");_fflush();system("pause");
}void deletbook()
{if(headd == NULL){printf("\t\t\t库中暂无图书!\n\t\t\t");_fflush();system("pause");}LP t;LP current = headd;LP previous = NULL;int i;printf("\t\t\t请输入您要删除的图书ID:");scanf("%d",&i);if(i <= 0 || i > booknum){printf("\t\t\t查无此图书!\n\t\t\t");_fflush();system("pause");return ;}while(current != NULL && current->ID != i){previous = current;current = current->next;}printf("\t\t\t已删除如下图书!\n");printbook(current);if(previous == NULL){headd = current->next;}else{previous->next = current->next;}LP tt = current->next;free(current);while(tt != NULL){tt->ID--;tt = tt->next;}savebook();booknum--;savedate();printf("\t\t\t删除成功!\n\t\t\t");_fflush();system("pause");
}void deluser()//注销用户 = 删除与此用户有关的所有信息
{if(head == NULL){printf("\t\t\t系统无用户!\n\t\t\t");_fflush();system("pause");}UP t;UP current = head;UP previous = NULL;char i[50];printf("\t\t\t请输入您要注销的用户名:");scanf("%s",i);while(current != NULL && strcmp(current->username,i) != 0){previous = current;current = current->next;}if(current == NULL){printf("\t\t\t查无此用户!\n\t\t\t");_fflush();system("pause"); return ;}if(current->borrow != 0){BP ttt = headdd;BP pre = NULL;while(ttt != NULL && strcmp(ttt->user,current->username) != 0){pre = ttt;ttt = ttt->next;}if(pre == NULL){headdd = ttt->next;}else{pre->next = ttt->next;}free(ttt);borrownum--;}printf("1\n");if(previous == NULL){head = current->next;}else{previous->next = current->next;}free(current);saveuser();usernum--;savedate();printf("\t\t\t注销成功!\n\t\t\t");_fflush();system("pause");
}void backupbook()
{LP t = headd;FILE *fp;if((fp = fopen("backup.txt","w+")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}while(t != NULL){fprintf(fp,"%d\t%s\t%s\t%s\t%lf\t%d\n",t->ID,t->name,t->author,t->type,t->price,t->ku);t = t->next;}printf("\t\t\t备份成功!\n\t\t\t");_fflush();system("pause");system("cls");fclose(fp);
}void displb()
{if(booknum == 0){printf("\t\t\t库中暂无图书!\n\t\t\t");system("pause"); return ;}LP t = headd;printf("\t\t\t库中共有 %d 本图书\n\n",booknum);printf("\t\t\tID\t书名\t作者\t类型\t价格\t库存\n");while(t != NULL){printf("\t\t\t%d\t%s\t%s\t%s\t%.2lf\t%d\n",t->ID,t->name,t->author,t->type,t->price,t->ku);//	Sleep(1000);t = t->next;}printf("\t\t\t");_fflush();system("pause");
}void gljm()
{printf("\t\t\t*************************************\n");printf("\t\t\t*    欢迎!管理员!                   *\n");printf("\t\t\t*************************************\n");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|       |  6. 恢复上一次备份图书     |\n");printf("\t\t\t-------------------------------------\n");printf("\t\t\t| 用户  |  7. 查看所有用户信息       |\n");printf("\t\t\t| 管理  |  8. 查看用户借书情况       |\n");printf("\t\t\t| 模块  |  9. 注销用户               |\n");printf("\t\t\t-------------------------------------\n");printf("\t\t\t|       |  10.恢复出厂前设置         |\n");printf("\t\t\t| 系统  |  11.查看系统消息           |\n");printf("\t\t\t| 设置  |  12.返回主菜单             |\n");printf("\t\t\t|------------------------------------|\n");printf("\t\t\t请输入您的选择:");}
void gldisplbb()
{int i;BP tt = headdd;if(tt == NULL){printf("\t\t\t暂无用户借书!\n\t\t\t");system("pause");return ;}printf("\t\t\t共有 %d 位用户借书!\n",borrownum);while (tt != NULL){printf("\t\t\t用户名 %s 的借书情况\n",tt->user);for(i = 0;i < tt->bronum;i++){printf("\t\t\t书名:%s\t作者:%s\t借书日期:%d\t还书日期:",tt->b[i].name,tt->b[i].author,tt->b[i].btime);if(tt->b[i].etime == 0)printf("暂未归还!\n");elseprintf("%d\n",tt->b[i].etime);}tt = tt->next;}printf("\t\t\t");_fflush();system("pause");
}int main()
{init();loaddate();loaduser();loadbook();loadborrow();while(1){int c;mainjm();checkc(&c);switch(c){case 1:system("cls");_fflush();pt();break;case 2:system("cls");_fflush();gl();break;case 3:system("cls");readme();break;case 4:system("cls");count();system("cls");break;case 5:return 0;default :printf("\t\t\t无此选项!请重新输入:");break;}}return 0;
}void loaddate()
{FILE *fp;if((fp = fopen("date.txt","r")) == NULL){printf("\t\t\t打开文件失败!");exit(1);}fseek(fp,0L,SEEK_END);int size = ftell(fp);if(size == 0)return ;fclose(fp);fp = fopen("date.txt","r");fscanf(fp,"%d",&usernum);fscanf(fp,"%d",&booknum);fscanf(fp,"%d",&borrownum);fclose(fp);
}void savedate()
{FILE *fp;if((fp = fopen("date.txt","w")) == NULL){printf("\t\t\t打开文件失败!");exit(1);}fprintf(fp,"%d\n",usernum);fprintf(fp,"%d\n",booknum);fprintf(fp,"%d\n",borrownum);fclose(fp);
}void sortp1()
{if(headd == NULL || headd->next == NULL)return ;LP q,p,t,pre;int i,j;for (i = 0;i < booknum - 1; i++){pre = NULL;p = headd;q = p->next;for (j = 0;j < booknum - 1 - i; j++){if((p->price) < (q->price)){if (j == 0){headd = headd->next;p->next = headd->next;headd->next = p;}else{pre->next = q;p->next = q->next;q->next = p;}t = p;p = q;q = t;}pre = p;p = p->next;q = q->next;}}
}
void sortp2()
{if(headd == NULL || headd->next == NULL)return ;LP q,p,t,pre;int i,j;for (i = 0;i < booknum - 1; i++){pre = NULL;p = headd;q = p->next;for (j = 0;j < booknum - 1 - i; j++){if(p->price > q->price){if (j == 0){headd = headd->next;p->next = headd->next;headd->next = p;}else{pre->next = q;p->next = q->next;q->next = p;}t = p;p = q;q = t;}pre = p;p = p->next;q = q->next;}}
}
void resort()
{if(headd == NULL || headd->next == NULL)return ;LP q,p,t,pre;int i,j;for (i = 0;i < booknum - 1; i++){pre = NULL;p = headd;q = p->next;for (j = 0;j < booknum - 1 - i; j++){if(p->ID > q->ID){if (j == 0){headd = headd->next;p->next = headd->next;headd->next = p;}else{pre->next = q;p->next = q->next;q->next = p;}t = p;p = q;q = t;}pre = p;p = p->next;q = q->next;}}
}
void sortname()
{if(headd == NULL || headd->next == NULL)return ;LP q,p,t,pre;int i,j;for (i = 0;i < booknum - 1; i++){pre = NULL;p = headd;q = p->next;for (j = 0;j < booknum - 1 - i; j++){if((p->name[0]) > (q->name[0])){if (j == 0){headd = headd->next;p->next = headd->next;headd->next = p;}else{pre->next = q;p->next = q->next;q->next = p;}t = p;p = q;q  = t;}pre = p;p = p->next;q = q->next;}}
}
void encode(char *s)
{char t;int l = strlen(s);int n = l/2;int count = 1,i = 0,j = 0;while(count < l){j = (j+n)%l;if(i!=j){t = s[i];s[i] = s[j];s[j] = t;}else{i++;j++;}count++;}
}
void decode(char *s)
{char t;int l = strlen(s);int k = l/3;int n = l - l/2;int count = 1,i = 0,j = 0;while(count < l){j = (j+n)%l;if(i!=j){t = s[i];s[i] = s[j];s[j] = t;}else{i++;j++;}count++;}
}
void reset()
{FILE *fp1,*fp2,*fp3,*fp4;fp1 = fopen("date.txt","w");fclose(fp1);fp2 = fopen("user.txt","w");fclose(fp2);fp3 = fopen("book.txt","w");fclose(fp3);fp4 = fopen("borrow.txt","w");fclose(fp4);printf("\t\t\t重置成功!请重启系统!\n\t\t\t");printf("3");Sleep(1000);printf("\b");printf("2");Sleep(1000);printf("\b");printf("1");Sleep(1000);exit(0);}
void resetbackup()
{int k = 0;FILE *fp;LP temp;FILE *fpp;if((fpp = fopen("backup.txt","r")) == NULL){printf("\t\t\t暂无备份信息!\n");return ;}fp = fopen("book.txt","w");fclose(fp);while(headd != NULL){temp = headd;headd = headd->next;free(temp);}LP tai;int ID;char a[20];char n[20];char t[20];double p;int kk;while(fscanf(fpp,"%d\t%s\t%s\t%s\t%lf\t%d",&ID,n,a,t,&p,&kk) != EOF){temp = (struct library *)malloc(sizeof(struct library));if(temp == NULL)exit(1);temp->ID = ID;strcpy(temp->name,n);strcpy(temp->author,a);strcpy(temp->type,t);temp->price = p;temp->ku = kk;if(headd != NULL){tai->next = temp;temp->next = NULL;}else{headd = temp;temp->next = NULL;}tai = temp;k++;}booknum = k;fclose(fpp);savebook();savedate();printf("\t\t\t恢复成功!\n\t\t\t");system("pause");system("cls");
}
void readme()
{while(1){readmejm();int c;checkc(&c);switch (c){case 1:readme1();system("cls");break;case 2:readme2();system("cls");break;case 3:readme3();system("cls");break;case 4:system("cls");_fflush();return ;default :printf("\t\t\t无此选项!请重新输入:");break;}}
}
void readmejm()
{printf("\n\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**********************************\n");printf("\t\t\t请输入您的选择:");
}void readme1()
{system("explorer https://zionlove.site/library");system("cls");
}void readme3()
{system("alipay.jpg");system("wechatpay.jpg");
}
void readme2()
{system("readme.txt");
}void systemnote1()
{int i;LP t = headd;BP tt = headdd;int flag1 = 0;int flag2 = 0;printf("\n\n\t\t\t------------------图书信息------------------------\n");while(t != NULL){if(t->ku <= 2){printf("\t\t\t ID: %d 图书:%s 作者:%s 库存已经不足!请及时添加!\n",t->ID,t->name,t->author);flag1 =1;}t = t->next;}if(flag1 == 0)printf("\t\t\t暂无信息!\n");printf("\n\n\t\t\t------------------用户信息------------------------\n");while(tt != NULL){for(i = 0;i < borrownum;i++){if(tt->bronum != 0 && (tt->b[i].etime - tt->b[i].btime > 7)){printf("\t\t\t 用户:%s 所借图书:%s (作者 :%s) 已经逾期 %d 天 暂未归还!\n",tt->user,tt->b[i].name,tt->b[i].author,tt->b[i].etime - tt->b[i].btime - 7);flag2=1;}}tt = tt->next;}if(flag2 == 0)printf("\t\t\t暂无信息!\n\t\t\t");system("pause");
}void systemnote2(UP ct)
{int i;BP tt = headdd;int flag = 0;FILE *fp;char m[50];strcpy(m,ct->username);if((fp = fopen(strcat(m,".txt"),"r")) != NULL){char ss[100];while(fgets(ss,100,fp) != NULL){printf("\t\t\t%s\n",ss);flag = 1;}}fclose(fp);while(tt != NULL && strcmp(ct->username,tt->user) != 0){tt = tt->next;}if(tt == NULL){printf("\t\t\t暂无消息!\n\t\t\t");system("pause");return ;}for(i = 0;i < borrownum;i++){if(tt->bronum != 0 && (tt->b[i].etime - tt->b[i].btime > 7)){printf("\t\t\t 您所借图书:%s (作者 :%s) 已经逾期 %d 天 请及时归还!否则系统将注销您的账户\n",tt->b[i].name,tt->b[i].author,tt->b[i].etime - tt->b[i].btime - 7);flag=1;}}if(flag == 0)printf("\n\t\t\t暂无信息!\n\t\t\t");system("pause");
}void count()
{printf("\n\n\n\t\t\t-----------------------------------------\n");printf("\t\t\t|                                        |\n");printf("\t\t\t|     多功能图书管理系统1.0              |\n");printf("\t\t\t|                                        |\n");printf("\t\t\t-----------------------------------------\n");printf("\t\t\t-----------------------------------------\n");printf("\t\t\t|                                        |\n");printf("\t\t\t|     在库图书:%d 册                    |\n",booknum);printf("\t\t\t|                                        |\n");printf("\t\t\t-----------------------------------------\n");printf("\t\t\t-----------------------------------------\n");printf("\t\t\t|                                        |\n");printf("\t\t\t|     注册用户:%d 人                    |\n",usernum);printf("\t\t\t|                                        |\n");printf("\t\t\t-----------------------------------------\n");printf("\t\t\t-----------------------------------------\n");printf("\t\t\t|                                        |\n");printf("\t\t\t|     借书用户:%d 人                    |\n",borrownum);printf("\t\t\t|                                        |\n");printf("\t\t\t-----------------------------------------\n\t\t\t");system("pause");
}

linux环境

/*************************************************************************> File Name: library_system.cpp> Author: zion > Mail: 1842212797@qq.com > Created Time: Tue 26 Feb 2019 04:56:47 PM CST************************************************************************/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;char getch(void)//实现getch()功能 
{struct termios tmtemp,tm;char c;int fd = 0;if(tcgetattr(fd,&tm) != 0)return -1;tmtemp = tm;cfmakeraw(&tmtemp);if(tcsetattr(fd,TCSANOW,&tmtemp) != 0)return -1;c = getchar();if(tcsetattr(fd,TCSANOW,&tm) != 0)return 0;return c;
}typedef struct library 
{int ID;//序号char name[50];//书名char author[50];//作者double price;char type[30];//类型struct library *next;
}L,*LP;struct book 
{	char name[50];int btime;int etime;
};typedef struct User 
{char username[50];char password[50];int borrow;struct User *next;}U,*UP;typedef struct Borrow
{char user[50];int bronum;struct book b[50];struct Borrow *next;
}B,*BP;
LP headd = NULL;
LP taill;
UP head = NULL;
UP tail;
BP headdd = NULL;
BP tailll;
int usernum;
int booknum;
int borrownum;void mainjm();//主界面
void ptdengrujm();//普通用户登入界面
void pt();//用户登入
void gl();//管理登入
void adduser();//普通用户注册
void refindpw();//普通用户找回密码 
void changepw(UP ct);//普通用户修改密码
void ptjm(UP ct);//普通用户主菜单
void gljm();//管理人员菜单
void addbook();//增加图书信息
void loaduser();//将帐号信息读取到内存
void loadbook();//将图书信息读取到内存
void saveuser();//保存用户信息到磁盘
void savebook();//保存图书信息到磁盘
void findbookjm();//查找界面
void findbook();//图书查找 
void findbyid();//按id查
void findbyname();//按书名查
void findbytype();//按类型查 
void findbyauthor();//按作者查 
void sortjm();//排序界面 
void _fflush();//清空缓冲区相当于vc的fflush 
void checkc(int *c);//检查输入选项的合法性
void checkp();//校验帐号密码
void nodisplaypw(char *m,int *i);//实现输入密码不回显
void displ();//显示用户密码
void displb();//显示所有图书信息
void savedate();//保存用户数,图书数,借书用户数到磁盘
void loaddate();//读取到内存 
void deletbook();//删除图书 
void backupbook();//备份图书 
void sortbook();//排序 
void sortname();//按书名首字母排序 
void sortp1();//按价格升序
void sortp2();//按价格降序
void addborrow(UP ct);//用户借书记录
void saveborrow();//保存用户借书记录到磁盘
void loadborrow();//读取到内存 
void delborrow(UP ct);//用户还书
void printbook(LP t);//显示单本书
void displbb(UP ct);//显示用户借书记录
void gldisplbb();//显示所有用户借书记录void checkc(int *c)
{while(1){if ( cin.peek() == ' '){printf("\t\t\t非法输入!请重新输入:");_fflush();continue;}if (scanf("%d",c) != 1){printf("\t\t\t请输入整数!重新输入:");}else if ( cin.peek() != '\n' ) {printf("\t\t\t请勿输入多余字符!重新输入:");_fflush();continue;}else break;_fflush();}}void _fflush()
{char ch; while(ch != EOF && (ch = getchar() != '\n'));
}
void nodisplaypw(char m[],int *i)
{char c;while((c = getch()) != '\r'){if (c != 127)//马的删除键127,退格键8???{m[*i] = c;putchar('*');*i += 1;}else {putchar('\b');putchar(' ');putchar('\b');*i -= 1;}}m[*i] = '\0';//	_fflush();
}void FuactionIntrod(void);//系统功能介绍
void mainjm()
{printf("\t\t\t****欢迎来到图书管理系统1.0*********\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************************************\n");printf("\t\t\t请输入您的选择:");
}void ptdengrujm()
{system("clear");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************************************\n");printf("\t\t\t请输入您的选择:");
}void pt()
{while(1){int c;ptdengrujm();checkc(&c);switch(c){case 1:checkp();break;case 2:_fflush();adduser();break;case 3:refindpw();break;//	case 4:displ();break;case 4:system("clear");_fflush();return ;default :printf("\t\t\t无此选项,请重新输入!\n");system("clear");break;}}
}
void pt2(UP ct)
{while(1){int c;ptjm(ct);checkc(&c);switch(c){case 1:system("clear");findbook();break;case 2:system("clear");sortbook();break;case 3:system("clear");addborrow(ct);break;case 4:system("clear");displbb(ct);break;case 5:system("clear");delborrow(ct);break;case 6:system("clear");changepw(ct);break;case 7:system("clear");_fflush();return ;default :printf("\t\t\t无此选项,请重新输入!\n");system("clear");break;}}
}void displbb(UP ct)
{	int i;if(ct->borrow == 0){printf("\t\t\t您尚未借书!按回车键返回!");_fflush();_fflush();return ;}BP t = headdd;while(t != NULL){if(strcmp(ct->username,t->user) == 0){printf("\t\t\t您共借了%d本书:\n",t->bronum);for (i = 0;i < t->bronum;i++){printf("\t\t\t书名:%s\n\t\t\t借书时间:%d\n\t\t\t还书时间:%d\n\n",t->b[i].name,t->b[i].btime,t->b[i].etime);}printf("\t\t\t按回车键返回。。");_fflush();_fflush();return ;}t = t->next;}
}void addborrow(UP ct)
{int year,mon,day;LP t = headd;char a[50];printf("\t\t\t请输入你要借的图书名:");scanf("%s",a);while(t != NULL && strcmp(t->name,a) != 0)t = t->next;if (t == NULL){printf("\t\t\t未找到该图书!\n");return ;}else {printf("\t\t\t借书成功!请于一周内归还!\n");printbook(t);}time_t tt = time(NULL);tm *p = localtime(&tt);year = (1900 + p->tm_year);mon = (1 + p->tm_mon);day = (p->tm_mday);if(ct->borrow == 0){borrownum++;BP tn;tn = (struct Borrow *)malloc(sizeof(struct Borrow));strcpy(tn->user,ct->username);strcpy(tn->b[0].name,t->name);tn->b[0].btime = year*10000 + mon*100 + day;tn->b[ct->borrow].etime = 0;tn->bronum = ++ct->borrow;if(headdd != NULL){tailll->next = tn;tn->next = NULL;}else {headdd = tn;tn->next = NULL;}tailll = tn;}else {BP tn = headdd;while(tn != NULL && strcmp(tn->user,ct->username) != 0)tn = tn->next;strcpy(tn->b[ct->borrow].name,t->name);tn->b[ct->borrow].btime = year*10000 + mon*100 + day;tn->b[ct->borrow].etime = 0;tn->bronum = ++ct->borrow;}saveuser();savedate();saveborrow();printf("\t\t\t按回车键返回。。");_fflush();_fflush();
}
void delborrow(UP ct)
{int i;char a[50];int flag = 0;if(ct->borrow == 0){printf("\t\t\t您尚未借书!按回车键返回!");_fflush();_fflush();return ;}BP t =headdd;BP pre = NULL;while(t != NULL && strcmp(t->user,ct->username) != 0){pre = t;t = t->next;}printf("\t\t\t请输入你要还的图书名:");scanf("%s",a);for(i = 0;i < t->bronum;i++){if(strcmp(t->b[i].name,a) == 0 && t->b[i].etime == 0){//ct->borrow = --t->bronum;time_t tt = time(NULL);tm *p = localtime(&tt);int year,mon,day;year = (1900 + p->tm_year);mon = (1 + p->tm_mon);day = p->tm_mday;t->b[i].etime = year*10000 + mon*100 + day;flag = 1;}}if(flag == 0){printf("\t\t\t您未借此图书!按回车键返回!");_fflush();_fflush();return ;}else printf("\t\t\t还书成功!");if(ct->borrow == 0){if(pre == NULL){headdd = t->next;}else {pre->next = t->next;}free(t);borrownum--;}saveuser();savedate();saveborrow();printf("\n\t\t\t按回车键返回!");_fflush();_fflush();
}
void loadborrow()
{int i,j;FILE *fp;BP tnew;if((fp = fopen("borrow.txt","r")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}for(i = 0;i < borrownum;i++){tnew = (struct Borrow *)malloc(sizeof(struct Borrow));fscanf(fp,"%s\t%d",tnew->user,&tnew->bronum);for(j = 0;j < tnew->bronum;j++){fscanf(fp,"%s\t%d\t%d",tnew->b[j].name,&tnew->b[j].btime,&tnew->b[j].etime);}if(headdd != NULL){tailll->next = tnew;tnew->next = NULL;}else {headdd = tnew;tnew->next = NULL;}tailll = tnew;}fclose(fp);}
void saveborrow()
{int i;FILE *fp;if((fp = fopen("borrow.txt","w")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}BP t = headdd;while(t != NULL){fprintf(fp,"%s\t%d\n",t->user,t->bronum);for(i = 0; i < t->bronum;i++){fprintf(fp,"%s\t%d\t%d\n",t->b[i].name,t->b[i].btime,t->b[i].etime);}t = t->next;}fclose(fp);
}void sortbook()
{while(1){int c;sortjm();checkc(&c);switch(c){case 1:sortname();displb();break;case 2:sortp2();displb();break;case 3:sortp1();displb();break;case 4:system("clear");_fflush();return ;default :printf("\t\t\t无此选项!请重新输入!");system("clear");break;}}
}void sortjm()
{printf("\t\t\t************************************************************\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      您可以进行以下操作:                                 *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      1.按书名首字母排序(暂不支持中文)                    *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      2.按单价升序排序                                    *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      3.按单价降序排序                                    *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      4.返回上一级菜单                                    *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t************************************************************\n");printf("\t\t\t您的选择:");
}void findbookjm()
{printf("\t\t\t************************************************************\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      您可以进行以下操作:                                 *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      1.按书号查找                                        *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      2.按书名查找                                        *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      3.按作者查找                                        *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      4.按类型查找                                        *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      5.输出所有图书信息                                  *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t*      6.返回上一级菜单                                    *\n");printf("\t\t\t*                                                          *\n");printf("\t\t\t************************************************************\n");printf("\t\t\t请输入您的选择:");
}void findbook()
{while(1){int c;findbookjm();checkc(&c);switch(c){case 1:findbyid();break;case 2:findbyname();break;case 3:findbyauthor();break;case 4:findbytype();break;case 5:displb();break;case 6:system("clear");_fflush();return ;default :printf("\t\t\t无此选项!请重新输入!\n");system("clear");break;}}
}void printbook(LP t)
{printf("\t\t\tID:%d\n",t->ID);printf("\t\t\t书名:%s\n",t->name);printf("\t\t\t作者:%s\n",t->author);printf("\t\t\t类型:%s\n",t->type);printf("\t\t\t价格:%.2f\n\n",t->price);
}void findbyid()
{if(booknum == 0){printf("\t\t\t库中无任何图书信息!按回车键返回。。");_fflush();_fflush();return ;}int i;LP t = headd;printf("\t\t\t请输入要查找的书ID:");scanf("%d",&i);while(t != NULL && t->ID != i)t = t->next;if (t == NULL)printf("\t\t\t未找到该图书!\n");else printbook(t);printf("\t\t\t按回车键返回。。。");_fflush();_fflush();
}void findbyname()
{char a[50];printf("\t\t\t请输入要查找的书名:");scanf("%s",a);LP t = headd;while(t != NULL && strcmp(t->name,a) != 0)t = t->next;if (t == NULL)printf("\t\t\t未找到该图书!\n");else printbook(t);printf("\t\t\t按回车键返回。。");_fflush();_fflush();
}void findbyauthor()
{char a[50];printf("\t\t\t请输入要查找的书作者:");scanf("%s",a);LP t = headd;while(t != NULL && strcmp(t->author,a) != 0)t = t->next;if (t == NULL)printf("\t\t\t未找到该图书!\n");else printbook(t);printf("\t\t\t按回车键返回。。");_fflush();_fflush();}void findbytype()
{char a[50];int flag = 0;printf("\t\t\t请输入要查找的类型:");scanf("%s",a);LP t = headd;while(t != NULL ){if(strcmp(t->type,a) == 0){printbook(t);flag = 1;}t = t->next;} if (flag == 0)printf("\t\t\t未找到该类型图书!\n");printf("\t\t\t按回车键返回。。");_fflush();_fflush();
}void changepw(UP ct)
{int i = 0,j = 0,flag = 0;char p[50],q[50];_fflush();printf("\t\t\t新密码:");nodisplaypw(p,&i);strcpy(ct->password,p);printf("\n\t\t\t请再次输入密码:");nodisplaypw(q,&j);if(strcmp(ct->password,q) != 0){printf("\t\t\t两次密码不一样请重新修改!\n");flag = 1;system("clear");_fflush();changepw(ct);}if(flag)return ;printf("\n\t\t\t修改成功!");saveuser();sleep(2);
}void checkp()
{int flag = 0,k,kk,i;char u[50],p[50],rp[50];printf("\t\t\t帐号:");scanf("%s",u);UP ct = head;if (ct == NULL){printf("\t\t\t此帐号未被注册!按回车键返回。。。\n");_fflush();_fflush();return ;}else {while(ct != NULL){if(strcmp(ct->username,u) == 0){flag = 1;strcpy(rp,ct->password);break;}ct = ct->next;}}if(flag == 0){printf("\t\t\t此帐号未被注册!按回车键返回。。。\n");_fflush();_fflush();return ;}printf("\t\t\t密码:");_fflush();nodisplaypw(p,&i);if(strcmp(rp,p) == 0){flag = 2;//h = 0;}if(flag == 1){printf("\n\t\t\t密码错误!按回车键返回键。。。。\n");_fflush();_fflush();return ;}else if(flag == 2){printf("\n\t\t\t请输入下面验证码:\n");srand((unsigned)time(NULL));k = rand();printf("\t\t\t----------------\n");printf("\t\t\t-   %d         -\n",k);printf("\t\t\t----------------\n");scanf("%d",&kk);if(kk != k){printf("\t\t\t验证码错误!按回车键返回。。。\n");_fflush();	_fflush();return ;}system("clear");pt2(ct);}
}void refindpw()
{UP tt = head;char t[50];printf("\t\t\t请输入要找回的帐号:");scanf("%s",t);while(tt != NULL){if(strcmp(tt->username,t) == 0){printf("\t\t\t密码:%s\n\t\t\t按回车键返回.....",tt->password);_fflush();_fflush();return ;}tt = tt->next;}printf("\t\t\t查无此帐号!\n\t\t\t按回车键返回。。。");_fflush();_fflush();}void saveuser()
{int i;UP t = head;FILE *fp;if ((fp = fopen("user.txt","w")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}while(t != NULL){fprintf(fp,"%s %s %d\n",t->username,t->password,t->borrow);t = t->next;}fclose(fp);}void adduser()
{int i = 0,j = 0,k = 0,flag = 0;UP t = head;UP tnew;tnew = (struct User *)malloc(sizeof(struct User));if(tnew == NULL)exit(1);char u[50],p[50],q[50];printf("\t\t\t请输入帐号(由字母和数字组成,不超过10位):");while(cin.peek() != '\n'){u[k] = cin.get();if((u[k] >= 48 && u[k] <= 57) || (u[k] >= 65 && u[k] <= 90) || (u[k] >= 97 && u[k] <= 122))k++;else {printf("\t\t\t含非法字符!请重新申请\n");flag = 1;_fflush();adduser();}}if(flag)return ;u[k] = '\0';while(t != NULL){if(strcmp(t->username,u) == 0){printf("\n\t\t\t该帐号已被注册!请重新申请。\n");_fflush();flag = 1;adduser();}t = t->next;}if(flag)return ;strcpy(tnew->username,u);_fflush();printf("\t\t\t请输入密码:");nodisplaypw(p,&i);strcpy(tnew->password,p);printf("\n\t\t\t请再次输入密码:");nodisplaypw(q,&j);if(strcmp(tnew->password,q) != 0){printf("\t\t\t两次密码不一样请重新申请!\n");flag = 1;system("clear");_fflush();adduser();}if(flag)return ;tnew->borrow = 0;if(head != NULL){tail->next = tnew;tnew->next = NULL;}else {head = tnew;tnew->next = NULL;}tail = tnew;saveuser();usernum++;savedate();printf("\n\t\t\t恭喜您成为第%d位用户!按回车键返回。。。",usernum);_fflush();
}
void loaduser()
{UP temp;FILE *fp;if ((fp = fopen("user.txt","r")) == NULL){printf("\t\t\t打开文件失败!");exit(1);}char zh[50];char mima[50];int b;int num,i;while (fscanf(fp,"%s%s%d",zh,mima,&b) != EOF){//printf("!!!!!\n");temp = (struct User *)malloc(sizeof(struct User));if(temp == NULL)exit(1);strcpy(temp->username,zh);strcpy(temp->password,mima);temp->borrow = b;if(head != NULL){tail->next = temp;temp->next = NULL;}else {head = temp;temp->next = NULL;}tail = temp;}fclose(fp);}
void displ()
{UP t = head;while(t != NULL){printf("%s\n%s\n",t->username,t->password);t = t->next;}printf("\t\t\t按回车键返回。。。。");_fflush();_fflush();
}void ptjm(UP ct)
{printf("\n\n\n\n\t\t\t*****************************************\n");printf("\t\t\t*   亲爱的会员用户:%s  欢迎您的到来!! *\n",ct->username);printf("\t\t\t*   撒花~~~~~~~~                *\n");printf("\t\t\t*****************************************\n");printf("\t\t\t************************************\n");printf("\t\t\t************************************\n");printf("\t\t\t*              通知区              *\n");printf("\t\t\t************************************\n");printf("\t\t\t************************************\n");printf("\t\t\t*              操作区              *\n");printf("\t\t\t************************************\n");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*           6.更改密码             *\n");printf("\t\t\t*           7.退出登入             *\n");printf("\t\t\t************************************\n");printf("\t\t\t您的选择:");
}void gl()
{char m[50];int i = 0;printf("\t\t\t请输入管理员密码:");nodisplaypw(m,&i);if (i == 0){system("clear");return ;}	else if (!strcmp("123456",m))printf("\n\t\t\t登入成功!请稍等。。。。\n");else {printf("\n\t\t\t密码错误!系统退出\n");exit(1);}sleep(2);system("clear");while(1){	int c;gljm();checkc(&c);switch(c){case 1:system("clear");addbook();break;case 2:system("clear");displb();break;case 3:system("clear");deletbook();break;case 4:system("clear");gldisplbb();break;case 5:backupbook();break;case 6:break;case 7:system("clear");_fflush();return ;default :break;}}
}void loadbook()
{LP temp;FILE *fp;if((fp = fopen("book.txt","r")) == NULL){printf("\t\t\t打开文件失败件!");exit(1);}int ID;char a[20];char n[20];char t[20];double p;while(fscanf(fp,"%d\t%s\t%s\t%s\t%lf",&ID,n,a,t,&p) != EOF){temp = (struct library *)malloc(sizeof(struct library));if(temp == NULL)exit(1);temp->ID = ID;strcpy(temp->name,n);strcpy(temp->author,a);strcpy(temp->type,t);temp->price = p;if(headd != NULL){taill->next = temp;temp->next = NULL;}else {headd = temp;temp->next = NULL;}taill = temp;}fclose(fp);}
void savebook()
{LP t = headd;FILE *fp;if((fp = fopen("book.txt","w")) == NULL){printf("\t\t\t打开文件失败");exit(1);}while(t != NULL){fprintf(fp,"%d\t%s\t%s\t%s\t%lf\n",t->ID,t->name,t->author,t->type,t->price);t = t->next;}fclose(fp);}
void addbook()
{LP t = headd;LP tnew;tnew = (struct library *)malloc(sizeof(struct library));if (tnew == NULL)exit(1);printf("\t\t\t书名:");scanf("%s",tnew->name);printf("\t\t\t作者:");scanf("%s",tnew->author);printf("\t\t\t类型:");scanf("%s",tnew->type);printf("\t\t\t价格:");scanf("%lf",&tnew->price);tnew->ID = ++booknum;savedate();if(headd != NULL){taill->next = tnew;tnew->next = NULL;}else {headd = tnew;tnew->next = NULL;	}taill = tnew;savebook();printf("\t\t\t添加成功!按回车键返回。。。\n");_fflush();_fflush();
}void deletbook()
{if(headd == NULL){printf("\t\t\t图书馆为空!按回车键返回。。。");_fflush();_fflush();}LP t;LP current = headd;LP previous = NULL;int i;printf("\t\t\t请输入待删除的图书ID:");scanf("%d",&i);while(current != NULL && current->ID != i){previous = current;current = current->next;}if(previous == NULL){headd = current->next;}else {previous->next = current->next;}LP tt = current->next;free(current);while(tt != NULL){tt->ID--;tt = tt->next;}savebook();booknum--;savedate();printf("\t\t\t删除成功!!按回车键返回。。。");_fflush();_fflush();
}void backupbook()
{	LP t = headd;FILE *fp;if((fp = fopen("backup.txt","w+")) == NULL){printf("\t\t\t打开文件失败");exit(1);}while(t != NULL){fprintf(fp,"%d\t%s\t%s\t%s\t%lf\n",t->ID,t->name,t->author,t->type,t->price);t = t->next;}printf("\t\t\t备份成功!按回车键返回。。");_fflush();_fflush();fclose(fp);
}void displb()
{LP t = headd;while(t != NULL){printf("\t\t\tID:%d\n\t\t\t书名:%s\n\t\t\t作者:%s\n\t\t\t类型:%s\n\t\t\t价格:%.2lf\n",t->ID,t->name,t->author,t->type,t->price);sleep(1);t = t->next;}printf("\t\t\t按回车键返回。。。\n");_fflush();_fflush();
}void gljm()
{printf("\t\t\t************************************\n");printf("\t\t\t*欢迎!管理员!                  *\n");printf("\t\t\t************************************\n");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|     6.发布通知                    |\n");	printf("\t\t\t|     7.返回主菜单                  |\n");printf("\t\t\t|-----------------------------------|\n");printf("\t\t\t请输入您的选择:");}
void gldisplbb()
{int i;BP tt = headdd;if(tt == NULL){printf("\t\t\t暂无用户借书!\n");sleep(2);return ;}printf("\t\t\t共有 %d 位用户借书!\n",borrownum);while (tt != NULL){printf("\t\t\t用户 %s 借书情况:\n",tt->user);for(i = 0;i < tt->bronum;i++){printf("\t\t\t书名:%s\t借书日期:%d\t还书日期:",tt->b[i].name,tt->b[i].btime);if(tt->b[i].etime == 0)printf("暂未归还!\n");else printf("%d\n",tt->b[i].etime);}tt = tt->next;}printf("\t\t\t按回车键返回。。");_fflush();_fflush();
}int main()
{loaddate();loaduser();loadbook();loadborrow();while(1){int c;mainjm();checkc(&c);switch(c){	case 1:system("clear");_fflush();pt();break;case 3:break;case 2:system("clear");_fflush();gl();break;case 4:return 0;default :printf("无此选项!系统关闭!");exit(1);}}return 0;
}void loaddate()
{FILE *fp;if((fp = fopen("date.txt","r")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}fscanf(fp,"%d",&usernum);fscanf(fp,"%d",&booknum);fscanf(fp,"%d",&borrownum);fclose(fp);
}void savedate()
{FILE *fp;if((fp = fopen("date.txt","w")) == NULL){printf("\t\t\t文件打开失败!");exit(1);}fprintf(fp,"%d\n",usernum);fprintf(fp,"%d\n",booknum);fprintf(fp,"%d\n",borrownum);fclose(fp);
}void sortp1() 
{LP q,p,t,pre;int i,j;for (i = 0;i < booknum - 1; i++){pre = NULL;p = headd;q = p->next;for (j = 0;j < booknum - 1 - i; j++){if((p->price) < (q->price)){if (j == 0){headd = headd->next;p->next = headd->next;headd->next = p; }else {pre->next = q;p->next = q->next;q->next = p;}t = p;p = q;q = t;}pre = p;p = p->next;q = q->next;}}
}void sortp2() 
{LP q,p,t,pre;int i,j;for (i = 0;i < booknum - 1; i++){pre = NULL;p = headd;q = p->next;for (j = 0;j < booknum - 1 - i; j++){if(p->price > q->price){if (j == 0){headd = headd->next;p->next = headd->next;headd->next = p; }else { pre->next = q;p->next = q->next;q->next = p;}t = p;p = q;q = t; }pre = p;p = p->next;q = q->next;}}
}void sortname() 
{LP q,p,t,pre;int i,j;for (i = 0;i < booknum - 1; i++){pre = NULL;p = headd;q = p->next;for (j = 0;j < booknum - 1 - i; j++){if((p->name[0]) > (q->name[0])){if (j == 0){headd = headd->next;p->next = headd->next;headd->next = p; }else {pre->next = q;p->next = q->next;q->next = p;}t = p;p = q;q  = t;}pre = p;p = p->next;q = q->next;}}
}

文件有
user.txt
date.txt
book.txt
borrow.txt

实验报告

一. 设计目的
(1).进一步掌握学习并掌握c语言语法和编程思想
(2).进一步理解和运用结构化程序设计的思想和方法
(3).学会调适一个较长程序的基本方法
(4).学会利用流程图表示算法
(5).掌握书写课程设计报告的能力
二. 设计内容
本课程设计结合本学期所学C语言知识,数组、函数、结构体、指针、链表、文件读取操作等等,设计开发一个图书管理系统。设计开发这个系统需要用到链表、文件读取操作、结构体、函数、指针、等C语言知识。本课程设计将会实现对图书信息的账号登录、注册账号、密码修改、密码查找、查找、输出、排序、备份、恢复、删除、修改、图书借阅和归还功能。
三.概要设计
1.功能模块图;

2.各个模块详细的功能描述。
本图书管理系统主要分为两个大功能模块,用户操作功能和管理员操作功能。
用户可分为主要的三个功能模块:账号管理(登入,注册,找回、修改密码),图书信息(查询,排序),图书借还(查询借书记录,借书,还书),还可查询系统消息(是否有新书,是否借书逾期未归还)。
管理员操作功能也主要分为三个功能模块:图书管理(新增图书、删除图书、修改库存、查看图书、备份、恢复图书),用户管理(查看用户信息,查看用户借书记录,注销用户),还有查看系统消息(是否有库存不足,是否有用户借书逾期未归还)和恢复出厂前设置
说明:管理员的登入密码位于Readme的系统说明,文件为readme.txt,若无此文件,则默认密码为04182004
四.详细设计
1.功能函数的调用关系图

2.各功能函数的数据流程图
(1)主函数main()

函数的功能:用于联系各个功能函数模块.
函数的入口:整个程序是从主函数开始的
函数的出口:从main()的switch()case 5:return 0;即:退出整个程序。
函数调用关系:该函数不被其它函数调用。

(2).函数pt()用户登入界面

(3)函数gl()管理登入及其操作界面

(4)pt2()用户操作界面

(5)findbyauthor()按作者名及价格区间查找函数

(6)恢复备份resetbackup()

(7)addborrow()借书函数

(8)deluser注销用户函数

(9)addbook()新增图书函数

3.重点设计及编码
(1).nodisplaypw()密码不回显函数
使用getch()函数,如果不是退格键则打印‘*’如果遇到退格键,需打印两个退格键,如果输入的字符数为0时敲击退格键,则不打印。
(2).decode()密码加密函数
使用凯撒加密(数组循环移位,移的位数为密码长度的一半)
(3).systemnote1()管理员的系统消息函数systemnote2()用户的系统消息函数
新增图书addbook()函数中,使用”a”的形式以所有用户的用户名为文件名打开文件,写入新书上架提醒;用户在借书addborrow()函数中,如果库存为0会自动预约,使用”a”的形式以该书籍名称为文件名打开文件,写入以本用户的文件名。
库存修改时changeku()函数中,判断是否有以该书籍为文件名的文件,若有,打开以文件中的用户名为文件名的文件,写入预约成功提醒。
管理员消息提醒:遍历图书信息,输出图书库存小于2的图书,遍历用户借书记录,输出当前时间-借书时间>7的借书记录的用户
用户系统消息提醒:输出自己所借书籍中逾期未归还的图书,查看是否有以本用户名为文件名的文件,输出文件内容
(4)借书还书时间使用tm结构体获取本地时间

(5)readme()函数中的系统说明有管理员密码,可在文件中更改,浏览作者博客使用了system(“explorer 网址”)

五.测试数据及运行结果
1.正常测试数据和运行结果
查找

排序

借书记录查询

2.异常测试数据及运行结果

添加相同书名和作者,不同类型和价格的图书

六.调试情况,设计技巧及体会
1.改进方案
1.添加图书模糊搜索功能
2.应设置用户名不能和图书名冲突,否则查看系统消息功能会出现bug
3.用户还书的时候库存也会增加,此时该图书也可能为其他用户所预约的
4.恢复出厂前设置应删除相应的txt
2.体会
1.当遇到选项输入时输入<1空格2>时会出现bug,最后设置了选项合法性检验
2.在设计输入密码不回显时,没有对输入字符的个数加以判断,导致退格键清除了屏幕,最后增加了判断。
3.使用传参时,由于模块多,导致思维混乱,不得已又改回了全局变量
4.发现书库中含有相同图书,最后设置添加图书的时候只允许书名和作者不同时相同,完全相同库存自动加1,不允许书名作者相同,价格类型不相同
5.同时,这也是我第一次尝试画各种各样的流程图,虽然画的不好,但这确实是我的第一次尝试,也觉得充满了乐趣。
6. 通过此次图书管理系统的设计熟练了结构数组、链表、文件的操作,同时对编写小型的系统有了一定的了解,对于细节方面考虑的比以前有很大提升。

七.参考文献
八.附录:
源代码(电子版)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部