📄 主程序.cpp
字号:
#define BookSize 100 //最大图书数
#define BLHnum 50 //索引表链头文件中的记录数
#define RRnum 50 //读者的最大可能数
#include<stdio.h>
#include<string.h>
#include "file.cpp"
//(1)主数据库文件
typedef struct{
char bno[15]; //书号
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; //定义图书数据库文件类型
//(2)书号索引文件
typedef struct{
char bno[15]; //书号
int RecNo; //记录指针
}BidxRecType; //索引文件记录类型
typedef struct{
BidxRecType BnoIdx[BookSize];
int len; //当前记录个数
}BnoIdxFile; //书号索引文件类型
//(3)书名链头索引文件
typedef struct{
char bname[21]; //书名
int lhead; //链头指针
int RecNum; //长度
}BNRecType; //书名链头文件记录类型
typedef struct{
BNRecType LHFrec1[BLHnum];
int len1; //链头文件当前长度
}LHFile1; //书名链头文件类型
//(4)作者链头索引文件
typedef struct{
char author[9]; //作者
int lhead; //链头指针
int RecNum; //长度
}BARecType; //作者链头文件记录类型
typedef struct{
BARecType LHFrec2[BLHnum];
int len2;
}LHFile2; //作者链头文件类型
//(5)出版社链头索引文件
typedef struct{
char press[11]; //出版社
int lhead; //链头指针
int RecNum; //长度
}BPRecType; //出版社链头文件记录类型
typedef struct{
BPRecType LHFrec3[BLHnum];
int len3;
}LHFile3; //出版社链头文件类型
//(6)读者文件
typedef struct{
char rno[5]; //读者号
char name[8]; //读者名
int bn1; //可借书数
int bn2; //已借书数
}RRecType; //读者文件记录类型
typedef struct{
RRecType ReadRec[RRnum];
int len; //当前读者数
}ReadFile; //读者文件类型
//(7)借还书文件
typedef struct{
char rno[5]; //读者号
char bno[15]; //书号
char date1[9]; //借书日期
char date2[9]; //还书日期
}BbookRecType; //借还书文件记录类型
typedef struct{
BbookRecType Bbook[BookSize];
int len; //当前借书数
}BbookFile; //借还书文件类型
/*begin for createfile.c*/
//增加一条图书主数据库记录
void AppeDBaseRec(BookDbaseFile &df)
{
int i;
i=++df.len; //图书数据库长度加1
printf("书号 书名 作者名 出版社 分类 藏书量\n");
scanf("\n%s", df.BookDbase[i].bno);
scanf ("\n%s" , df.BookDbase[i].bname);
scanf("\n%s",df.BookDbase[i].author);
scanf ("\n%s" , df.BookDbase[i].press);
scanf("\n%s",df.BookDbase[i].sortno);
scanf ("\n%d" , &df.BookDbase[i].storenum);
df.BookDbase[i].borrownum=0;
}
//修改书号索引表
void ChangeBnoIdxF(BookDbaseFile &df,BnoIdxFile &bif){
int i,j,k;
char sh[5];
i=df.len;
strcpy(sh,df.BookDbase[i].bno); //取记录中书号送至变量sh中
j=bif.len; k=1;
while(j>=1){
if(strcmp(sh,bif.BnoIdx[j].bno)>0){
k=j+1;
break;
}
j--;
}
if(bif.len>0) //有序表的插入
for(j=bif.len;j>=k;j--)
bif.BnoIdx[j+1]=bif.BnoIdx[j];
strcpy(bif.BnoIdx[k].bno,sh);
bif.BnoIdx[k].RecNo=i;
bif.len++;
}
//修改书号名索引以及书名链头索引表
void ChangeLinkHeadF1(BookDbaseFile &df, LHFile1 &lhf1){
int i,j,k,m;
char sm[20];
i=df.len; //处理当前记录号
strcpy(sm,df.BookDbase[i].bname);
j=1;
k=0;
while(j<=lhf1.len1){
if(strcmp(sm,lhf1.LHFrec1[j].bname)==0){
k=j;
break;
}
j++;
}
if(k!=0){
df.BookDbase[i].namenext=lhf1.LHFrec1[k].lhead;
lhf1.LHFrec1[k].lhead=i;
lhf1.LHFrec1[k].RecNum++;
}
else{
m=++lhf1.len1;
df.BookDbase[i].namenext=0; //建立链表,指针置空
lhf1.LHFrec1[m].lhead=i;
lhf1.LHFrec1[m].RecNum=1;
strcpy(lhf1.LHFrec1[m].bname,sm);
}
}
//修改作者索引以及作者链头索引表
void ChangeLinkHeadF2(BookDbaseFile &df,LHFile2 &lhf2){
int i,j,k,m;
char zz[8]; //ZZ为作者
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; //i为主文件的当前记录号(假定为指针)
lhf2.LHFrec2[k].RecNum++;
}
else{
m=++lhf2.len2; //索引关键字个数加1
df.BookDbase[i].authnext=0; //用头插法建立链表,指针置空
lhf2.LHFrec2[m].lhead=i; //i为主文件的当前记录号(假定为指针)
lhf2.LHFrec2[m].RecNum=1; //计数器置1
strcpy(lhf2.LHFrec2[m].author,zz);
}
}
//修改出版社索引以及出版社链头索引表
void ChangeLinkHeadF3(BookDbaseFile &df,LHFile3 &lhf3){
int i,j,k,m;
char cbs[10];
i=df.len; //图书主文件的当前长度
strcpy(cbs,df.BookDbase[i].press); //取记录中书名送至变量sm中
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; //索引关键字个数加1
df.BookDbase[i].prenext=0; //用头插法建立链表,指针置空
lhf3.LHFrec3[m].lhead=i; //i为主文件的当前记录号(假定为指针)
lhf3.LHFrec3[m].RecNum=1; //计数器置1
strcpy(lhf3.LHFrec3[m].press,cbs);
}
}
//建立图书多重表主索引及相关索引链头文件
void CreateBook(BookDbaseFile &bf,BnoIdxFile &bif,LHFile1 &f1,LHFile2 &f2,LHFile3 &f3){
char yn='y';
while(yn=='y'|| yn=='Y'){
AppeDBaseRec(bf); //输入记录
ChangeBnoIdxF(bf,bif); //修改书名索引文件
ChangeLinkHeadF1(bf,f1);
ChangeLinkHeadF2(bf,f2);
ChangeLinkHeadF3(bf,f3);
printf("继续输入吗?(输入错误按输入n处理) y/n :\n");
scanf("\n%c",&yn);
}
}
/*end for createfile.c*/
/*search.c**/
int BinSearch(BnoIdxFile bif,char key[])
{
int low,high,mid;
low=1;
high=bif.len;
while(low<=high){
mid=(low+high)/2;
if(strcmp(key,bif.BnoIdx[mid].bno)==0)
return bif.BnoIdx[mid].RecNo;
else if(strcmp(key,bif.BnoIdx[mid].bno)<0)
high=mid-1;
else low=mid+1;
}
return 0;
}//BinSearch
//按书名查询算法
int BnameFind(LHFile1 lhf1,char key[]){
int i,k=0;
for(i=1;i<=lhf1.len1;i++){
if(strcmp(key,lhf1.LHFrec1[i].bname)==0){
k=lhf1.LHFrec1[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 BnameFind(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 ("书号: %s\n" , df.BookDbase[i].bno);
printf ("书名: %s\n" , df.BookDbase[i].bname);
printf ("作者名: %s\n" , df.BookDbase[i].author);
printf ("出版社: %s\n" , df.BookDbase[i].press);
printf ("分类号: %s\n" , df.BookDbase[i].sortno);
printf("==========================================\n");
}
//图书查询控制程序
void SearchBook(BookDbaseFile df,BnoIdxFile bif,LHFile1 f1,LHFile2 f2,LHFile3 f3){
char sh[4],sm[20],zz[8],cbs[10];
int i,k,choose=1;
while(choose>=1 && choose<=5){
printf("图书查询子系统\n");
printf("---------------------\n");
printf("1.书号(3) 2.书名 3.作者 4.出版社 5.退出\n");
printf("---------------------\n");
printf("请选择:\n");
scanf ("\n%d" , &choose);
switch(choose){
case 1:
printf("输入书号:\n");
scanf("%s",sh);
k=BinSearch(bif,sh);
if(k==0){
printf("没有该书,请检查是否输入有错\n");
break;
}
ShowRec(df,k); //输出查找的图书记录
break;
case 2:
printf("输入书名:\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -