/*
图书馆管理系统
*/
/*定义结构体类型*/
struct student /*建立学生型结构体*/
{
char stunum[7]; /*学号*/
int number; /*已借书数量*/
};
struct book /*建立书籍型结构体*/
{
int bnum; /*索书号*/
char bname[21]; /*书名*/
int outnum; /*目前出借量*/
int time; /*出借次数*/
int innum; /*库存余量*/
};
struct riqi
{
int year;
int month;
int day;
int yd;
};
struct relation /*建立借还关系型结构体*/
{
char stunum[7]; /*学号*/
int bnum; /*索书号*/
struct riqi date; /*借书日期*/
};
struct list
{
struct list *next;
int bnum;
char bname[21];
int num;
int time;
};
/*定义全局变量*/
int N,M,L,K=10; /*N、M、L,K分别为学生人数、书籍种数、借还关系数和每个同学最多能借的书籍数量*/
static int amount[2001][200][13];
static int times[2001][200][13];
char fname1[21],fname2[21],fname3[21]; /*分别为三个文件的文件名*/
#define length1 sizeof(struct student) /*三个类型的结构体各自长度*/
#define length2 sizeof(struct book)
#define length3 sizeof(struct relation)
#include"stdio.h"
#include"string.h"
#include"time.h"
/*buildfile1的功能是建立学生人事文件*/
void buildfile1()
{
struct student stu;
int j;
FILE *fp;
printf("请输入学生人事文件名(长度不超过20位):");
gets(fname1);
fp=fopen(fname1,"wb");
printf("请输入学生数:");
scanf("%d",&N);
getchar();
for(j=1; j<=N; j++)
{
printf("请输入第%d位学生学号(长度不超过6位):",j);
gets(stu.stunum);
printf("请输入第%d位学生已借书数量(数量不超过10):",j);
scanf("%d",&stu.number);
fwrite(&stu,length1,1,fp);
printf("\n");
getchar();
}
fclose(fp);
return;
}
/*buildfile2的功能是建立书籍档案文件*/
void buildfile2()
{
struct book boo;
int j,num,rest;
FILE *fp;
printf("请输入书籍档案文件名(长度不超过20位):");
gets(fname2);
fp=fopen(fname2,"wb");
printf("请输入书籍种数:");
scanf("%d",&M);
for(j=1; j<=M; j++)
{
printf("请输入第%d本书索书号(整型不超过2000):",j);
scanf("%d",&boo.bnum);
getchar();
printf("请输入第%d本书书名(长度不超过20位):",j);
gets(boo.bname);
printf("请输入第%d本书目前出借量:",j);
scanf("%d",&num);
boo.outnum=num;
printf("请输入第%d本书目前库存量:",j);
scanf("%d",&rest);
boo.innum=rest;
fwrite(&boo,length2,1,fp);
printf("\n");
getchar();
}
fclose(fp);
return;
}
/*buildfile3的功能是建立借还关系文件*/
void buildfile3()
{
struct relation rela;
int j,i,ye,mon,da,p,q,das[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
FILE *fp;
printf("请输入借还关系文件名(长度不超过20位):");
gets(fname3);
fp=fopen(fname3,"wb");
printf("请输入已有借还关系数:");
scanf("%d",&L);
getchar();
for(j=1; j<=L; j++)
{
printf("请输入第%d个借还关系的学号(长度不超过6位):",j);
gets(rela.stunum);
printf("请输入第%d个借还关系的索书号(整型不超过2000):",j);
scanf("%d",&rela.bnum);
printf("请输入第%d个借还关系的借书日期\n",j);
printf("年度: ");
scanf("%d",&ye);
p=(ye%4==0&&ye%100!=0)||(ye%400==0);
if(p)
das[2]=29;
printf("月份: ");
scanf("%d",&mon);
printf("号: ");
scanf("%d",&da);
rela.date.year=ye;
rela.date.month=mon;
rela.date.day=da;
rela.date.yd=0;
q=rela.bnum;
times[q][ye-1900][mon]++;
for(i=1; i<mon; i++)
rela.date.yd+=das[i];
rela.date.yd+=da;
fwrite(&rela,length3,1,fp);
printf("\n");
getchar();
}
fclose(fp);
return;
}
/*print1的功能是输出学生人事文件*/
void print1()
{
struct student stu;
int j;
FILE *fp;
fp=fopen(fname1,"rb");
printf("学号 已借书数量\n");
for(j=0; j<N; j++)
{
fread(&stu,length1,1,fp);
printf("%-10s%-10d%\n",
stu.stunum,stu.number);
}
printf("\n");
fclose(fp);
return;
}
/*print2的功能是输出书籍档案文件*/
void print2()
{
struct book boo;
int j;
FILE *fp;
fp=fopen(fname2,"rb");
printf("索书号 书名 目前出借量 目前库存量 \n");
for(j=0; j<M; j++)
{
fread(&boo,length2,1,fp);
printf("%-12d%-12s%-8d%10d%\n",
boo.bnum,boo.bname,boo.outnum,boo.innum);
}
printf("\n");
fclose(fp);
return;
}
/*print3的功能是输出借还关系文件*/
void print3()
{
struct relation rela;
int j;
FILE *fp;
fp=fopen(fname3,"rb");
printf("学号 索书号 借书日期\n");
for(j=0; j<L; j++)
{
fread(&rela,length3,1,fp);
printf("%-10s%-10d%6d年%6d月%6d日\n",rela.stunum,rela.bnum,rela.date.year,rela.date.month,rela.date.day);
}
printf("\n");
fclose(fp);
return;
}
/*import的功能是统计每天各种类型书籍的进货量*/
#include"stdlib.h"
#include"math.h"
void day_import()
{
struct book boo[20];
int j,t;
FILE *fp;
struct riqi da;
struct tm *star;
time_t t1;
t1=time(NULL);
star=localtime(&t1);
da.year=star->tm_year+1900;
da.month=star->tm_mon+1;
da.day=star->tm_mday;
da.yd=star->tm_yday;
fp=fopen(fname2,"r+");/*以读写方式打开二进制书籍档案文件*/
for(j=0; j<M; j++)
{
fread(&boo[j],length2,1,fp); /*依次读入每本书的信息*/
t=fabs(rand()); /*随机设置每本书的进货量*/
amount[boo[j].bnum][da.year-1900][da.month]+=t;
boo[j].innum+=t; /*加入这本书的库存量*/
printf("进货日期%6d年%6d月%6d日\n",da.year,da.month,da.day);
printf("%10d号书本日进货量为%6d本\n",boo[j].bnum,t);
printf("%10d号书的库存量现为%6d本\n",boo[j].bnum,boo[j].innum);
}
fclose(fp); /*关闭文件*/
fp=fopen(fname2,"r+"); /*以读写方式打开二进制书籍档案文件*/
for(j=0; j<M; j++)
fwrite(&boo[j],length2,1,fp);
fclose(fp); /*关闭文件*/
printf("\n");
print2();
}
/*borrow函数的功能是借阅图书(按日常习惯约定,每本书每人只能借一本)*/
void borrow()
{
FILE *fp1,*fp2,*fp3;
struct student stu[80];
struct book boo[200];
struct relation rela;
struct riqi dat;
struct tm *star;
time_t t1;
char stunum[10];
int i,j,bnum,num=0;
t1=time(NULL);
star=localtime(&t1);
dat.year=star->tm_year+1900;
dat.month=star->tm_mon+1;
dat.day=star->tm_mday;
dat.yd=star->tm_yday;
printf("借书日期%6d年%6d月%6d日\n",dat.year,dat.month,dat.day);
getchar();
printf("请输入您的学号(长度不超过6位): ");
gets(stunum);
do
{
printf("请输入要借的本数(不大于5):");
scanf("%d",&num);
if(num>5)
printf("对不起,本图书馆每次最多只能借五本书,谢谢合作!\n");
}
while(num<=0||num>5);
for(i=0; i<num; i++)
{ getchar();
printf("请输入您要借的书的索书号(整型不超过2000):");
scanf("%d",&bnum);
fp1=fopen(fname1,"r+");
for(j=0; j<N; j++)
{
fread(&stu[j],length1,1,fp1);
if(strcmp(stu[j].stunum,stunum)==0)
if(stu[j].number>K-5)
{
printf("对不起,您的剩余借阅量不足!\n");
return;
}
}
fclose(fp1);
fp2=fopen(fname2,"r+");
for(j=0; j<M; j++)
{
fread(&boo[j],length2,1,fp2);
if(boo[j].bnum==bnum)
if(boo[j].innum==0)
{
printf("对不起,您要借阅的书已全部借出!\n");
return;
}
else
{
times[boo[j].bnum][dat.year-1900][dat.month]++;
boo[j].outnum++;
boo[j].innum--;
}
}
fclose(fp2);
for(j=0; j<N; j++)
if(strcmp(stu[j].stunum,stunum)==0)
stu[j].number++;
fp1=fopen(fname1,"r+");
for(j=0; j<N; j++)
fwrite(&stu[j],length1,1,fp1);
fclose(fp1);
fp2=fopen(fname2,"r+");
for(j=0; j<M; j++)
fwrite(&boo[j],length2,1,fp2);
fclose(fp2);
L++;
strcpy(rela.stunum,stunum);
rela.bnum=bnum;
rela.date.year=dat.year;
rela.date.month=dat.month;
rela.date.day=dat.day;
rela.date.yd=dat.yd;
fp3=fopen(fname3,"ab");