图书信息管理系统——C语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图书信息管理系统
前言
计算机对社会发展所具有的广泛而深远的影响。
人类文化的内涵是随着社会发展而进化的。
在现代信息社会中,计算机已不仅仅是一种工具,而且是一种文化。
信息技术对人类社会进行的全方位渗透,已经形成一种新的文化形态——信息时代的计算机文化。
计算机知识成为当代知识分子结构中不可缺少的重要部分。
C语言是今年来国内外得到迅速推广使用的一种高级语言。
C语言功能丰富,表达能力强,使用灵活方便,应用广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的语言特点,因此C语言对我们来说很重要。
设计是一门重要的计算机基础课程,通过学习,学生不仅要掌握高级程序设计语言的知识,更重要的是在实践中逐步掌握程序设计的思想和方法,培养问题求解和语言的应用能力。
此次上机实习,不但要使同学们的程序设计能力上一台阶,同时要提高与程序设计和软件开发有关的各种综合能力。
由于课时和上机时间的仓促,所以我对很多内容还来不及消化,对上机演练十分陌生,还有一些知识遗忘,因而这次程序设计的实习实际上是对我的一次集中的强化练习。
虽然其时间短,任务重,但我们的确达到了此次课程设计的目的。
图书信息管理系统
一、题目要求
1、新进图书基本信息的输入。
2、办理借书手续。
3、办理还书手续。
4、管理书籍。
二、需求分析
根据题目需要,由于图书信息需要存放在文件中,所以应提供文件输入、输出等操作。
应提供查找、借阅、管理等功能。
由于有多种借阅图书的方法,而又需要提供相应的算法,最后还应提供键盘是选择菜单实现功能。
三、总体设计
四、详细设计
1、主函数
[说明]
主函数较多、较复杂,已经和主菜单函数合并,主菜单函数里还包括了各自的二级菜单,并已经开始了对各个函数的调用。
[流程]
[程序]
void main() { int choice; printf("请建立学生人事文件\n");
buildfile1(); /*建立并输出学生人事文件*/ print1(); printf("请建立书籍档案文件\n"); buildfile2(); print2(); /*建立并输出书*/ printf("请建立借还关系文件\n");
buildfile3(); /*建立并输出借还关系文件*/ print3(); printf("\n"); printf("欢迎使用图书馆管理系统!\n");
do
{
printf("0---退出\n1----借书\n2---还书\n3---统计某天各种类型书进货量\n");
printf("4---对各类书某月进货量、出借量用链表进行排序\n");
printf("5---查询本人书籍借阅情况\n6---查询某类图书借还情况\n");
printf("请输入您要进行的操作:");
scanf("%d",&choice);
switch(choice)
{
case 0: printf("退出成功\n"); return;
case 1: borrow(); break;
case 2: back(); break;
case 3: day_import(); break;
case 4: sort(); break;
case 5: searchme(); break;
case 6: search(); break;
default: printf("非法输入! 请重输!\n\n");
}
}
while(choice>=0||choice<=6);
}
2、各功能模块设计
(1)建立学生人事文件模块
[说明]
数据信息存放在文件中,一条记录对应一条学生信息,方便管理。
[流程]
[程序]
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;
}
(2)建立书籍档案文件
[说明]
建立书籍档案文件,统一管理图书信息。
[流程]
建立书籍文件
添加书
籍种类
添加每
类书的出借
量,库存量,
和索书号
[程序]
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;
}
(3)建立借还关系文件
[说明]
建立借还关系文件,管理借还数据
[流程]
输入借
还关系文件名
输入借还关
系数
输入每个借还关系的学号,索书号,
和借书日期
[程序]
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;
}
(4)进入主函数
[说明]
进行借书,还书,统计某天各种图书进出货量
[程序]
void main()
{
int choice;
printf("请建立学生人事文件\n");
buildfile1(); /*建立并输出学生人事文件*/
print1();
printf("请建立书籍档案文件\n");
buildfile2();
print2(); /*建立并输出书*/
printf("请建立借还关系文件\n");
buildfile3(); /*建立并输出借还关系文件*/
print3();
printf("\n");
printf("欢迎使用图书馆管理系统!\n");
do
{
printf("0---退出\n1----借书\n2---还书\n3---统计某天各种类型书进货量\n");
printf("4---对各类书某月进货量、出借量进行排序\n");
printf("5---查询本人书籍借阅情况\n6---查询某类图书借还情况\n");
printf("请输入您要进行的操作:");
scanf("%d",&choice);
switch(choice)
{
case 0: printf("退出成功\n"); return;
case 1: borrow(); break;
case 2: back(); break;
case 3: day_import(); break;
case 4: sort(); break;
case 5: searchme(); break;
case 6: search(); break;
default: printf("非法输入! 请重输!\n\n");
}
}
while(choice>=0||choice<=6);
}
(5)统计图书进出货量
[说明]统计某日的图书进出货量。
[程序]
#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();
}
(6)借阅函数
[说明]将图书借与学生。
[流程图]
[程序]
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");
fwrite(&rela,length3,1,fp3);
fclose(fp3);
printf("借阅成功,请记住按时还书!\n");
}
}
(7)还书函数
[说明]管理还书数据
[流程图]
[程序]
void back()
{
FILE *fp1,*fp2,*fp3;
struct student stu[20];
struct book boo[20];
struct relation rela[800];
char stunum[10];
int j,num=0,bnum;
getchar();
printf("请输入您的学号(长度不超过6位): ");
gets(stunum);
printf("请输入您要还的书的索书号(整型不超过2000):");
scanf("%d",&bnum);
printf("请输入要还的本数:");
scanf("%d",&num);
fp1=fopen(fname1,"r+");
for(j=0; j<N; j++)
{
fread(&stu[j],length1,1,fp1);
if(strcmp(stu[j].stunum,stunum)==0)
stu[j].number--;
}
fclose(fp1);
fp2=fopen(fname2,"r+");
for(j=0; j<M; j++)
{
fread(&boo[j],length2,1,fp2);
if(boo[j].bnum==bnum)
{
boo[j].outnum--;
boo[j].innum++;
}
}
fclose(fp2);
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);
fp3=fopen(fname3,"r+");
for(j=0; j<L; j++)
fread(&rela[j],length3,1,fp3);
fclose(fp3);
fp3=fopen(fname3,"r+"); /*以只写方式打开二进制文件*/
for(j=0; j<L; j++)
if((rela[j].bnum!=bnum)||(strcmp(rela[j].stunum,stunum)!=0)) /*若两索书号不相同*/
fwrite(&rela[j],length3,1,fp3); /*则将该借还关系信息重新写入借还关系文件*/
L--; /*借还关系个数减1*/
fclose(fp3); /*关闭文件*/
printf("还书成功,欢迎再来借阅!\n");
}
(8)统计各种书进出货量
[说明]
统计某日的图书近出货量
[程序]
void sortnum(struct list *head)
{
struct list *re,*p,*q;
int j,mark=1;
while(mark!=0)
{
re=p=head;
mark=0;
while(p!=NULL&&p->next!=NULL)
{
q=p->next;
if(p->num>q->num)
{
p->next=q->next;
q->next=p;
if(p!=head)
re->next=q;
else
head=q;
mark=1;
}
re=p;
p=p->next;
}
printf("各类书本月进货量由小到大依次为:\n");
p=head;
for(j=0; j<M; j++)
{
printf("%10d号书, 本月进货量为%6d本\n",p->bnum,p->num);
p=p->next;
}
free(p);
}
void sorttime(struct list *head)
{
struct list *re,*p,*q;
int j,mark=1;
while(mark!=0)
{
re=p=head;
mark=0;
while(p!=NULL&&p->next!=NULL)
{
q=p->next;
if(p->time>q->time)
{
p->next=q->next;
q->next=p;
if(p!=head)
re->next=q;
else
head=q;
mark=1;
}
re=p;
p=p->next;
}
}
printf("各类书本月出借次数由小到大依次为:\n");
p=head;
for(j=0; j<M; j++)
{
printf("%10d号书, 本月出借次数为%6d次\n",p->bnum,p->time);
p=p->next;
}
void sort()
{
struct list *head,*p,*q;
int j,ye,mon;
struct book boo;
FILE *fp2;
head=(struct list *)malloc(sizeof(struct list));
q=head;
printf("请输入要查询的日期\n");
printf("年度: ");
scanf("%d",&ye);
printf("月份: ");
scanf("%d",&mon);
fp2=fopen(fname2,"rb");
for(j=0; j<M; j++)
{
fread(&boo,length2,1,fp2);
p=(struct list *)malloc(sizeof(struct list));
p->bnum=boo.bnum;
strcpy(p->bname,boo.bname);
p->num=amount[p->bnum][ye-1900][mon];
p->time=times[p->bnum][ye-1900][mon];
q->next=p;
q=p;
}
q->next=NULL;
q=head;
head=head->next;
free(q);
fclose(fp2);
p=head;
for(j=0; j<M; j++)
{
printf("%10d号书的本月进货量为%6d本,本月出借次数为%6d次\n",p->bnum,p->num,p->time);
p=p->next;
}
sortnum(head);
sorttime(head);
}
(9)查询本人书籍借阅情况
[说明]
查询具体哪位同学的借阅情况
[程序]
void searchme()
{
struct relation rela;
int j,sum=0,days,gq=0;
char stunum[10];
FILE *fp;
struct tm *star;
time_t t1;
getchar();
printf("请输入您的学号: ");
gets(stunum);
fp=fopen(fname3,"rb"); /*以只读方式打开二进制借还关系文件*/
t1=time(NULL);
star=localtime(&t1);
for(j=0; j<L; j++)
{
fread(&rela,length3,1,fp); /*依次读入每个借还关系的信息*/
if(strcmp(rela.stunum,stunum)==0) /*两学号相同*/
{
sum++;
if(star->tm_year+1900==rela.date.year) days=star->tm_yday-rela.date.yd;
else
if((star->tm_year+1900==rela.date.year+1)&&(star->tm_mon+1==1))
days=star->tm_mday+31-rela.date.day;
else
days=32;
if(days>=0&&days<=30)
printf("您借阅了%10d号书,借期还有%6d天\n",rela.bnum,30-days);
else
{
printf("您借阅的%10d号书已过期,请尽快返还,谢谢合作!\n",rela.bnum);
gq++;
}
}
}
printf("目前您总共借阅了%6d本书,其中%6d本过期\n",sum,gq);
fclose(fp); /*关闭文件*/
}
(10)查询某类图书借阅情况
[说明]
即某种图书的出借量和库存量
[程序]void search()
{
struct relation rela;
struct book boo;
FILE *fp2,*fp3;
int j,boonum;
getchar();
printf("请输入要查询的书的索书号(整型不超过2000): ");
scanf("%d",&boonum);
fp2=fopen(fname2,"rb"); /*以只读方式打开二进制书籍档案文件*/
for(j=0;j<M;j++)
{
fread(&boo,length2,1,fp2);
if(boo.bnum==boonum)
printf("该书目前的出借量为%6d,库存量为%6d\n",boo.outnum,boo.innum);
}
fclose(fp2);
fp3=fopen(fname3,"rb"); /*以只读方式打开二进制借还关系文件*/
for(j=0;j<L;j++)
{
fread(&rela,length3,1,fp3); /*依次读入每个借还关系*/
if(rela.bnum==boonum) /*若两索书号相同*/
printf("%10s号学生借阅了这本书,借出日期%6d 年%6d月%6d号\n",
rela.stunum,rela.date.year,rela.date.month,rela.date.day);
}
fclose(fp3); /*关闭文件*/
return;
}
五、后记
为期4天的C语言实训已经结束,但是给我的影响是相当大的。
通过这次实训,使我明白C语言这门课程光仅仅是听课是远远不够的,上机训练也不容忽视。
通过上机训练,才能够明白自己知识的不足,才能够有的放矢,更加深刻的理解C语言中的知识点,从而找到知识漏点,学到以前不懂的知识,对以前认为自己已懂了的知识点也理解更加深刻。
当遇到了自己当时不知如何编写的C语言题目时,通过自己的学习和同学的交流,得以顺利的编写,使我增加了对C语言的兴趣和学好C语言的信心。
本次C语言实习的几个作用:
1.加深对课堂讲授内容的理解
课堂上要讲授许多关于C语言的语法规则,听起来比较枯燥,不易记忆。
而通过多次上机练习,对于语法知识就有了更深的认识,自然而然地掌握C语言的语法规定。
学习C语言不能停留在书本,而是要利用学到的知识编写C语言程序,解决实际问题。
通过对自己编写程序的调试,发现问题,解决问题,逐步提高自己对C语言的理解和程序开发能力。
2.熟悉程序开发环境、学习计算机系统的操作方法
一个C语言程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。
所谓"环境"就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进行程序开发工作。
通过上机实验,熟练地掌握C语言开发环境,为以后真正编写计算机程序解决实际问题打下基础。
同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。
在这次实习的过程我中遇到了一些难题,老师给予了我细心的指导,帮助我解决了很多程序上的问题,解答了我一直以来的疑惑,避免了不少弯路。
再次向老师的帮助表示衷心的感谢!
六、附录
源程序清单
/*
图书馆管理系统
*/
/*定义结构体类型*/
struct student /*建立学生型结构体*/ {
c har stunum[7]; /*学号*/
i nt number; /*已借书数量*/
};
struct book /*建立书籍型结构体*/
{
int bnum; /*索书号*/
char bname[21]; /*书名*/
i nt outnum; /*目前出借量*/
i nt time; /*出借次数*/
i nt innum; /*库存余量*/
};
struct riqi
{
i nt year;
int month;
i nt day;
i nt yd;
};
struct relation /*建立借还关系型结构体*/ {
c har stunum[7]; /*学号*/
int bnum; /*索书号*/
struct riqi date; /*借书日期*/
};
struct list
{
s truct list *next;
i nt bnum;
c har bname[21];
i nt num;
i nt 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);
f write(&stu,length1,1,fp);
p rintf("\n");
g etchar();
}
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++)
{
f read(&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");
fwrite(&rela,length3,1,fp3);
fclose(fp3);
printf("借阅成功,请记住按时还书!\n");
}
}
/*back函数的功能是归还图书*/
void back()
{
FILE *fp1,*fp2,*fp3;
struct student stu[20];
struct book boo[20];
struct relation rela[800];
char stunum[10];
int j,num=0,bnum;
getchar();
p rintf("请输入您的学号(长度不超过6位): ");
g ets(stunum);
p rintf("请输入您要还的书的索书号(整型不超过2000):"); s canf("%d",&bnum);
p rintf("请输入要还的本数:");
s canf("%d",&num);
f p1=fopen(fname1,"r+");
f or(j=0; j<N; j++)
{
fread(&stu[j],length1,1,fp1);
if(strcmp(stu[j].stunum,stunum)==0)
stu[j].number--;
}
f close(fp1);
f p2=fopen(fname2,"r+");
f or(j=0; j<M; j++)
{
fread(&boo[j],length2,1,fp2);
if(boo[j].bnum==bnum)
{
boo[j].outnum--;
boo[j].innum++;
}
}
f close(fp2);
fp1=fopen(fname1,"r+");
f or(j=0; j<N; j++)
fwrite(&stu[j],length1,1,fp1);
f close(fp1);
f p2=fopen(fname2,"r+");
for(j=0; j<M; j++)
fwrite(&boo[j],length2,1,fp2);
f close(fp2);
f p3=fopen(fname3,"r+");
f or(j=0; j<L; j++)
fread(&rela[j],length3,1,fp3);
f close(fp3);
fp3=fopen(fname3,"r+"); /*以只写方式打开二进制文件*/
for(j=0; j<L; j++)
if((rela[j].bnum!=bnum)||(strcmp(rela[j].stunum,stunum)!=0)) /*若两索书号不相同*/
fwrite(&rela[j],length3,1,fp3); /*则将该借还关系信息重新写入借还关系文件*/
L--; /*借还关系个数减1*/
f close(fp3); /*关闭文件*/
printf("还书成功,欢迎再来借阅!\n");
}
void sortnum(struct list *head)
{
s truct list *re,*p,*q;
i nt j,mark=1;
w hile(mark!=0)
{
re=p=head;
mark=0;
while(p!=NULL&&p->next!=NULL)
{
q=p->next;
if(p->num>q->num)
{
p->next=q->next;
q->next=p;
if(p!=head)
re->next=q;
else
head=q;
mark=1;
}
re=p;
p=p->next;
}
}
p rintf("各类书本月进货量由小到大依次为:\n");
p=head;
f or(j=0; j<M; j++)
{
printf("%10d号书, 本月进货量为%6d本\n",p->bnum,p->num);
p=p->next;
}
f ree(p);
}
void sorttime(struct list *head)
{
s truct list *re,*p,*q;
i nt j,mark=1;
w hile(mark!=0)
{
re=p=head;
mark=0;
while(p!=NULL&&p->next!=NULL)
{
q=p->next;
if(p->time>q->time)
{
p->next=q->next;
q->next=p;
if(p!=head)
re->next=q;
else
head=q;
mark=1;
}
re=p;
p=p->next;
}
}
printf("各类书本月出借次数由小到大依次为:\n");
p=head;
f or(j=0; j<M; j++)
{
printf("%10d号书, 本月出借次数为%6d次\n",p->bnum,p->time);
p=p->next;
}
}
void sort()
{
s truct list *head,*p,*q;
i nt j,ye,mon;
s truct book boo;
F ILE *fp2;
head=(struct list *)malloc(sizeof(struct list));
q=head;
p rintf("请输入要查询的日期\n");
p rintf("年度: ");
s canf("%d",&ye);
p rintf("月份: ");
s canf("%d",&mon);
f p2=fopen(fname2,"rb");
f or(j=0; j<M; j++)
{
fread(&boo,length2,1,fp2);
p=(struct list *)malloc(sizeof(struct list));
p->bnum=boo.bnum;
strcpy(p->bname,boo.bname);
p->num=amount[p->bnum][ye-1900][mon];
p->time=times[p->bnum][ye-1900][mon];
q->next=p;
q=p;
}
q->next=NULL;
q=head;
h ead=head->next;
f ree(q);
f close(fp2);
p=head;
for(j=0; j<M; j++)
{
printf("%10d号书的本月进货量为%6d本,本月出借次数为%6d次\n",p->bnum,p->num,p->time);
p=p->next;
}
s ortnum(head);
sorttime(head);
}
/*searchme的功能是对超期未还书报警*/
void searchme()
{
struct relation rela;
int j,sum=0,days,gq=0;
char stunum[10];
FILE *fp;
struct tm *star;
time_t t1;
getchar();
printf("请输入您的学号: ");
gets(stunum);
fp=fopen(fname3,"rb"); /*以只读方式打开二进制借还关系文件*/
t1=time(NULL);
star=localtime(&t1);
for(j=0; j<L; j++)
{
fread(&rela,length3,1,fp); /*依次读入每个借还关系的信息*/
if(strcmp(rela.stunum,stunum)==0) /*两学号相同*/
{
sum++;
if(star->tm_year+1900==rela.date.year)
days=star->tm_yday-rela.date.yd;
else if((star->tm_year+1900==rela.date.year+1)&&(star->tm_mon+1==1)) days=star->tm_mday+31-rela.date.day;
else
days=32;
if(days>=0&&days<=30)
printf("您借阅了%10d号书,借期还有%6d天\n",rela.bnum,30-days);
else
{
printf("您借阅的%10d号书已过期,请尽快返还,谢谢合作!\n",rela.bnum);
gq++;
}
}
}
printf("目前您总共借阅了%6d本书,其中%6d本过期\n",sum,gq);
fclose(fp); /*关闭文件*/
}
/*search的功能是查询某类图书借还情况*/
void search()
{
struct relation rela;
struct book boo;
FILE *fp2,*fp3;
int j,boonum;
getchar();
printf("请输入要查询的书的索书号(整型不超过2000): ");
scanf("%d",&boonum);
fp2=fopen(fname2,"rb"); /*以只读方式打开二进制书籍档案文件*/
for(j=0;j<M;j++)
{
fread(&boo,length2,1,fp2);
if(boo.bnum==boonum)
printf("该书目前的出借量为%6d,库存量为%6d\n",boo.outnum,boo.innum);
}
fclose(fp2);
fp3=fopen(fname3,"rb"); /*以只读方式打开二进制借还关系文件*/
for(j=0;j<L;j++)
{
fread(&rela,length3,1,fp3); /*依次读入每个借还关系*/
if(rela.bnum==boonum) /*若两索书号相同*/
printf("%10s号学生借阅了这本书,借出日期%6d年%6d月%6d号\n", rela.stunum,rela.date.year,rela.date.month,rela.date.day);
}
fclose(fp3); /*关闭文件*/
return;
}
/*主函数,调用各功能函数,实现题目中的各种要求*/
void main()
{
i nt choice;
p rintf("请建立学生人事文件\n");
buildfile1(); /*建立并输出学生人事文件*/
print1();
p rintf("请建立书籍档案文件\n");
buildfile2();
p rint2(); /*建立并输出书*/
p rintf("请建立借还关系文件\n");
buildfile3(); /*建立并输出借还关系文件*/
print3();
p rintf("\n");
printf("欢迎使用图书馆管理系统!\n");
d o
{
printf("0---退出\n1----借书\n2---还书\n3---统计某天各种类型书进货量\n");
printf("4---对各类书某月进货量、出借量进行排序\n");
printf("5---查询本人书籍借阅情况\n6---查询某类图书借还情况\n");
printf("请输入您要进行的操作:");。