基于C语言的图书管理信息系统的设计与实现

图书管理信息系统的设计与实现

#include<stdio.h>
#include<string.h>

#define BookSize 100
#define BLHum 50
#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[BLHum];
	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;
	char date1[9];
	char date2[9];
}BbookRecType;
typedef struct {
	BbookRecType Bbook[BookSize];
	int len;
}BbookFile;


/*追加一条图书记录建立相关文件*/
BookDbaseFile AppeDBaseRec(BookDbaseFile df)
{
	int i;
	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;
	return df;
}

/*修改书号索引表的设计*/
BnoIdxFile ChangeBnoIdxF(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 ChangeLinkHeadF1(BookDbaseFile *df, LHFile1 lhf1)
{
	int i, j, k, m;
	char sm[21];
	i = df->len;
	strcpy(sm , df->BookDbase[i].bname);
	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;
		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 ChangeLinkHeadF2(BookDbaseFile *df, LHFile2 lhf2)
{
	int i, j, k, m;
	char zz[9];
	i = df->len;
	strcpy(zz, df->BookDbase[i].author);
	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 = 1;
		strcpy(lhf2.LHFrec2[m].author, zz);
	}
	return lhf2;
}


/*修改出版社的索引以及出版社链头索引表的设计*/
LHFile3 ChangeLinkHeadF3(BookDbaseFile *df, LHFile3 lhf3)
{
	int i, j, k, m;
	char cbs[11];
	i = df->len;
	strcpy(cbs, df->BookDbase[i].press);
	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 = i;
		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[1].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 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("==============================================\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;
	while (choose >= 1 && choose <= 5)
	{
		printf("图书查询子系统\n");
		printf("------------------\n");
		printf("1.书 号		2.书 名\n");
		printf("3.作 者		4.出版社\n");
		printf("5.退 出	查 询");
		printf("------------------\n");
		printf("	请 用 户 选 择:");
		scanf("%d", &choose);
		switch (choose)
		{
		case 1:
			printf("输入学号:");
			scanf("%d", &sh);
			k = BinSearch(bif, sh);
			if (k == 0) {
				printf("没有要检查的图书,请检查是否输入有错\n");
				break;
			}
			ShowRec(df, k);
			break;

		case 2:
			printf("输入书名:");
			scanf("%", &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:
			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:
			printf("输入出版社:");
			scanf("%s", &cbs);
			k = BnameFind(f3,cbs);
			if (k == 0) {
				printf("没有要检查的图书,请检查是否输入有错\n");
				break;
			}
			for (i = k; i; i = df.BookDbase[i].prenext)
				ShowRec(df, k);
			break;

		case 5:
			return;
		}
	}
}


/*借还书处理算法*/
void BorrowBook(BookDbaseFile *bf, BnoIdxFile bif, BbookFile *bbf, ReadFile *rf)
{
	char jyrq[9];
	int sh, dzh;
	int i, j, k = 0;
	printf("输入读者号	书号	借阅日期\n");
	scanf("%d%d%s", &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("非法书号!");
			return;
	}
	if (bf->BookDbase[j].borrownum >= bf->BookDbase[j].storenum)
	{
		printf("图书已借出\n");
		return;
	}
	i = ++bbf->len;
	bbf->Bbook[i].rno = dzh;
	bbf->Bbook[i].bno = sh;
	strcpy(bbf->Bbook[i].date1, jyrq);
	rf->ReadRec[k].bn2++;
	bf->BookDbase[j].borrownum++;
	printf("借书成功!\n");
}

/*还书处理算法的设计*/
void BackBook(BookDbaseFile *bf,BnoIdxFile bif ,BbookFile *bbf, ReadFile *rf)
{
	char hsrq[8];
	int sh, dzh;
	int i, j, k = 0, m = 0;
	printf("读者号	书号	还书日期\n");
	scanf("%d%d%s", &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--;
	bf->BookDbase[j].borrownum--;
	strcpy(bbf->Bbook[m].date2, hsrq);
	printf("还书成功!\n");
}

/*读者管理子系统*/
ReadFile ReaderManage(ReadFile rf)
{
	int i;
	char yn = 'y';
	i = ++rf.len;
	while (yn == 'y' || yn == 'Y')
	{
		printf("输入读者号	读者名	可借图书数\n");
		scanf("%d %s", &rf.ReadRec[i].rno, rf.ReadRec[i].name);
		scanf("%d", &rf.ReadRec[i].bn1);
		rf.ReadRec[i].bn2 = 0;
		printf("继续输入吗?y/n:");
		getchar();
		scanf("%c",&yn);
	}
	rf.len=i-1;
	return rf;
}

/*写各类文件*/
void writefile(BookDbaseFile bf, BnoIdxFile bif, LHFile1 f1, LHFile2 f2, LHFile3 f3, ReadFile rf, BbookFile bbf)
{
	FILE *fp;
	int i;
	//图书主文件 
	fp = fopen("book", "wb");
	for (i = 1; i <= bf.len; i++)
		fwrite(&bf.BookDbase[i],sizeof(BookRecType), 1, fp);
	fclose(fp);
	//图书索引文件 
	fp = fopen("bidx", "wb");
	for (i = 1; i <= bif.len; i++)
		fwrite(&bif.BnoIdx[i], sizeof(BidxRecType), 1, fp);
	fclose(fp);
	//书名索引链头文件 
	fp = fopen("nidx", "wb");
	for (i = 1; i <= f1.len1; i++)
		fwrite(&f1.LHFrecl[i], sizeof(BNRecType), 1, fp);
	fclose(fp);
	//作者索引链头文件
	fp = fopen("aidx", "wb");
	for (i = 1; i <= f2.len2; i++)
		fwrite(&f2.LHFrec2[i], sizeof(BARecType), 1, fp);
	fclose(fp);
	//出版社索引链头文件
	fp = fopen("pidx", "wb");
	for (i = 1; i <= f3.len3; i++)
		fwrite(&f3.LHFrec3[i], sizeof(BPRecType), 1, fp);
	fclose(fp);
	//读者文件
	fp = fopen("read", "wb");
	for (i = 1; i <= rf.len; i++)
		fwrite(&rf.ReadRec[i], sizeof(RRecType), 1, fp);
	fclose(fp);
	//借还书文件
	fp = fopen("bbff", "wb");
	for (i = 1; i <= bbf.len; i++)
		fwrite(&bbf.Bbook[i], sizeof(BbookRecType), 1, fp);
	fclose(fp);
}


/*读各类文件*/
void readfile(BookDbaseFile *bf, BnoIdxFile *bif, LHFile1 *f1, LHFile2 *f2, LHFile3 *f3, ReadFile *rf, BbookFile *bbf)
{
	FILE *fp;
	int i;
	//读图书主文件
	fp = fopen("book", "rb");
	i = 1;
	while (!feof(fp))
	{
		fread(&bf->BookDbase[i], sizeof(BookRecType), 1, fp);
		i++;
		if (feof(fp))break;
	}
	bf->len = i - 2;
	fclose(fp);
	//读书好索引文件
	fp = fopen("bidx", "rb");
	i = 1;
	while (!feof(fp))
	{
		fread(&bif->BnoIdx[i], sizeof(BidxRecType), 1, fp);
		i++;
	}
	bif->len = i - 2;
	fclose(fp);
	//读书名索引文件
	fp = fopen("nidx", "rb");
	i = 1;
	while (!feof(fp))
	{
		fread(&f1->LHFrecl[i], sizeof(BNRecType), 1, fp);
		i++;
	}
	f1->len1 = i - 2;
	fclose(fp);
	//读作者索引文件
	fp = fopen("aidx", "rb");
	i = 1;
	while (!feof(fp))
	{
		fread(&f2->LHFrec2[i], sizeof(BARecType), 1, fp);
		i++;
	}
	f2->len2 = i - 2;
	fclose(fp);
	//读出版社索引链头文件
	fp = fopen("pidx", "rb");
	i = 1;
	while (!feof(fp))
	{
		fread(&f3->LHFrec3[i], sizeof(BPRecType), 1, fp);
		i++;
	}
	f3->len3 = i - 2;
	fclose(fp);
	//读读者文件
	fp = fopen("read", "rb");
	i = 1;
	while (!feof(fp))
	{
		fread(&rf->ReadRec[i], sizeof(RRecType), 1, fp);
		i++;
	}
	rf->len = i - 2;
	fclose(fp);
	//读借还书文件
	fp = fopen("bbff", "rb");
	i = 1;
	while (!feof(fp))
	{
		fread(&bbf->Bbook[i], sizeof(BbookRecType), 1, fp);
		i++;
	}
	bbf->len = i - 2;
	fclose(fp);
}

/*主控菜单*/
int main(void)
{
	int j, m, k = 1;
	char xz = 'n';
	BookDbaseFile bf;
	BnoIdxFile bif;
	LHFile1 f1;
	LHFile2 f2;
	LHFile3 f3;
	ReadFile rf;
	BbookFile bbf;
	while (k <= 5)
	{
		printf("图书管理系统\n");
		printf("============\n");
		printf(" 1.系统维护 \n");
		printf(" 2.读者管理 \n");
		printf(" 3.图书管理 \n");
		printf(" 4.图书流通 \n");
		printf(" 5.退出系统 \n");
		printf("============\n");
		printf(" 请选择1-5:");
		scanf("%d", &k);
		switch (k)
		{
			case 1:
				printf("系统维护\n");
				printf("--------\n");
				printf("1.初始化\n");
				printf("2. 读 盘\n");
				printf("--------\n");
				printf("请选择:\n");
				scanf("%d", &m);
				switch (m)
				{
				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);
					break;
				}
				break;

			case 2:
				ReaderManage(rf);
				break;

			case 3:
				printf("图书管理子系统\n");
				printf("--------------\n");
				printf("1.图书信息输入\n");
				printf("2.图书信息查询\n");
				printf("--------------\n");
				printf("  请 选 择 :");
				scanf("%d", &j);
				if (j == 1)
				{
					char yn = 'y';
					int k = 1;
					while (yn = 'y' || yn == 'Y')
					{
						bf = AppeDBaseRec(bf);
						bif = ChangeBnoIdxF(bf, bif);
						f1 = ChangeLinkHeadF1(&bf, f1);
						f2 = ChangeLinkHeadF2(&bf, f2);
						f3 = ChangeLinkHeadF3(&bf, f3);
						ShowRec(bf, k);
						k++;
						printf("继续输入吗?y/n:");
						getchar();
						scanf("%c", &yn);
					}
				}
				else
					SearchBook(bf, bif, f1, f2, f3);
				break;

			case 4:
					printf("图书流通子系统\n");
					printf("--------------\n");
					printf(" 1. 借书处理  \n");
					printf(" 2. 还书处理  \n");
					printf("--------------\n");
					printf("  请 选 择 :  \n");
					scanf("%d", &j);
					if (j == 1)
						BorrowBook(&bf, bif, &bbf, &rf);
					else if (j == 2)
						BackBook(&bf, bif, &bbf, &rf);
					break;

				case 5:
					printf("系统正在写盘,请稍后......\n");
					writefile(bf, bif, f1, f2, f3, rf, bbf);
					printf("再见!\n");
					return 0;
		}

	}
}
推荐大家一个小巧轻便的C语言编译工具

点击连接

  • 15
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值