⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 主程序.cpp

📁 图书管理小程序实现了图书读者的输入,图书的借还.文件读写.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -