目录
摘要
作为一名在校大学生,图书馆是我们不可或缺的学习圣地。图书馆为我们提供了种类
、数量极为丰富的文献。
图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书
借阅问题,工作将非常繁琐,需要大量的人力、物理、财力,极大的浪费了资源,对
于图书管理人员来说,图书馆管理包括图书信息管理、借阅信息管理、读者信息管理
等等。而这些项目在过去靠手工操作,需要手工记录这些事情,不但麻烦,还经常出
错,给广大用户带来很多不便,因此,开发这样一套图书馆管理系统软件。让管理员
方便的管理图书及用户信息,方便用户查找图书。
1、课程设计的目的
- 用C语言开发一个简单的图书信息管理系统。
2、主要内容
(一)数据结构
- 图书数据文件 每种图书的信息包括:图书编号(唯一性标识每一本书)、书名、作者、出版社、库存以及价格。
图书编号 | 书名 | 作者 | 出版社 | 库存 | 价格 |
---|---|---|---|---|---|
001 | 论语 | 孔子 | 高等教育出版社 | 45 | 160 |
- 用户数据文件 读者的基本信息:证号、读者姓名、借书日期、书名。
证号 | 读者姓名 | 借书日期 | 书名 |
---|---|---|---|
2013 | 陌年 | 2021/1/19 | 论语 |
本文采用了四个文件用来保存信息,分别是:
- gland.txt:管理员账号密码(账号必须是整形,密码可以是字符串)
- land.txt:读者账号密码(账号必须是整形,密码可以是字符串)
- library.txt:图书信息
- reader.txt:读者借阅信息
(二)系统实现功能
1.图书管理员处理功能
1.1用户信息管理
- 创建普通读者账号
- 删除普通读者账号
1.2图书信息管理
- 添加图书
- 删除图书
- 浏览图书
- 修改图书
- 查询图书
- 浏览读者借阅
1.3登录功能
- 管理员登录:本系统管理员账号密码内置在gland.txt文本中,默认账号为1 密码为1
2.普通读者管理系统
1.1读者修改密码
1.2借阅系统管理
- 浏览图书
- 借阅图书
- 归还图书
- 查询图书
1.3登录系统
- 读者登录:本系统普通读者账号密码由管理员创建,保存在land.txt文本中,默认账号为2013 密码为123456 所有文件在本文末尾上传
3、功能模块图
本系统功能模块图:
4、详细设计
4.1结构体
本系统分为五个结构体,分别用来实现管理员登录及普通读者登录,保存图书信息,删除读者账号密码,读者修改密码,保存读者信息。
struct book//图书信息
{
char num[20],nam[20],aut[20],pub[20];
int digit;
float price;
struct book *next;
};
struct land//管理员登录信息
{
int username;
char password[20];
};
struct mm//修改密码
{
int username1;
char mima[20];
};
struct sc//删除用户账号
{
int username1;
char mima1[20];
struct sc *next;
};
struct dz//读者信息
{
int xuehao;
char mingzi[20];
char riqi[20];
char shuming[20];
struct dz *next;
};
4.2登录模块
- 管理员登录模块
管理员的账号密码保存在gland.txt文本中,由于初学C语言,应用不是很熟练,因此管理员的账号密码只能通过在文件中修改,添加,删除!!!注意:由于考虑不长远,账号密码都用了int类型,导致账号密码只能是整形!!!初始账号就是我在文件中保存的1,密码也是1。可自己创建文件添加,注意必须是整数!!!
首先进入登录模块提示输入账号密码,输入完毕后,如果账号或密码错误,会输出账号或密码错误,并自动返回主页面。
void gland()
{
system("cls");
FILE*fp;
struct land s[S];
int i,N=0,j;
int zhanghao,flag=0;
char mima[20];
int K=0;
if((fp = fopen("gland.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
K = tjzs2();
for(; !feof(fp);)
{
fscanf(fp,"%d %s",&s[N].username,s[N].password);
N++;
}
fclose(fp);
printf("请输入管理员账号:\n");
scanf("%d",&zhanghao);
printf("请输入密码:\n");
scanf("%s",&mima);
getchar();
for(i=0; i<K; i++)
{
if(zhanghao==s[i].username)
{
if(strcmp(s[i].password,mima)==0)
{
printf("登录成功\n");
system("cls");
glmain();
flag=1;
break;
}
}
}
if(flag==0)
{
printf("账号或密码错误\n");
Sleep(2000);
system("cls");
lmain();
}
}
- 读者登录模块
普通读者账号密码保存在land.txt文件中,通过管理员可实现创建,删除操作,读者也可自行修改密码。用户输入账户密码之后,如果账号不存在,会提示无此用户;如果密码错误,会提示密码错误,并返回主页面;其中模块需要调用match函数来匹配数据库中的账号密码。
登录函数
void land()
{
int zhanghao;
char password[20];
int i=2,j,k,n;
char hit=0;
system("cls");
do
{
printf("\n请输入账号:\n");
scanf("%d",&zhanghao);
printf("确认输入请按回车,重新输入请按ESC");
hit=getch();//暂停程序,当hit接受后继续
for (; hit!=13&&hit!=27;)//保证只有输入CR或ESC
{
hit=getch();
}
}
while(hit==27);
printf("\n请输入密码:\n");
scanf("%s",password);
getchar();
i=match(zhanghao,password);
if(i==1)
{
printf("登陆成功!按任意键继续");
getch();
usermain();
}
else
{
if(i==-1)
{
printf("密码错误!");
getch();
land();
}
if(i==0)
printf("不存在此用户");
getch();
system("cls");
lmain();
}
}
匹配函数,匹配成功返回1,密码错误返回-1,不存在此用户返回0
int match(int m,char a[20])//匹配数据库中的账号密码
{
FILE*fp;
int n=0,i=0;
int username;
char password[20];
if ((fp=fopen("land.txt","r"))==NULL)
{
system ("cls");
printf("\n 不存在此用户!请新建账户");
getch();
system("cls");
lmain();
}
for(; !feof(fp);)
{
fscanf(fp,"%d%s",&username,password);
if(m==username)
{
if(strcmp(a,password)==0)
return 1;
else
{
return -1;
}
}
}
return 0;
}
4.3添加图书
添加图书可实现批量添加,输入ESC结束添加,否则将一直添加。
void add()
{
FILE*fp;
char i;
int digit=0;
float price=0;
char nam[20],aut[20],pub[20],num[20];
system ("cls");
if((fp=fopen("library.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
printf("\n请按以下格式输入图书信息:\n书号 书名 作者 出版社 进库量 单价");
fp = fopen("library.txt","a");
for(; i!=27;)
{
printf("\n请输入:\n");
scanf("%s%s%s%s%d%f",num,nam,aut,pub,&digit,&price);
fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,digit,price);
printf("结束输入请按ESC\n");
i=getch();
}
fclose(fp);
printf("\n保存成功,按任意键返回上一层!");
getch();
tsmain();
}
4.4删除图书
这部分做的不是很好,日后需要多多改善。
void Delete()
{
struct book *head=NULL;
struct book *p,*p1,*p2;
int tmany=0,n=0,j,k;
float tprice=0;
char tnam[20],taut[20],tcat[20],tpub[20],tnum[20];
char jnam[20];
char i,hit;
FILE *fp;
if ((fp=fopen("library.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();
tsmain();
}
else//实现删除的功能
{
system ("cls");
printf("\n请输入你要删除的书名:");//输入删除图书书名
scanf("%s",jnam);
printf("\n确认删除请回车,取消请按Esc\n");
i=getch();
for(; i!=13&&i!=27;)
i=getch();
if (i==27)
tsmain();
fp=fopen("library.txt","r");
j=tjzs();
for (k=0; k<j; k++)
{
fscanf(fp,"%s%s%s%s%d%f",tnum,tnam,taut,tpub,&tmany,&tprice);
if (strcmp(jnam,tnam)!=0)//比较名字,将不同名字的信息复制到链表
{
n++;
if (n==1)//建立链表
{
p1=p2=(struct book*)malloc(sizeof(struct book));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct book*)malloc(sizeof(struct book));//新建链表
}
strcpy(p1->num,tnum);//复制书号
strcpy(p1->nam,tnam);//复制书名
strcpy(p1->aut,taut);//复制作者名字
strcpy(p1->pub,tpub);//复制出版社
p1->digit=tmany;//复制个数
p1->price=tprice;//复制单价
}
}
if (n==0)
{
head=NULL;
}
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
fp=fopen("library.txt","w");//清空文件,只写打开,然后关闭
fclose(fp);
fp=fopen("library.txt","a");//追加文件
p=head;
for (; p!=NULL;) //把链表内容覆盖到文件
{
fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->digit,p->price);
p=p->next;
}
fclose(fp);
printf("\n删除成功,按任意键返回上一层\n");
getch();
tsmain();
}
5、运行结果
- 主页面
![](https://img-blog.csdnimg.cn/20210121110339797.png)
- 管理员登录页面
![](https://img-blog.csdnimg.cn/20210121111633881.png)
- 管理员二级页面
![](https://img-blog.csdnimg.cn/20210121112241156.png)
- 管理员用户信息管理页面
![](https://img-blog.csdnimg.cn/20210121112636170.png)
- 管理员图书信息管理页面
![](https://img-blog.csdnimg.cn/20210121112943437.png)
- 读者登录页面
![](https://img-blog.csdnimg.cn/20210121114047337.png)
- 读者二级页面
![](https://img-blog.csdnimg.cn/20210121114318675.png)
- 读者借阅系统页面
![](https://img-blog.csdnimg.cn/20210121114540318.png)
希望对各位有所帮助
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include<windows.h>
#define S 100
struct book//图书信息
{
char num[20],nam[20],aut[20],pub[20];
int digit;
float price;
struct book*next;
};
struct land//管理员登录信息
{
int username;
char password[20];
};
struct mm//修改密码
{
int username1;
char mima[20];
};
struct sc//删除用户账号
{
int username1;
char mima1[20];
struct sc *next;
};
struct dz//读者信息
{
int xuehao;
char mingzi[20];
char riqi[20];
char shuming[20];
struct dz *next;
};
void xiugai();//修改密码
void glmenu();//显示管理员菜单
void glmain();//管理界面菜单
void usermain();//用户信息管理
void usermenu();//用户信息菜单
void tsmain();//管理员图书信息管理
void tsmenu();//管理员图书信息菜单
void tsmenu1();//用户图书信息菜单
void find();//管理员查询图书
void find1();//用户查询图书
void add();//增加图书
void Delete();//删除图书
void dzjy();//浏览读者借阅信息
void borrow1();//借阅图书
void change();//修改图书信息
void Return1();//归还图书
void land();//用户登陆
void gland();//管理员登录
void xinjian();//创建普通用户账号密码
void sczh();//删除普通读者账号
void xgmm();//修改密码
void lmain();//登录界面函数
void cksj();//管理员浏览全部图书信息
void cksj1();//用户浏览全部图书信息
void gllmain();//用户信息管理
void gllmenu();//图书信息管理
int main()
{
lmain();
return 0;
}
int tjzs()//统计图书文本个数
{
FILE *fp;
int many=0,n;
float tprice=0;
char tname[20],tauthor[20],tchuban[20],tshuhao[20];
fp=fopen("library.txt","r");//打开文件
for (n=0; !feof(fp); n++) //逐个读文件
fscanf(fp,"%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,&many,&tprice);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
int tjzs1()//统计文读者本个数函数
{
FILE *fp;
int username=0,n;
char mingzi[20],riqi[20],zname[20];
fp=fopen("reader.txt","r");//打开文件
for (n=0;!feof(fp);n++)//逐个读文件
fscanf(fp,"%d%s%s%s ",&username,&mingzi,&riqi,&zname);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
int tjzs3()//统计普通用户账号密码文本个数
{
FILE *fp;
int zhao=0,n;
char mm[20];
fp=fopen("land.txt","r");//打开文件
for (n=0; !feof(fp); n++) //逐个读文件
fscanf(fp,"%d %s",&zhao,mm);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
int tjzs2()//统计管理员账号密码文本个数
{
FILE *fp;
int zhang=0,n;
char mima[20];
fp=fopen("gland.txt","r");//打开文件
for (n = 0; !feof(fp); n++) //逐个读文件
fscanf(fp,"%d %s",&zhang,mima);
fclose(fp);//关闭文件
return n;//返回个数
}
void lmain()//登录页面函数
{
char choose;
lmenu();
printf("\n");
scanf("%c",&choose);
switch(choose)//功能函数
{
case'1':
gland();
break;
case'2':
land();
break;
case'3':
system("cls");
exit(0);
break;
}
}
void glmenu()//主菜单
{
system ("cls");
printf("**************************************************");
printf("\n\n 1.用户信息管理\n\n");
printf("\n\n 2.图书信息管理\n\n");
printf("\n\n 3.返回上一层\n\n");
printf("*************************************************\n");
return 0;
}
void usermenu()//主菜单
{
system ("cls");
printf("**************************************************");
printf("\n\n 1.用户修改密码\n\n");
printf("\n\n 2.借阅系统管理\n\n");
printf("\n\n 3.返回上一层\n\n");
printf("*************************************************\n");
return 0;
}
void gllmenu()
{
system("cls");
printf("**************************************************");
printf("\n\n 1.创建普通读者账号\n\n");
printf("\n\n 2.删除普通读者账号\n\n");
printf("\n\n 3.返回上一层\n\n");
printf("*************************************************\n");
return 0;
}
void tsmenu()
{
system("cls");
printf("**************************************************");
printf("\n 1.添加图书\n\n");
printf("\n 2.删除图书\n\n");
printf("\n 3.浏览图书\n\n");
printf("\n 4.修改图书\n\n");
printf("\n 5.查询图书\n\n");
printf("\n 6.浏览读者借阅\n\n");
printf("\n 7.返回上一层\n\n");
printf("*************************************************\n");
return 0;
}
void lmenu()//显示登录菜单
{
printf("\n\n\t 欢迎使用图书信息管理系统\n\n");
printf("**********************************************");
printf("\n\n\t\t1.图书管理员处理系统\n\n");
printf("\n\n\t\t2.普通读者管理系统\n\n");
printf("\n\n\t\t3.退出系统\n\n");
printf("\n\n\t 请按键选择,回车确定\n");
printf("**********************************************");
return ;
}
void tsmenu1()
{
system("cls");
printf("**************************************************");
printf("\n 1.浏览图书\n\n");
printf("\n 2.借阅图书\n\n");
printf("\n 3.归还图书\n\n");
printf("\n 4.查询图书\n\n");
printf("\n 5.返回上一层\n\n");
printf("*************************************************\n");
return 0;
}
void gllmain()
{
char choose;
gllmenu();
getchar();
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
xinjian();
break;
case'2':
sczh();
break;
case'3':
glmain();
break;
}
}
void tsmain()
{
char choose;
tsmenu();
getchar();
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
add();
break;
case'2':
Delete();
break;
case'3':
cksj();
break;
case'4':
change();
break;
case'5':
find();
break;
case'6':
dzjy();
break;
case'7':
glmain();
break;
}
}
void glmain()
{
char choose;
glmenu();
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
gllmain();
break;
case'2':
tsmain();
break;
case'3':
system("cls");
getchar();
lmain();
break;
}
}
void usermain()
{
char choose;
usermenu();
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
xgmm();
break;
case'2':
tsmain1();
break;
case'3':
system("cls");
getchar();
lmain();
break;
}
}
void tsmain1()
{
char choose;
tsmenu1();
getchar();
scanf("%c",&choose);
switch(choose)//功能函数
{
case'1':
cksj1();
break;
case'2':
borrow1();
break;
case'3':
Return1();
break;
case'4':
find1();
break;
case'5':
usermain();
}
}
void gland()
{
system("cls");
FILE*fp;
struct land s[S];
int i,N=0,j;
int zhanghao,flag=0;
char mima[20];
int K=0;
if((fp = fopen("gland.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
K = tjzs2();
for(; !feof(fp);)
{
fscanf(fp,"%d %s",&s[N].username,s[N].password);
N++;
}
fclose(fp);
printf("请输入管理员账号:\n");
scanf("%d",&zhanghao);
printf("请输入密码:\n");
scanf("%s",&mima);
getchar();
for(i=0; i<K; i++)
{
if(zhanghao==s[i].username)
{
if(strcmp(s[i].password,mima)==0)
{
printf("登录成功\n");
system("cls");
glmain();
flag=1;
break;
}
}
}
if(flag==0)
{
printf("账号或密码错误\n");
Sleep(2000);
system("cls");
lmain();
}
}
void xinjian()
{
FILE *fp;
int zhanghao,flag=0;
char password[20],password1[20];
char hit=0;
if ((fp=fopen("land.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
system("cls");
fp=fopen("land.txt","a");
for(;;)
{
printf("\n请按以下格式输入账户:\n学号 密码\n");
printf("请输入:");
scanf("%d %s",&zhanghao,password);
printf("再次输入密码:\n");
scanf("%s",password1);
if(strcmp(password,password1)==0)
{
flag=1;
fprintf(fp,"%d %s\n",zhanghao,password);
break;
}
else
{
printf("两次输入密码不一致,请重新操作\n");
for(; hit!=13&&hit!=27;)
hit=getch();
if(hit=27){
system("cls");
gllmain();
}
if(hit=13)
{
system("cls");
xinjian();
}
}
}
fclose(fp);
printf("创建成功,按任意键返回");
getch();
system("cls");
gllmain();
}
void sczh()
{
struct sc *head=NULL;
struct sc *p,*p1,*p2;
int zhanghao,username;
char mima[20];
char i,j,k,n=0;
FILE *fp;
if ((fp=fopen("land.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("File open error\n");
getch();
}
else
{
system ("cls");
printf("\n请输入你要删除的账号:");//输入删除账号
scanf("%d",&zhanghao);
printf("\n确认删除请回车,取消请按Esc\n");
i=getch();
for(; i!=13&&i!=27;)
i=getch();
if (i==27)
gllmain();
fp=fopen("land.txt","r");
j=tjzs3();
for (k=0; k<j; k++)
{
fscanf(fp,"%d %s",&username,mima);
if (zhanghao!=username)
{
n++;
if (n==1)
{
p1=p2=(struct sc*)malloc(sizeof(struct sc));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct sc*)malloc(sizeof(struct sc));//新建链表
}
strcpy(p1->mima1,mima);
p1->username1=username;
}
}
if (n==0)
{
head=NULL;
}
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
fp=fopen("land.txt","w");//清空文件,只写打开,然后关闭
fclose(fp);
fp=fopen("land.txt","a");//追加文件
p=head;
for (; p!=NULL;) //把链表内容覆盖到文件
{
fprintf(fp,"%-4d %-5s\n",p->username1,p->mima1);
p=p->next;
}
fclose(fp);
system ("cls");
printf("\n删除成功 \n按任意键返回上一层\n");
getch();
gllmain();
}
void add()
{
FILE*fp;
char i;
int digit=0;
float price=0;
char nam[20],aut[20],pub[20],num[20];
system ("cls");
if((fp=fopen("library.txt","r"))==NULL)
{
printf("File open error!\n");
exit(0);
}
printf("\n请按以下格式输入图书信息:\n书号 书名 作者 出版社 进库量 单价");
fp = fopen("library.txt","a");
for(; i!=27;)
{
printf("\n请输入:\n");
scanf("%s%s%s%s%d%f",num,nam,aut,pub,&digit,&price);
fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,digit,price);
printf("结束输入请按ESC\n");
i=getch();
}
fclose(fp);
printf("\n保存成功,按任意键返回上一层!");
getch();
tsmain();
}
void change()
{
system("cls");
FILE*fp;
char a;
char nume[20],name[20],auth[20],publ[20];
int digi,flag=0;
double pri;
char t[20],g;
char hit;
struct book s[S];
fp=fopen("library.txt","r");
int i=0;
if(fp==NULL)
{
printf("can't open the file");
exit(0);
}
while(fscanf(fp,"%s %s %s %s %d %f",s[i].num,s[i].nam,s[i].aut,s[i].pub,&s[i].digit,&s[i].price)!=EOF)
i++;
int L = tjzs();
fclose(fp);
for(int j=0; j<L; j++)
{
printf("\n书号:%-10s 书名:%-10s 作者:%-10s 出版社:%-10s 数量:%-5d 价格:%-5.2lf\n",s[j].num,s[j].nam,s[j].aut,s[j].pub,s[j].digit,s[j].price);
}
for(;hit!=27;)
{
printf("请输入要修改的书号:\n\n");
scanf(" %s",&t);
getchar();
for(int k=0; k<L; k++)
{
if(strcmp(t,s[k].num)==0)
{
flag=1;
printf("\t\t1.书号:\n");
printf("\t\t2.书名:\n");
printf("\t\t3.作者:\n");
printf("\t\t4.出版社:\n");
printf("\t\t5.数量:\n");
printf("\t\t6.价格:\n");
printf("请输入要修改的选项:\n");
scanf("%c",&g);
getchar();
switch(g)
{
case'1':
printf("修改后书号:\n");
scanf("%s",nume);
strcpy(s[k].num,nume);
break;
case'2':
printf("修改后书名:\n");
scanf("%s",name);
strcpy(s[k].nam,name);
break;
case'3':
printf("修改后作者:\n");
scanf("%s",auth);
strcpy(s[k].aut,auth);
break;
case'4':
printf("修改后出版社:\n");
scanf("%s",publ);
strcpy(s[k].pub,publ);
break;
case'5':
printf("修改后数量:\n");
scanf("%d",&digi);
s[k].digit=digi;
break;
case'6':
printf("修改后价格:\n");
scanf("%lf",&pri);
s[k].price=pri;
break;
}
printf("图书信息修改完成\n");
}
}
printf("继续输入请按回车,结束输入请按Esc\n");
hit=getch();//暂停程序当i接收后继续下一条指令
for (;hit!=13&&hit!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。
hit=getch();
}
if(flag==0)
{
printf("没有此图书\n");
}
int h=0;
fp = fopen("library.txt","w");
for(h=0;h<L;h++)
{
fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",s[h].num,s[h].nam,s[h].aut,s[h].pub,s[h].digit,s[h].price);
}
fclose(fp);
tsmain();
}
void dzjy()
{
FILE *fp;
int zhanghao=0,n=0,i=0,j=0;
char mingzi[20],riqi[20],zname[20];
if ((fp=fopen("reader.txt","r"))==NULL)//打开读者文件夹
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();
tsmain();
}
n=tjzs1();
printf("%d\n",n);
if (n==0)
{
system ("cls");
printf("\n无任何记录!");
}
fp=fopen("reader.txt","r");
system ("cls");
printf("\n证号\t读者姓名\t\t借书日期\t书名\n");
for (;!feof(fp);)
{
fscanf(fp,"%d%s%s%s\n ",&zhanghao,mingzi,riqi,zname);
printf("\n%-8d%-23s%-18s%-10s\n",zhanghao,mingzi,riqi,zname);
}
fclose(fp);
printf("\n按任意键返回\n");
getch();
tsmain();
}
void find()
{
FILE *fp;
int k=0,many=0,m=0,n=0;
float price=0;
char nam[20],aut[20],pub[20],num[20];
char i;
char chazhao[20];
for(;i!=27;)
{
k=0;
if ((fp=fopen("library.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();
tsmain();
}
system("cls");
printf("请输入书号或书名或作者查询:\n");
scanf("%s",chazhao);
m=tjzs();
for(n=0; n<m; n++)
{
fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
if(!strcmp(chazhao,num)||!strcmp(chazhao,nam)||!strcmp(chazhao,aut))
{
if(k==0)
{
printf("查询结果:\n\n");
printf("书号\t书名\t作者\t\t出版社\t\t现存量\t单价\n");
printf("%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
k++;
}
}
}
if (k==0)//文件夹为空则输出无记录并返回上一层
{
system ("cls");
printf("\n无符合记录!\n");
getch();
tsmain();
}
fclose(fp);//查询结束
printf("查询成功,输入回车继续查找,输入ESC结束!\n");
i = getch();
for(;i!=27&&i!=13;)
i = getch();
}
tsmain();
}
void Delete()
{
struct book *head=NULL;
struct book *p,*p1,*p2;
int tmany=0,n=0,j,k;
float tprice=0;
char tnam[20],taut[20],tcat[20],tpub[20],tnum[20];
char jnam[20];
char i,hit;
FILE *fp;
if ((fp=fopen("library.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();
tsmain();
}
else//实现删除的功能
{
system ("cls");
printf("\n请输入你要删除的书名:");//输入删除图书书名
scanf("%s",jnam);
printf("\n确认删除请回车,取消请按Esc\n");
i=getch();
for(; i!=13&&i!=27;)
i=getch();
if (i==27)
tsmain();
fp=fopen("library.txt","r");
j=tjzs();
for (k=0; k<j; k++)
{
fscanf(fp,"%s%s%s%s%d%f",tnum,tnam,taut,tpub,&tmany,&tprice);
if (strcmp(jnam,tnam)!=0)//比较名字,将不同名字的信息复制到链表
{
n++;
if (n==1)//建立链表
{
p1=p2=(struct book*)malloc(sizeof(struct book));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct book*)malloc(sizeof(struct book));//新建链表
}
strcpy(p1->num,tnum);//复制书号
strcpy(p1->nam,tnam);//复制书名
strcpy(p1->aut,taut);//复制作者名字
strcpy(p1->pub,tpub);//复制出版社
p1->digit=tmany;//复制个数
p1->price=tprice;//复制单价
}
}
if (n==0)
{
head=NULL;
}
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
fp=fopen("library.txt","w");//清空文件,只写打开,然后关闭
fclose(fp);
fp=fopen("library.txt","a");//追加文件
p=head;
for (; p!=NULL;) //把链表内容覆盖到文件
{
fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->digit,p->price);
p=p->next;
}
fclose(fp);
printf("\n删除成功,按任意键返回上一层\n");
getch();
tsmain();
}
void land()
{
int zhanghao;
char password[20];
int i=2,j,k,n;
char hit=0;
system("cls");
do
{
printf("\n请输入账号:\n");
scanf("%d",&zhanghao);
printf("确认输入请按回车,重新输入请按ESC");
hit=getch();//暂停程序,当hit接受后继续
for (; hit!=13&&hit!=27;)//保证只有输入CR或ESC
{
hit=getch();
}
}
while(hit==27);
printf("\n请输入密码:\n");
scanf("%s",password);
getchar();
i=match(zhanghao,password);
if(i==1)
{
printf("登陆成功!按任意键继续");
getch();
usermain();
}
else
{
if(i==-1)
{
printf("密码错误!");
getch();
land();
}
if(i==0)
printf("不存在此用户");
getch();
system("cls");
lmain();
}
}
void xgmm()
{
system("cls");
FILE*fp;
struct mm s[100];
int i=0,j,k,m=0;
int username,flag=0;
char password[20],mima1[20],mima2[20];
if((fp = fopen("land.txt","r"))==NULL)
{
printf("还未注册,请注册\n");
fp = fopen("land.txt","w");
getchar();
system("cls");
lmain();
}
fp = fopen("land.txt","r");
printf("请输入账号:\n");
scanf("%d",&username);
printf("请输入密码:\n");
scanf("%s",password);
getchar();
m=tjzs3();
for(; !feof(fp);)
{
fscanf(fp,"%d %s",&s[i].username1,s[i].mima);
i++;
}
for(k=0; k<m; k++)
{
if(username==s[k].username1)
{
flag=1;
if(strcmp(password,s[k].mima)==0)
{
flag=2;
printf("请输入新密码:\n");
scanf("%s",mima1);
printf("请再次输入新密码:\n");
scanf("%s",mima2);
if(strcmp(mima1,mima2)==0)
{
strcpy(s[k].mima,mima1);
printf("修改密码成功!\n");
Sleep(2000);
system("cls");
}
else
{
printf("两次密码输入不一致,按任意键退出!\n");
getch();
usermain();
system("cls");
}
}
}
}
if(flag==0)
{
printf("此用户尚未注册,请注册\n");
Sleep(3000);
}
if(flag==1)
{
printf("输入密码错误,请重新进入\n");
Sleep(3000);
}
fp = fopen("land.txt","w");
for(j=0; j<m; j++)
{
fprintf(fp,"%d %s\n",s[j].username1,s[j].mima);
}
fclose(fp);
system("cls");
usermain();
}
int match(int m,char a[20])//匹配数据库中的账号密码
{
FILE*fp;
int n=0,i=0;
int username;
char password[20];
if ((fp=fopen("land.txt","r"))==NULL)
{
system ("cls");
printf("\n 不存在此用户!请新建账户");
getch();
system("cls");
lmain();
}
for(; !feof(fp);)
{
fscanf(fp,"%d%s",&username,password);
if(m==username)
{
if(strcmp(a,password)==0)
return 1;
else
{
return -1;
}
}
}
return 0;
}
void cksj()
{
FILE *fp;
int n=0;
int k=0,m=0,many=0;
float price=0;
char nam[20],aut[20],pub[20],num[20];
char i;
if ((fp=fopen("library.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();//返回
tsmain();
}
n= tjzs();
if (n==0)
{
system ("cls");
printf("\n无任何记录!");
}
fp=fopen("library.txt","r");//打开只读文件
system ("cls");
printf("书号\t书名\t 作者\t\t出版社\t\t库存量\t单价\n");
for (m=0; m<n; m++) //输出数据
{
fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
printf("%-8s%-9s%-14s%-18s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
}
fclose(fp);
printf("\n按任意键返回\n");
getch();
tsmain();
}
void find1()
{
FILE *fp;
int k=0,many=0,m=0,n=0;
float price=0;
char nam[20],aut[20],pub[20],num[20];
char i;
char chazhao[20];
system("cls");
for(;i!=27;)
{
k=0;
if ((fp=fopen("library.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();
tsmain();
}
system("cls");
printf("请输入书号,书名,作者查询:\n");
scanf("%s",chazhao);
system ("cls");
m=tjzs();
for(n=0; n<m; n++)
{
fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
if(!strcmp(chazhao,num)||!strcmp(chazhao,nam)||!strcmp(chazhao,aut))
{
if(k==0)
{
printf("查询结果:\n\n");
printf("书号\t书名\t作者\t\t出版社\t\t现存量\t单价\n");
printf("%-8s%-9s%-14s%-16s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
k++;
fclose(fp);
}
}
}
if (k==0)
{
system ("cls");
printf("\n无符合记录!按任意键退出\n");
getch();
tsmain1();
}
printf("查询完成,按ESC退出查询,按回车继续查询\n");
i = getch();
for(;i!=27&&i!=13;)
i = getch();
}
tsmain1();
}
void cksj1()
{
FILE *fp;
int n=0;
int k=0,m=0,many=0;
float price=0;
char nam[20],aut[20],pub[20],num[20];
char i;
if ((fp=fopen("library.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();//返回
tsmain1();
}
n= tjzs();
if (n==0)
{
system ("cls");
printf("\n无任何记录!");
}
fp=fopen("library.txt","r");//打开只读文件
system ("cls");
printf("书号\t书名\t 作者\t\t出版社\t\t库存量\t单价\n");
for (m=0; m<n; m++) //输出数据
{
fscanf(fp,"%s%s%s%s%d%f",num,nam,aut,pub,&many,&price);
printf("%-8s%-9s%-14s%-18s%-7d%-8.2f\n",num,nam,aut,pub,many,price);
}
fclose(fp);
printf("\n按任意键返回\n");
getch();
tsmain1();
}
void borrow1()
{
FILE *fp,*fp3;
struct book *head=NULL;
struct book *p,*p1,*p2;
int i,loop,k,n=0,flag=0,s=0;
int jnum=0;
int many=0;
float tprice=0;
char tname[20],tauthor[20],tchuban[20],tshuhao[20],ttname[20],mingzi[20],riqi[20],zname[20];
char hit=0;
system("cls");
if((fp=fopen("library.txt","r"))==NULL)
{
system("cls");
printf("\n 图书馆无库存!按任意键退出!");
getch();
exit(0);
}
else
{
printf("\n请输入借阅书名:\n请输入:");
scanf("%s",zname);
k= tjzs();//统计图书馆文件个数
for (i=0; i<k; i++) //先将图书信息建立链表,更改库存
{
fscanf(fp,"%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,&many,&tprice);
n++;
if(n==1)
{
p1=p2=(struct book*)malloc(sizeof(struct book));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct book*)malloc(sizeof(struct book));
}
strcpy(p1->num,tshuhao);//复制书号
strcpy(p1->nam,tname);//复制书名
strcpy(p1->aut,tauthor);//复制作者
strcpy(p1->pub,tchuban);//复制出版社
p1->digit=many;//复制现存量
p1->price=tprice;//复制单价
}
if(n==0)
head=NULL;
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
p=head;
for (; p!=NULL;)
{
if(!(strcmp(p->nam,zname)))
{
flag=1;
loop=p->digit;
(p->digit)--;
}
p=p->next;
}
if(flag&&(loop>0))
{
fp=fopen("library.txt","w");
fclose(fp);
fp=fopen("library.txt","a");
p=head;
for(; p !=NULL;)
{
fprintf(fp,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->digit,p->price);
p=p->next;
}
free(p);
fclose(fp);
if ((fp3=fopen("reader.txt","r"))==NULL)//建读者文件夹存入借书信息
{
fp3=fopen("reader.txt","w");//打开只读文件
fclose(fp3);
}
fp3=fopen("reader.txt","a");
printf("\n请按以下格式输入读者信息:\n 证号 姓名 借书日期 借书书名\n请输入:");//录入读者信息
scanf("%d %s %s %s",&jnum,mingzi,riqi,zname);
fprintf(fp3,"\n%-18d%-23s%-18s%-10s\n",jnum,mingzi,riqi,zname);
fclose(fp3);
printf("借书成功!请两个月内归还!!!按任意键返回\n");
getch();//返回
tsmain1();//调用借阅系统
}
else
{
if(flag!=0)
printf("此书已被借完!按任意键返回!");//否则输出此书已被借完
else
printf("查找无此书!按任意键返回");
}
getch();//返回
tsmain1();//调用借阅系统
}
void Return1()
{
system("cls");
FILE *fp,*fp1;
int M=0;
int i=0,flag=0,j=0,k=0,n=0;
struct book s[100];
struct dz *head=NULL;
struct dz *p,*p1,*p2;
char name[20];
int H=tjzs(),G=tjzs1();
int txuehao=0,ttxuehao;
char tmingzi[20],triqi[20],tshuming[20],ttshuming[20];
char hitkey=0;
if((fp=fopen("reader.txt","r"))==NULL)
{
printf("不存在用户信息");
exit(0);
system("cls");
tsmain1();
}
printf("请输入读者学号及书名\n");
scanf("%d %s",&ttxuehao,ttshuming);
fp = fopen("reader.txt","r");
for(;!feof(fp);)
{
fscanf(fp,"%d%s%s%s",&txuehao,tmingzi,triqi,tshuming);
if((txuehao==ttxuehao)&&strcmp(ttshuming,tshuming)==0)
{
flag=1;
fclose(fp);
break;
}
}
if(flag==1)
{
fp1 = fopen("library.txt","r");
for(;!feof(fp1);)
{
fscanf(fp,"%s%s%s%s%d%f\n",s[M].num,s[M].nam,s[M].aut,s[M].pub,&s[M].digit,&s[M].price);
M++;
}
for(i=0;i<H;i++)
{
if(strcmp(ttshuming,s[i].nam)==0)
{
s[i].digit++;
fclose(fp1);
break;
}
}
fp1 = fopen("library.txt","w");
for(j=0;j<H;j++)
fprintf(fp1,"%-8s%-9s%-14s%-16s%-7d%-8.2f\n",s[j].num,s[j].nam,s[j].aut,s[j].pub,s[j].digit,s[j].price);
fclose(fp1);
fp = fopen("reader.txt","r");
for (k=0; k<G; k++)
{
fscanf(fp,"%d%s%s%s",&txuehao,tmingzi,triqi,tshuming);
if (strcmp(ttshuming,tshuming)!=0)//比较名字,将不同名字的信息复制到链表
{
n++;
if (n==1)//建立链表
{
p1=p2=(struct dz*)malloc(sizeof(struct dz));
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct dz*)malloc(sizeof(struct dz));//新建链表
}
strcpy(p1->mingzi,tmingzi);//复制借书名
strcpy(p1->riqi,triqi);//复制日期
strcpy(p1->shuming,tshuming);//复制书名
p1->xuehao=txuehao;//复制单价
}
}
if (n==0)
{
head=NULL;
}
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
fp=fopen("reader.txt","w");//清空文件,只写打开,然后关闭
fclose(fp);
fp=fopen("reader.txt","a");//追加文件
p=head;
for (; p!=NULL;) //把链表内容覆盖到文件
{
fprintf(fp,"%-8d%-23s%-18s%-10s\n",p->xuehao,p->mingzi,p->riqi,p->shuming);
p=p->next;
}
fclose(fp);
printf("还书成功!按任意键退出");
getch();
system("cls");
tsmain1();
}
if(flag==0)
{
printf("还书失败,请重新操作!\n");
Sleep(2000);
system("cls");
tsmain1();
}
}