图书管理系统

来源:互联网 发布:java中static什么意思 编辑:程序博客网 时间:2024/05/15 01:40
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BookSize 100
#define BLHnum 50
#define RRnum 50
typedef struct {//数据库记录类型
int bno;//书号
char bname[21];//书名
int namenext;//书名指针链
char author[9];//作者
int authnext;//作者指针链
char press[11];//出版社
int prenext;//出版社指针链
char sortno[4];//分类号
int storenum;//藏书量
int borrownum;//借出数
}BookRecType;
typedef struct {//定义图书数据库文件类型
BookRecType BookDbase[BookSize];
int len;//文件当前长度
}BookDbaseFile;
typedef struct {//索引文件记录类型
int bno;//书号
int RecNo;//记录指针
}BidxRecType;
typedef struct {//书号索引文件类型
BidxRecType BnoIdx[BookSize];
int len;//当前记录个数
}BnoIdxFile;
typedef struct {//书名链头文件记录类型
char bname[21];//书名
int lhead;//链头指针
int RecNum;//长度
}BNRecType;
typedef struct {//书名链头文件类型
BNRecType LHFrecl[BLHnum];
int len1;//链头文件当前长度
}LHFile1;
typedef struct {//作者链头文件记录类型
char author[9];//作者
int lhead;//链头指针
int RecNum;//长度
}BARecType;
typedef struct {//作者链头文件类型
BARecType LHFrec2[BLHnum];
int len2;
}LHFile2;
typedef struct {//出版社链头文件记录类型
char press[11];//出版社
int lhead;//链头指针
int RecNum;//长度
}BPRecType;
typedef struct {//出版社链头文件类型
BPRecType LHFrec3[BLHnum];
int len3;
}LHFile3;
typedef struct {
int rno;//读者号
char name[8];//读者名
int bn1;//可借书数
int bn2;//已借书数
}RRecType;
typedef struct {
RRecType ReadRec[RRnum];
int len;//当前读者数
}ReadFile;
typedef struct {//借还书文件记录类型
int rno;//读者号
int bno;//书号
int date1;//借书日期
int date2;//还书日期
}BbookRecType;
typedef struct {//借还书文件类型
BbookRecType Bbook[BookSize];
int len;//当前借书数
}BbookFile;


BookDbaseFile add(BookDbaseFile df);//输入一条图书记录
BnoIdxFile changeBI(BookDbaseFile df,BnoIdxFile bif);//书号索引文件修改
LHFile1 changeLHF1(BookDbaseFile *df,LHFile1 lhf1);//书名关键字索引的修改
LHFile2 changeLHF2(BookDbaseFile *df,LHFile2 lhf2);//作者关键字索引的修改
LHFile3 changeLHF3(BookDbaseFile *df,LHFile3 lhf3);//出版社关键字索引的修改
int Binsearch(BnoIdxFile bif,int key);//书号查询
int BnameFind(LHFile1 lhf1,char key[]);//书名查询
int BauthFind(LHFile2 lhf2,char key[]);//作者查询
int BpresFind(LHFile3 lhf3,char key[]);//出版社查询
void showrec(BookDbaseFile df,int i);//输出一条记录
void searchBook(BookDbaseFile df,BnoIdxFile bif,LHFile1 f1,LHFile2 f2,LHFile3 f3);//图书查找的控制程序
void BorrowBook(BookDbaseFile *df,BnoIdxFile bif,BbookFile *bbf,ReadFile *rf);//借书处理
void BackBook(BookDbaseFile *df,BnoIdxFile bif,BbookFile *bbf,ReadFile *rf);//还书处理
ReadFile ReaderManager(ReadFile rf);//读者管理
void writefile(BookDbaseFile df,BnoIdxFile bif,LHFile1 f1,LHFile2 f2,LHFile3 f3,ReadFile rf,BbookFile bbf);//写入文件操作
void readfile(BookDbaseFile *df,BnoIdxFile *bif,LHFile1 *f1,LHFile2 *f2,LHFile3 *f3,ReadFile *rf,BbookFile *bbf);//写出文件操作


