//漏洞流交流
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "string.h"
#define MAX_ACCOUNT 10//最多注册10个账户,即10个学生信息
#define MAX_BOOK 30//最多存放30种图书
int i=0;
struct book{
char a[20],b[20],c[20],d[5];//a:书名 b:作者 c:出版社 d:价格
int e,flag;//e:库存 flag:标记为,判断数据在文件中是否有效(1有效0无效)
}books[MAX_BOOK];
struct stu{
char num[10],name[10],department[5],bor_ed[5][10],key[6];
int re_bor,flag;//re_bor:最多借5本,记录还可以借的本数 flag:标记为,判断数据在文件中是否有效(1有效0无效)
}stud[MAX_ACCOUNT];//用户
struct admi_{
char ad_name[15],key[15];
}admini;//管理员
void ad_menu()
{printf("您好,您选择的是图书管理系统管理员,请登录进行以下操作:/n");
printf("选择1:添加图书/n");
printf("选择2:查找图书/n");
printf("选择3:显示所有图书/n");
printf("选择4:显示所有用户/n");
printf("选择5:退出系统/n");
}
void user_menu()
{printf("您好,您选择的是图书管理系统用户,请登录进行以下操作:/n");
printf("选择1:查找图书/n");
printf("选择2:显示所有图书/n");
printf("选择3:我的信息/n");
printf("选择4:我要借书/n");
printf("选择5:我要还书/n");
printf("选择6:我要注册/n");
printf("选择7:退出系统/n");
}
void create_ad()
{
FILE *fp;
fp=fopen("administrator.dat","wb");
strcpy(admini.ad_name,"suncl12345");
strcpy(admini.key,"suncl4362615");
if(fwrite(&admini,sizeof(struct admi_),1,fp)!=1)
printf("write error/n");
fclose(fp);
}
void show_account(struct stu student)//显示学生信息
{int i;
if(student.num!="NULL")
{
printf("您的信息为:/n");
printf("借书证号:%s 姓名:%s 系别:%s/n",student.num,student.name,student.department);
if(student.re_bor!=5)
{printf("已借图书:/n");
for(i=0;i<5-student.re_bor-1;i++)
printf(" %s/n",student.bor_ed[i]);
}
else
printf("未借图书/n");
printf("还可以借:%d本/n",student.re_bor);
}
}
void show_book(struct book b_ook)//显示书的信息
{if(strcmp(b_ook.a,"x")!=0)
printf("书名:%s 作者:%s 出版社:%s 价格:%s 库存:%d/n",b_ook.a,b_ook.b,b_ook.c,b_ook.d,b_ook.e);
else
printf("没有此图书!/n");
}
void add_book()//添加图书信息
{
struct book book1;
FILE *fp;
fp=fopen("book_list.dat","ab");
printf("输入书名:");
scanf("%s",book1.a);
printf("输入作者:");
scanf("%s",book1.b);
printf("输入出版社:");
scanf("%s",book1.c);
printf("输入价格:");
scanf("%s",book1.d);
printf("输入书的本数:");
scanf("%d",&book1.e);
book1.flag=1;
if(fwrite(&book1,sizeof(struct book),1,fp)!=1)
printf("write error!!!/n");
else
printf("操作成功!/n");
fclose(fp);
}
void add_account()//注册账户
{struct stu student;
char k[6],flag='1';
int i,j=1;
FILE *fp,*fp1;
fp1=fopen("stu_list.dat","rb");//读文件用来判断用户是否已注册
fp=fopen("stu_list.dat","ab");//写文件用来添加用户
while('1'==flag)
{
while(1==j)
{printf("请输入借书证号(8位):");
scanf("%s",student.num);
printf("请输入您的姓名:");
scanf("%s",student.name);
printf("请输入您的系别:");
scanf("%s",student.department);
printf("请输入密码(6位):");
scanf("%s",student.key);
printf("请再次输入密码(6位):");
scanf("%s",k);
for(i=0;i<MAX_ACCOUNT;i++)
{
fread(&stud[i],sizeof(struct stu),1,fp1);
if(strcmp(stud[i].num,student.num)==0)
{printf("您输入的账号已被注册,请重新输入!/n");
j=1;
break;
}
else
j=0;
}
}
if(strcmp(student.key,k)!=0)
{printf("两次密码不符,请重新注册!/n");
j=1;
}
else
flag='0';
}
student.re_bor=5;
student.flag=1;
for(i=0;i<5;i++)
strcpy(student.bor_ed[i],"NULL");
if('0'==flag)
{
if(fwrite(&student,sizeof(struct stu),1,fp)!=1)
printf("系统原因,注册用户失败!");
else
{printf("恭喜您注册成功!/n");
show_account(student);
}
}
fclose(fp);
fclose(fp1);
}
struct book find_book(char *name)//查找图书
{struct book b;
int j;
FILE *fp;
fp=fopen("book_list.dat","rb");
for(j=0;j<MAX_BOOK;j++)
{fread(&books[j],sizeof(struct book),1,fp);
if(strcmp(books[j].a,name)==0)
{
return books[j];
}
}
if(j==MAX_BOOK)
{strcpy(b.a,"x");
return b;
}
else
return books[j];
fclose(fp);
}
struct stu landing()//登陆
{struct stu s;
char n[10],k[6];
int i,j;
FILE *fp;
fp=fopen("stu_list.dat","rb");
strcpy(s.num,"NULL");//用于返回,记录是否登录成功
while(j)
{
printf("每人最多可借五本!/n");
printf("请输入借书证号:");
scanf("%s",n);
if(strlen(n)!=8)
printf("借书证号不满足要求,请重新输入!/n");
else
j=0;
}
printf("请输入密码:");
scanf("%s",k);
for(i=0;i<MAX_ACCOUNT;i++)
{fread(&stud[i],sizeof(struct stu),1,fp);
if(strcmp(stud[i].num,n)==0)
break;
}
if(i==MAX_ACCOUNT)
{printf("您还未注册,请返回首页注册!/n");
return s;
}
else
if(strcmp(stud[i].key,k)==0)
{printf("登陆成功!/n");
show_account(stud[i]);
return stud[i];
}
else
{printf("密码错误!/n");
return s;
}
fclose(fp);
}
struct book cpy_book(struct book a,struct book b)//将b的内容复制给a并返回a
{strcpy(a.a,b.a);
strcpy(a.b,b.b);
strcpy(a.c,b.c);
strcpy(a.d,b.d);
a.e=b.e;
a.flag=b.flag;
return a;
}
struct stu cpy_student(struct stu a,struct stu b)//将b的内容复制给a并返回a
{int i;
strcpy(a.department,b.department);
strcpy(a.key,b.key);
strcpy(a.name,b.name);
strcpy(a.num,b.num);
for(i=0;i<5;i++)
strcpy(a.bor_ed[i],b.bor_ed[i]);
a.re_bor=b.re_bor;
a.flag=b.flag;
return a;
}
void borrow()//借书
{struct book b;
struct stu s;
char b_name[10];
int i,j,m;
s=landing();
FILE *fp,*fp_,*fp1,*fp1_;
fp=fopen("stu_list.dat","rb");
fp1=fopen("book_list.dat","rb");
if(strcmp(s.num,"NULL")!=0)
{printf("您可以借书了!/n请输入书名:");
scanf("%s",b_name);
b=find_book(b_name);
if(strcmp(b.a,"x")!=0)
{show_book(b);
printf("请输入您要借的本数:");
scanf("%d",&i);
if(b.e-i>=0)
{if(s.re_bor-i>=0)
{b.e=b.e-i; //进行借书操作
s.re_bor=s.re_bor-i;
for(j=0;j<MAX_BOOK;j++)
{fread(&books[j],sizeof(struct book),1,fp1);
if(strcmp(books[j].a,b.a)==0)
books[j]=cpy_book(books[j],b);
}
fp1_=fopen("book_list.dat","wb");
for(j=0;j<MAX_BOOK;j++)
if(1==books[j].flag)
fwrite(&books[j],sizeof(struct book),1,fp1_);//将books中的信息循环输入到文件中
fclose(fp1_);
//以上为写入book_list表
for(m=5-s.re_bor;m<5-s.re_bor+i;m++)
strcpy(s.bor_ed[m],b_name);
for(j=0;j<MAX_ACCOUNT;j++)
{fread(&stud[j],sizeof(struct stu),1,fp);
if(strcmp(stud[j].num,s.num)==0)
stud[j]=cpy_student(stud[j],s);
}
fp_=fopen("stu_list.dat","wb");
for(j=0;j<MAX_BOOK;j++)
if(1==stud[j].flag)
fwrite(&stud[j],sizeof(struct stu),1,fp_);//将stud中的信息循环输入到文件中
fclose(fp_);
//以上为写入stu_list表
printf("借书成功!/n");
}
else
printf("最多只能借5本!/n");
}
else
printf("库存不足,借书失败!/n");
}
else
printf("对不起,没有找到您要借的书,请确认后再借阅!/n");
}
else
;
fclose(fp);
fclose(fp1);
}
void back()
{struct book b;
struct stu s;
char b_name[10];
int i,j,m;
FILE *fp,*fp_,*fp1,*fp1_;
fp=fopen("stu_list.dat","rb");
fp1=fopen("book_list.dat","rb");
s=landing(); //登陆后记录学生信息
if(strcmp(s.num,"NULL")!=0)
{printf("您可以还书了!/n请输入书名:");
scanf("%s",b_name);
b=find_book(b_name);
if(strcmp(b.a,"x")!=0)
{show_book(b);
printf("请输入您要还的本数:");
scanf("%d",&i);
if(s.re_bor+i>=0)
{b.e=b.e+i; //进行还书操作
s.re_bor=s.re_bor+i;
for(m=0;m<5;m++)
if(strcmp(s.bor_ed[m],"NULL")==0)
for(j=m;j<4;j++)
strcpy(s.bor_ed[j],s.bor_ed[j+1]);
else
;
for(m=5-s.re_bor;m<i+(5-s.re_bor);m++)
strcpy(s.bor_ed[m],"NULL");
for(m=0;m<i;m++)
strcpy(s.bor_ed[m],b_name);
for(j=0;j<MAX_ACCOUNT;j++)
{fread(&stud[j],sizeof(struct stu),1,fp);
if(strcmp(stud[j].num,s.num)==0)
stud[j]=cpy_student(stud[j],s);
}
fp_=fopen("stu_list.dat","wb");
for(j=0;j<MAX_BOOK;j++)
if(1==stud[j].flag)
fwrite(&stud[j],sizeof(struct stu),1,fp_);//将stud中的信息循环输入到文件中
fclose(fp_);
//以上为写入stu_list表
for(j=0;j<MAX_BOOK;j++)
{fread(&books[j],sizeof(struct book),1,fp1);
if(strcmp(books[j].a,b.a)==0)
books[j]=cpy_book(books[j],b);
}
fp1_=fopen("book_list.dat","wb");
for(j=0;j<MAX_BOOK;j++)
if(1==books[j].flag)
fwrite(&books[j],sizeof(struct book),1,fp1_);//将books中的信息循环输入到文件中
fclose(fp1_);
//以上为写入book_list表
printf("还书成功!/n");
}
else
printf("还书失败,您的书已经还完了!/n");
}
else
printf("对不起,您要还的书非本图书库,请确认后再操作!/n");
}
else
;
fclose(fp);
fclose(fp1);
}
void show_allusers()//显示所有用户
{
int j,i;
FILE *fp;
fp=fopen("stu_list.dat","rb");
for(j=0;j<MAX_ACCOUNT;j++)
if(fread(&stud[j],sizeof(struct stu),1,fp)!=0)
if(stud[j].flag==1)
{printf("学号:%s 姓名:%s 系别:%s/n",stud[j].num,stud[j].name,stud[j].department);
printf("已借图书:/n");
for(i=0;i<5;i++)
{printf(" %s/n",stud[j].bor_ed[i]);
}
}
fclose(fp);
}
void show_allbooks()//显示所有图书
{
int j;
FILE *fp;
fp=fopen("book_list.dat","rb");
for(j=0;j<MAX_BOOK;j++)
{if(fread(&books[j],sizeof(struct book),1,fp)!=0)
if(books[j].flag==1)
printf("书名:%s 作者:%s 出版社:%s 价格:%s 剩余:%d/n",books[j].a,books[j].b,books[j].c,books[j].d,books[j].e);
}
fclose(fp);
}
void main()
{int k,m,choose;
char n[10],ad_n[15],ad_k[15];
struct admi_ adm;
FILE *fp1;
create_ad();
fp1=fopen("administrator.dat","rb");
fread(&adm,sizeof(struct admi_),1,fp1);
printf("您的身份:/n");
printf("1,管理员/n");
printf("2,用户/n");
scanf("%d",&choose);
switch(choose)
{case 1: //管理员
{ad_menu();
printf("请输入管理员名:");
scanf("%s",ad_n);
printf("请输入管理员密码:");
scanf("%s",ad_k);
if(strcmp(adm.ad_name,ad_n)==0&&strcmp(adm.key,ad_k)==0)
{m=1;
while(m)
{printf("管理员登陆成功!/n请选择操作:");
scanf("%d",&k);
switch(k)
{case 1:
add_book();break;
case 2:
{printf("请输入书名:");
scanf("%s",n);
show_book(find_book(n));
}break;
case 3:
show_allbooks();break;
case 4:
show_allusers();break;
case 5:
m=0;break;
default:
{printf("input error!!!");
m=0;
}break;
}
}
}
else
printf("您输入错误,请确认后再输!!!/n");
}break;
case 2: //用户
{m=1;
while(m)
{
user_menu();
scanf("%d",&k);
switch(k)
{case 1:
{printf("请输入书名:");
scanf("%s",n);
show_book(find_book(n));
break;
}
case 2:
show_allbooks();break;
case 3:
show_account(landing());break;
case 4:
borrow();break;
case 5:
back();break;
case 6:
add_account();break;
case 7:
m=0;break;
default:
{printf("input error!!!/n");
m=0;
}
break;
}
}
}
}
fclose(fp1);
}