void main(){
BookDbaseFile bf;
BnoIdxFile bif;
LHFile1 f1;LHFile2 f2;LHFile3 f3;
ReadFile rf; 
BbookFile bbf;
int i=0;
int j=0;
char xz = 'n';
int k = 0;
int n=0;
int m = 1;
char yn = 'y';
for(;;){
system("cls");
printf("1.系统维护\n");
printf("2.图书管理子系统\n");
printf("3.读者管理子系统\n");
printf("4.图书流通子系统\n");
printf("0.退出系统\n");
printf("请输入你的选择:");
scanf("%d",&i);
switch(i){
case 1:
for(;;){
system("cls");
fflush(stdin);
printf("1.初始化\n");
printf("2.读盘\n");
printf("0.返回\n");
printf("请输入你的选择:");
scanf("%d",&j);
switch(j){
case 1:
printf("初始化只能做一次,需谨慎!初始化吗?y/n:");
getchar();
scanf("%c",&xz);
if(xz == 'y' || xz == 'Y'){
bf.len = bif.len = f1.len1 = f2.len2 =  0;
f3.len3 = rf.len = bbf.len = 0;
}
break;
case 2:
readfile(&bf,&bif,&f1,&f2,&f3,&rf,&bbf);
printf("读盘完毕!\n");
break;
case 0:
break;
default:
printf("选择错误,请重选");
break;
}
if(j==0)
break;
}
break;
case 2:
for(;;){
system("cls");
printf("1.图书信息输入\n");
printf("2.图书信息查询\n");
printf("0.返回\n");
printf("请输入你的选择:");
scanf("%d",&k);
switch(k){
case 1:
yn ='y';
while(yn == 'y'||yn == 'Y'){
bf = add(bf);//输入记录
bif= changeBI(bf,bif);//修改书号索引文件
f1 = changeLHF1(&bf,f1);//修改书名索引文件
f2 = changeLHF2(&bf,f2);//修改作者索引文件
f3 = changeLHF3(&bf,f3);//修改出版社索引文件
showrec(bf,m);
m++;
printf("继续输入吗?y/n:");
getchar();
scanf("%c",&yn);
printf("%d",bf.len);
system("pause");
}
break;
case 2:
searchBook(bf,bif,f1,f2,f3);
break;
case 0:
break;
default:
printf("选择错误,请重选");
break;
}
if(k==0)
break;
}
break;
case 3:
rf = ReaderManager(rf);
break;
case 4:
for(;;){
system("cls");
fflush(stdin);
printf("1.借书处理\n");
printf("2.还书处理\n");
printf("3.逾期处理\n");
printf("0.返回\n");
printf("请输入你的选择:");
scanf("%d",&n);
switch(n){
case 1:
printf("%d\n",rf.len);
BorrowBook(&bf,bif,&bbf,&rf);
system("pause");
break;
case 2:
printf("%d\n",rf.len);
BackBook(&bf,bif,&bbf,&rf);
system("pause");
break;
case 3:
for(i =1;i<=bbf.len;i++){
if((bbf.Bbook[i].date1-bbf.Bbook[i].date2)>100){//以一个月为界限
printf("该书还书时间逾期,请交罚款!\n");
printf("作者号为%d,书号为%d\n",bbf.Bbook[i].rno,bbf.Bbook[i].bno);
}
}
system("pause");
break;
case 0:
break;
default:
printf("选择错误,请重选");
break;
}
if(n==0)
break;
}
break;
case 0:
printf("系统正在写盘,稍等...\n");
writefile(bf,bif,f1,f2,f3,rf,bbf);
printf("再见!\n");
exit(0);
default:
printf("选择错误,请重选");
break;
}
system("pause");
}
}
BookDbaseFile add(BookDbaseFile df){
int i;
i =++df.len;//图书主数据库长度加1
printf("书号 书名 作者名 出版社 分类 藏书量\n");
scanf("%d%s",&df.BookDbase[i].bno,df.BookDbase[i].bname);
scanf("%s%s",df.BookDbase[i].author,df.BookDbase[i].press);
scanf("%s%d",df.BookDbase[i].sortno,&df.BookDbase[i].storenum);
df.BookDbase[i].borrownum=0;//借出数量为0
return df;
}
BnoIdxFile changeBI(BookDbaseFile df,BnoIdxFile bif){
int i,j,k = 1;
i = df.len;
j = bif.len;//图书主文件的当前长度,也就是要处理的当前记录号
while(j >=1 ){//查找插入位置
if(df.BookDbase[i].bno>bif.BnoIdx[j].bno){
k = j+1;
break;
}
j--;
}
if(bif.len>0)//有序表的插入
for(j = bif.len;j>=k;j--)
bif.BnoIdx[j+1] = bif.BnoIdx[j];//记录后移
bif.BnoIdx[k].bno = df.BookDbase[i].bno;
bif.BnoIdx[k].RecNo = i;
bif.len++;
return bif;
}
LHFile1 changeLHF1(BookDbaseFile *df,LHFile1 lhf1){
int i,j,k,m;
char sm[21];
i = df->len;//图书主文件的当前长度,也就是要处理的当前记录号
strcpy(sm,df->BookDbase[i].bname);//取记录中书名送至变量sm中
j = 1; k = 0;
while(j<=lhf1.len1){
if(strcmp(sm,lhf1.LHFrecl[j].bname) == 0){
k = j;
break;
}
j++;
}
if(k!=0){
df->BookDbase[i].namenext = lhf1.LHFrecl[k].lhead;
lhf1.LHFrecl[k].lhead = i;//i为主文件的当前记录号
lhf1.LHFrecl[k].RecNum++;
}
else{
m = ++lhf1.len1;
df->BookDbase[i].namenext = 0;
lhf1.LHFrecl[m].lhead = i;
lhf1.LHFrecl[m].RecNum = 1;
strcpy(lhf1.LHFrecl[m].bname,sm);
}
return lhf1;
}
LHFile2 changeLHF2(BookDbaseFile *df,LHFile2 lhf2){
int i,j,k,m;
char zz[9];
i = df->len;//图书主文件的当前长度,也就是要处理的当前记录号
strcpy(zz,df->BookDbase[i].author);//取记录中书名送至变量zz中
j = 1; k = 0;
while(j<=lhf2.len2){
if(strcmp(zz,lhf2.LHFrec2[j].author) == 0){
k = j;
break;
}
j++;
}
if(k!=0){
df->BookDbase[i].authnext = lhf2.LHFrec2[k].lhead;
lhf2.LHFrec2[k].lhead = i;
lhf2.LHFrec2[k].RecNum++;
}
else{
m = ++lhf2.len2;
df->BookDbase[i].authnext = 0;
lhf2.LHFrec2[m].lhead = i;
lhf2.LHFrec2[m].RecNum = 1;
strcpy(lhf2.LHFrec2[m].author,zz);
}
return lhf2;
}
LHFile3 changeLHF3(BookDbaseFile *df,LHFile3 lhf3){
int i,j,k,m;
char cbs[11];
i = df->len;i = df->len;//图书主文件的当前长度,也就是要处理的当前记录号
strcpy(cbs,df->BookDbase[i].press);//取记录中书名送至变量cbs中
j = 1; k = 0;
while(j<=lhf3.len3){
if(strcmp(cbs,lhf3.LHFrec3[j].press) == 0){
k = j;
break;
}
j++;
}
if(k!=0){
df->BookDbase[i].prenext = lhf3.LHFrec3[k].lhead;
lhf3.LHFrec3[k].lhead = i;
lhf3.LHFrec3[k].RecNum++;
}
else{
m = ++lhf3.len3;
df->BookDbase[i].prenext = 0;
lhf3.LHFrec3[m].lhead = i;
lhf3.LHFrec3[m].RecNum = 1;
strcpy(lhf3.LHFrec3[m].press,cbs);
}
return lhf3;
}
int Binsearch(BnoIdxFile bif,int key){
int low,high,mid;
low = 1;
high = bif.len;
while(low<=high){
mid = (low + high)/2;
if(key == bif.BnoIdx[mid].bno)
return bif.BnoIdx[mid].RecNo;
else if(key<bif.BnoIdx[mid].bno)
high = mid -1;
else
low = mid + 1;
}
return 0;
}
int BnameFind(LHFile1 lhf1,char key[]){
int i,k = 0;
for(i=1;i<=lhf1.len1;i++){
if(strcmp(key,lhf1.LHFrecl[i].bname) == 0){
k = lhf1.LHFrecl[i].lhead;
break;
}
}
return k;
}
int BauthFind(LHFile2 lhf2,char key[]){
int i,k = 0;
for(i=1;i<=lhf2.len2;i++){
if(strcmp(key,lhf2.LHFrec2[i].author) == 0){
k = lhf2.LHFrec2[i].lhead;
break;
}
}
return k;
}
int BpresFind(LHFile3 lhf3,char key[]){
int i,k = 0;
for(i=1;i<=lhf3.len3;i++){
if(strcmp(key,lhf3.LHFrec3[i].press) == 0){
k = lhf3.LHFrec3[i].lhead;
break;
}
}
return k;
}
void showrec(BookDbaseFile df,int i){
printf("书号 书名 作者名 出版社 分类号 可借数\n");
printf("==============================================\n");
printf("%d%12s",df.BookDbase[i].bno,df.BookDbase[i].bname);
printf("%8s%12s",df.BookDbase[i].author,df.BookDbase[i].press);
printf("%6s",df.BookDbase[i].sortno);
printf("%4d\n",df.BookDbase[i].storenum-df.BookDbase[i].borrownum);
printf("==============================================\n");
}
void searchBook(BookDbaseFile df,BnoIdxFile bif,LHFile1 f1,LHFile2 f2,LHFile3 f3){
char sm[21],zz[9],cbs[11];
int i,k,choose = 1;
int sh;
for(;;){
fflush(stdin);
printf("图书查询子系统\n");
printf("-----------------\n");
printf("1.书号 2.书名\n");
printf("3.作者 4.出版社\n");
printf("0.返回\n");
printf("-----------------\n");
printf("请选择:");
scanf("%d",&choose);
switch(choose){
case 1:
fflush(stdin);
printf("输入书号:");
scanf("%d",&sh);
k = Binsearch(bif,sh);
if(k == 0){
printf("没有要查找的图书,请检查你的输入\n");
break;
}
showrec(df,k);
break;
case 2:
fflush(stdin);
printf("输入书名:");
scanf("%s",sm);
k = BnameFind(f1,sm);
if(k == 0){
printf("没有要查找的图书,请检查你的输入\n");
break;
}
for(i=k;i;i=df.BookDbase[i].namenext)
showrec(df,i);
break;
case 3:

fflush(stdin);
printf("输入作者名:");
scanf("%s",zz);
k = BauthFind(f2,zz);
if(k == 0){
printf("没有要查找的图书,请检查你的输入\n");
break;
}
for(i=k;i;i=df.BookDbase[i].authnext)
showrec(df,i);
break;
case 4:
fflush(stdin);
printf("输入出版社:");
scanf("%s",cbs);
k = BpresFind(f3,cbs);
if(k == 0){
printf("没有要查找的图书,请检查你的输入\n");
break;
}
for(i=k;i;i=df.BookDbase[i].prenext)
showrec(df,i);
break;
case 0:
break;
default:
printf("选择错误,请重选");
break;
}
if(choose == 0)
break;
}
}
void BorrowBook(BookDbaseFile *df,BnoIdxFile bif,BbookFile *bbf,ReadFile *rf){
int jyrq;
int sh,dzh;
int i,j,k=0;
fflush(stdin);
printf("输入读者号 书号 借阅日期(例如20120305)\n");
scanf("%d%d%d",&dzh,&sh,&jyrq);
for(i=1;i<=rf->len;i++)
if(dzh == rf->ReadRec[i].rno){
k = i;
break;
}
if(k==0){
printf("非法读者:\n");
return;
}
if(rf->ReadRec[k].bn2>=rf->ReadRec[k].bn1){
printf("书已借满!\n");
return;
}
j=Binsearch(bif,sh);
if(j==0){
printf("非法书号!\n");
return;
}
i = ++bbf->len;
bbf->Bbook[i].rno = dzh;
bbf->Bbook[i].bno = sh;
bbf->Bbook[i].date1=jyrq;
rf->ReadRec[k].bn2++;
df->BookDbase[j].borrownum++;
printf("借书成功!\n");
}
void BackBook(BookDbaseFile *df,BnoIdxFile bif,BbookFile *bbf,ReadFile *rf){
int hsrq;
int sh,dzh;
int i,j,k=0,m=0;
fflush(stdin);
printf("输入读者号 书号 还书日期(例如20120305)\n");
scanf("%d%d%d",&dzh,&sh,&hsrq);
for(i=1;i<=rf->len;i++)
if(dzh == rf->ReadRec[i].rno){
k = i;
break;
}
if(k==0){
printf("非法读者:\n");
return ;
}
for(i=1;i<=bbf->len;i++)
if(sh==bbf->Bbook[i].bno){
m = i;
break;
}
if(m==0){
printf("非法书号!\n");
return ;
}
j=Binsearch(bif,sh);
if(j==0){
printf("非法书号!\n");
return ;
}
rf->ReadRec[k].bn2--;
df->BookDbase[j].borrownum--;
bbf->Bbook[m].date2=hsrq;
printf("还书成功!\n");
}
ReadFile ReaderManager(ReadFile rf){
int i;
char yn = 'y';
i = ++rf.len;
while(yn == 'y'|| yn == 'Y'){
printf("输入读者号 读者名 可借图书数\n");
scanf("%d",&rf.ReadRec[i].rno);
scanf("%s",rf.ReadRec[i].name);
scanf("%d",&rf.ReadRec[i].bn1);
rf.ReadRec[i].bn2 = 0;
printf("继续输入吗?y/n:");
getchar();
scanf("%c",&yn);
i++;
}
rf.len = i - 1;
return rf;
}
void writefile(BookDbaseFile df,BnoIdxFile bif,LHFile1 f1,LHFile2 f2,LHFile3 f3,ReadFile rf,BbookFile bbf){
FILE *fp;
int i;
fp = fopen("book.txt","wb");
for(i=1;i<=df.len;i++)
fwrite(&df.BookDbase[i],sizeof(BookRecType),1,fp);
fclose(fp);


fp = fopen("bidx.txt","wb");
for(i=1;i<=df.len;i++)
fwrite(&bif.BnoIdx[i],sizeof(BidxRecType),1,fp);
fclose(fp);


fp = fopen("nidx.txt","wb");
for(i=1;i<=f1.len1;i++)
fwrite(&f1.LHFrecl[i],sizeof(BNRecType),1,fp);
fclose(fp);


fp = fopen("aidx.txt","wb");
for(i=1;i<=f2.len2;i++)
fwrite(&f2.LHFrec2[i],sizeof(BARecType),1,fp);
fclose(fp);


fp = fopen("pidx.txt","wb");
for(i=1;i<=f3.len3;i++)
fwrite(&f3.LHFrec3[i],sizeof(BPRecType),1,fp);
fclose(fp);


fp = fopen("read.txt","wb");
for(i=1;i<=rf.len;i++)
fwrite(&rf.ReadRec[i],sizeof(RRecType),1,fp);
fclose(fp);


fp = fopen("bbff.txt","wb");
for(i=1;i<=bbf.len;i++)
fwrite(&bbf.Bbook[i],sizeof(BbookRecType),1,fp);
fclose(fp);
}
void readfile(BookDbaseFile *df,BnoIdxFile *bif,LHFile1 *f1,LHFile2 *f2,LHFile3 *f3,ReadFile *rf,BbookFile *bbf){
FILE *fp;
int i;


fp = fopen("book.txt","rb");
i = 1;


while(1){
fread(&df->BookDbase[i],sizeof(BookRecType),1,fp);
i++;
if(feof(fp))
break;
}
df->len = i-2;
fclose(fp);


fp = fopen("bids.txt","rb");
i = 1;
while(1){
fread(&bif->BnoIdx[i],sizeof(BidxRecType),1,fp);
i++;
if(feof(fp))
break;
}
bif->len = i-2;
fclose(fp);


fp = fopen("nidx.txt","rb");
i = 1;
while(1){
fread(&f1->LHFrecl[i],sizeof(BNRecType),1,fp);
i++;
if(feof(fp))
break;
}
f1->len1 = i-2;
fclose(fp);


fp = fopen("aidx.txt","rb");
i = 1;
while(1){
fread(&f2->LHFrec2[i],sizeof(BARecType),1,fp);
i++;
if(feof(fp))
break;
}
f2->len2 = i-2;
fclose(fp);


fp = fopen("pidx.txt","rb");
i = 1;
while(1){
fread(&f3->LHFrec3[i],sizeof(BPRecType),1,fp);
i++;
if(feof(fp))
break;
}
f3->len3 = i-2;
fclose(fp);


fp = fopen("read.txt","rb");
i = 1;
while(1){
fread(&rf->ReadRec[i],sizeof(RRecType),1,fp);
i++;
if(feof(fp))
break;
}
rf->len = i-2;
fclose(fp);


fp = fopen("bbff.txt","rb");
i = 1;
while(1){
fread(&bbf->Bbook[i],sizeof(BbookRecType),1,fp);
i++;
if(feof(fp))
break;
}
bbf->len = i-2;
fclose(fp);

}

这个代码为什么会在使用读盘功能的时候出错呢????

原创粉丝点击