图书信息管理系统(c语言)

一、项目背景

图书馆管理系统,能够实现图书馆的常规业务,包括读者信息维护、图书信息维护和借书还书信息维护。

二、设计目的

  • 如何设计主菜单和子菜单,以及各级菜单的响应与返回操作
  • 如何合理设计不同的结构体对系统中多个实体进行封装
  • 如何合理设计多个结构体数组管理不同实体对应的数据
  • 如何对复杂的函数过程进行拆分,用多个子函数进行封装
  • 进一步熟悉文件读取相关操作

三、项目功能需求

1、图书方面的功能需求

  • 新增图书信息
  • 删除图书信息
  • 修改图书信息
  • 查找图书信息
  • 显示所有图书信息

2、读者方面的功能需求

  • 新增读者信息
  • 删除读者信息
  • 修改读者信息
  • 查找读者信息
  • 显示所有的读者信息
  • 借书登记
  • 还书登记

四、系统的功能结构图

在这里插入图片描述

五、功能模块介绍

1、图书管理模块

包括5个子模块,分别是新增图书信息模块、删除图书信息模块、修改图书信息模块、查找图书信息模块和显示图书信息模块

2、读者管理模块

包括5个子模块,分别是新增读者信息模块、删除读者信息模块、修改读者信息模块、查找读者信息模块和显示读者信息模块

3、借书还书登记模块

包括2个子模块,分别是借书登记模块和还书登记模块

六、详细设计

1、主函数

主函数首先调用ShowMainMenu函数绘制主界面,提供三个选项供用户选择,分别可以进入图书管理、读者管理、借还书登记三个子系统。

2、图书管理模块

功能设计

  • 图书管理子系统实现图书管理功能。
  • 输入选项1-5分别对应显示图书信息、增加图书信息、查找图书信息、删除图书信息和修改图书信息五大功能。
  • 输入0可以返回主菜单。

3、读者管理模块

功能设计

  • 读者管理子系统实现读者管理功能。
  • 输入选项1-5分别对应显示读者信息、增加读者信息、查找读者信息、删除读者信息和修改读者信息五大功能。
  • 输入0可以返回主菜单。

4、借还书登记模块

功能设计

  • 实现对读者借书以及还书的信息进行登记的功能。
  • 借书登记功能包括:输入读者编号,可以看到该读者的信息,输入要借的图书编号,满足条件,则可以实现借书操作。
  • 还书登记功能包括:输入读者编号,可以看到该读者的信息。输入图书编号,满足条件,则可以实现归还操作。

七、代码

#include <stdio.h>
#include <conio.h>     /*getch()函数使用的头文件*/
#include <windows.h>  /*Sleep()函数使用的头文件*/
#include <string.h>   /*strcmp()函数使用的头文件*/

#define LEN_BOOK sizeof(struct Book)
#define LEN_READER sizeof(struct Reader)
#define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount
#define READER_DATA astReader[i].iNum,astReader[i].acName,astReader[i].acSex,astReader[i].iAmount,astReader[i].iMax,astReader[i].aiBookId
#define BOOK_NUM 200
#define READER_NUM 100

int SearchBook();
int SearchReader();

/*图书结构体:图书编号,图书名,图书作者,出版社,库存量*/
struct Book
{
	int iNum;
	char acName[15];
	char acAuthor[15];
	char acPress[15];
	int iAmount;
};

/*读者:读者编号,读者姓名,性别,可借书数,读者已借书的编号*/
struct Reader
{
	int iNum;
	char acName[15];
	char acSex[4];
	int iMax;
	int iAmount;
	int aiBookId[10];
};

struct Book astBook[BOOK_NUM];
struct Reader astReader[READER_NUM];

void ShowMainMenu()
{
	system("cls");/*清屏函数*/
	printf("\n\n\n\n\n");
	printf("\t|----------------------欢迎进入---------------------------|\n");
	printf("\t|                   图书馆管理系统                        |\n");
	printf("\t|                       主菜单                            |\n");
	printf("\t|                   1、图书管理                           |\n");
	printf("\t|                   2、读者管理                           |\n");
	printf("\t|                   3、借/还书登记                        |\n");
	printf("\t|                   0、退出系统                           |\n");
	printf("\t|---------------------------------------------------------|\n");
	printf("\n");
	printf("\t\t请选择(0-3):");
}

void ShowBookMenu()
{
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t|----------------------欢迎进入---------------------------|\n");
	printf("\t|                    图书管理系统                         |\n");
	printf("\t|                       子菜单                            |\n");
	printf("\t|                  1、显示图书信息                        |\n");
	printf("\t|                  2、新增图书信息                        |\n");
	printf("\t|                  3、图书信息查询                        |\n");
	printf("\t|                  4、图书信息删除                        |\n");
	printf("\t|                  5、图书信息修改                        |\n");
	printf("\t|                  0、返回主菜单                          |\n");
	printf("\t|---------------------------------------------------------|\n");
	printf("\n");
	printf("\t\t请选择(0-5):");
}

void ShowReaderMenu()
{
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t|----------------------欢迎进入---------------------------|\n");
	printf("\t|                    读者管理系统                         |\n");
	printf("\t|                       子菜单                            |\n");
	printf("\t|                  1、显示读者信息                        |\n");
	printf("\t|                  2、新增读者信息                        |\n");
	printf("\t|                  3、读者信息查询                        |\n");
	printf("\t|                  4、读者信息删除                        |\n");
	printf("\t|                  5、读者信息修改                        |\n");
	printf("\t|                  0、返回主菜单                          |\n");
	printf("\t|---------------------------------------------------------|\n");
	printf("\n");
	printf("\t\t请选择(0-5):");
}

void ShowBorrowReturnMenu()
{
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t|----------------------欢迎进入---------------------------|\n");
	printf("\t|                    借/还书登记                          |\n");
	printf("\t|                       子菜单                            |\n");
	printf("\t|                    1、借书登记                          |\n");
	printf("\t|                    2、还书登记                          |\n");
	printf("\t|                   0、返回主菜单                         |\n");
	printf("\t|---------------------------------------------------------|\n");
	printf("\n");
	printf("\t\t请选择(0-2):");
}

void ShowModifyBookMenu()
{
	printf("\n");
	printf("\t|                  1、编号                        |\n");
	printf("\t|                  2、书名                        |\n");
	printf("\t|                  3、作者                        |\n");
	printf("\t|                  4、出版社                      |\n");
	printf("\t|                  5、库存                        |\n");
	printf("\n");
	printf("请输入所要修改的信息(键入相应的数字:1-5 ):");

}

void ShowModifyReaderMenu()
{
	printf("\n");
	printf("\t|                  1、编号                        |\n");
	printf("\t|                  2、名字                        |\n");
	printf("\t|                  3、性别                        |\n");
	printf("\t|                  4、最大可借书数                |\n");
	printf("\n");
	printf("请输入所要修改的信息(键入相应的数字:1-4 )\n");
}

/*分别读取图书和读者信息转存至astBook和astReader数组中*/
int ReadBookFile(char * pcMode)
{
	int iBookRecord = 0;
	FILE *pfBook;   /*文件指针*/

	pfBook = fopen("book.txt", pcMode);
	if (pfBook == NULL)
		return -1;
	while (!feof(pfBook))
	{
		if (fread(&astBook[iBookRecord], LEN_BOOK, 1, pfBook))
			iBookRecord ++;
	}
	fclose(pfBook);
	return iBookRecord;
}

int ReadReaderFile(char * pcMode)
{
	int iReaderRecord = 0;
	FILE *pfReader;
	pfReader = fopen("reader.txt",pcMode);
	if (pfReader == NULL)
		return -1;
	while (!feof(pfReader))
	{
		if (fread(&astReader[iReaderRecord], LEN_READER, 1, pfReader) == 1)
			iReaderRecord ++;
	}
	fclose(pfReader);
	return iReaderRecord;
}

void SaveBookFile(int iBookId)
{
	FILE *pfBook;
	/*读写方式打开文件,文件必须已经存在,指针指向文件首部,wb会删掉原有文件,ab指针指向文件尾部*/
	pfBook = fopen("book.txt", "rb+");
	if (pfBook != NULL)
	{
		fseek(pfBook, LEN_BOOK * iBookId, SEEK_SET);
		if (fwrite(&astBook[iBookId], LEN_BOOK, 1, pfBook) != 1)
			printf("无法保存该信息!\n");
	}
	fclose(pfBook);
}

void SaveReaderFile(int iReaderId)
{
	FILE *pfReader;
	pfReader = fopen("reader.txt", "rb+");
	if (pfReader != NULL)
	{
		fseek(pfReader, LEN_READER * iReaderId, SEEK_SET);
		if (fwrite(&astReader[iReaderId], LEN_READER, 1, pfReader) != 1)
			printf("无法保存该信息!\n");
	}
	fclose(pfReader);
}


/*==============================借还书管理相关函数============================*/
void BorrowBook()
{
	system("cls");
	int iBookId,iReaderId, iBorrow,i;

	/*输入要借书的读者编号,判断编号是否存在,显示该读者已借图书的信息*/
	iReaderId = SearchReader();
	if (iReaderId == -1)
		return;
	iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount;
	if (iBorrow == 0)
		printf("该读者目前没有借任何书\n");
	else
	{
		printf("\t该读者当前所借图书为:");
		for (i = 0; i < iBorrow; i++)
			printf("%d ", astReader[iReaderId].aiBookId[i]);
		printf("\n\n");
	}

	/*若读者可借书数量为0,不允许再借书,退出*/
	if (astReader[iReaderId].iAmount == 0)
	{
		printf("该读者可借书量为零,不能继续借书!\n");
		return;
	}

	/*输入要借的书号,查找书号是否存在,判断该书库存是否为0*/
	printf("\n按任意键输入要借阅的图书信息\n");
	getch();

	iBookId = SearchBook();
	if (iBookId == -1)
		return;
	if (astBook[iBookId].iAmount == 0)
	{
		printf("该图书库存量为零!图书不可借\n");
		return;
	}	
	astReader[iReaderId].aiBookId[iBorrow] = astBook[iBookId].iNum;/*图书库存不为0时,允许借书*/
	astBook[iBookId].iAmount--;     /*该图书的库存量减1*/
	astReader[iReaderId].iAmount--; /*该读者的可借书的数量减1*/

	SaveBookFile(iBookId);	     /*保存该条图书信息到文件*/
	SaveReaderFile(iReaderId);   /*保存该条读者信息到文件*/

	printf("借书成功!\n");
}

void ReturnBook()
{
	int iBookId, iReaderId, iBorrow,i,j;

	system("cls");
	iReaderId = SearchReader();
	if (iReaderId == -1)
		return;
	iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount;

	if (iBorrow == 0)
	{
		printf("\t该读者没有借任何书,无需归还\n");
		return;
	}
	else
	{
		printf("\t该读者当前所借图书为:");
		for (i = 0; i < iBorrow; i++)
			printf("%d ", astReader[iReaderId].aiBookId[i]);
		printf("\n\n");
	}

	printf("按任意键输入要归还的图书信息\n");
	getch();

	iBookId = SearchBook();
	if (iBookId == -1)
		return;
	for (i = 0; i < iBorrow; i++)
		if (astReader[iReaderId].aiBookId[i] == astBook[iBookId].iNum)
		{
			for (j = i; j < iBorrow - 1; j++)
				astReader[iReaderId].aiBookId[j] = astReader[iReaderId].aiBookId[j + 1];
			astReader[iReaderId].aiBookId[iBorrow] = 0;
			
			astBook[iBookId].iAmount++;      /*该书的库存数加1*/
			astReader[iReaderId].iAmount++;  /*该读者的最大可借阅数加1*/
			break;
		}

	if (i == iBorrow)/*遍历循环,未找到该书*/
	{
		printf("该读者没有借这本书,无需归还\n");
		return;
	}
	
	SaveBookFile(iBookId);      /*保存该条图书信息到文件*/
	SaveReaderFile(iReaderId);	/*保存该条读者信息到文件*/

	printf("还书成功!\n");
}

/*==============================图书管理相关函数============================*/

/*显示图书函数*/
void ShowBook()
{
	int i, iBookRecord;/*整型变量,i用以循环计数,iBookRecord用以计量图书的条数*/
	
	system("cls");

	iBookRecord = ReadBookFile("rb");
	if (iBookRecord == -1)
		printf("文件打开失败!请先新增加图书信息!\n");
	else if (iBookRecord == 0)
		printf("文件中没有图书信息!\n");
	else
	{
		printf("\t|---------------------------------------------------------|\n");
		printf("\t  %-6s%-16s%-10s%-20s%-4s\n","编号","书名","作者","出版社","库存");
		for (i = 0; i < iBookRecord; i++)/*显示图书信息*/
			printf("\t  %-6d%-16s%-10s%-20s%-4d\n", BOOK_DATA);
		printf("\t|---------------------------------------------------------|\n");
	}
}

void AddBook()
{
	FILE *pfBook;/*文件指针*/
	int iBookRecord, iFlagExist, i;
	char cFlag;
	
	system("cls");

	iBookRecord = ReadBookFile("ab+");  /*ab+追加方式打开或新建二进制文件*/
	if (iBookRecord == -1)
	{
		printf("文件打开失败!\n");
		return;
	}
	else if (iBookRecord == 0)
		printf("没有图书记录!\n");
	else
		ShowBook();/*如果图书记录不为零则调用showBook显示所有图书*/

	/*以下代码为循环录入图书信息*/
	printf("请选择是否键入信息(y/n):");
	cFlag = getchar();
	getchar();
	if (cFlag == 'n')
		return;
	/*键入'y'则开始进行写入,首先输入图书编号,遍历数组并判断是否已存在该图书,若存在提示用户重新输入*/
	pfBook = fopen("book.txt", "ab+");
	if (pfBook == NULL)
	{
		printf("文件打开失败!\n");
		return;
	}

	while (cFlag == 'y')
	{
		if (iBookRecord >= BOOK_NUM)/*若超过M容量范围则不能继续写入*/
		{
			printf("记录已满!");
			fclose(pfBook);
			return;
		}

		printf("请输入图书编号:");
		do{
			iFlagExist = 0;
			scanf("%d", &astBook[iBookRecord].iNum);
			getchar();
			for (i = 0; i < iBookRecord; i++)
			{
				if (astBook[i].iNum == astBook[iBookRecord].iNum)
				{
					iFlagExist = 1;
					printf("该图书编号已存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);	

		/*新增图书的基本信息*/
		printf("请输入图书名称:");
		gets(astBook[iBookRecord].acName);
		printf("请输入图书作者:");
		gets(astBook[iBookRecord].acAuthor);
		printf("请输入图书出版社:");
		gets(astBook[iBookRecord].acPress);
		printf("请输入图书库存量:");
		scanf("%d", &astBook[iBookRecord].iAmount);
		getchar();
		/*将新增的图书信息写入文件中*/
		if (fwrite(&astBook[iBookRecord], LEN_BOOK, 1, pfBook) != 1)
		{
			printf("无法保存该信息!\n");
			return;
		}
		else
		{
			printf("%d号图书信息已保存!\n", astBook[iBookRecord].iNum);
			iBookRecord++;
		}
		printf("继续输入信息吗(y/n)");
		cFlag = getchar();
		getchar();
	}
	fclose(pfBook);
	printf("添加图书执行完毕!\n");
}


void DeleteBook()
{
	FILE *pfBook;/*文件指针*/
	int iBookId, iBookRecord, i;
	char cFlag;/*字符型变量,用于选择*/
	
	system("cls");

	iBookId = SearchBook();

	if (iBookId == -1)
		return;

	iBookRecord = ReadBookFile("rb");
	printf("已找到该图书,是否删除?(y/n)");
	cFlag = getchar();
	getchar();

	if (cFlag == 'n')
		return;
	else if (cFlag == 'y')
	{
		for (i = iBookId; i < iBookRecord - 1; i++)
			astBook[i] = astBook[i + 1];/*数组依次前移*/
		iBookRecord--;
	}

	pfBook = fopen("book.txt", "wb");
	if (pfBook != NULL)
	{
		for (i = 0; i < iBookRecord; i++)/*将修改过的图书信息写入文件*/
		{
			if (fwrite(&astBook[i], LEN_BOOK, 1, pfBook) != 1)
			{
				printf("无法保存该信息!\n");
				return;
			}
		}

		fclose(pfBook);
		printf("%d号图书信息已删除!\n", astBook[iBookId].iNum);
	}
}

void ModifyBook()
{
	int iBookId, iBookRecord, iFlagExist, iItem, iNum, i;
	
	system("cls");
	
	iBookId = SearchBook();  /*调用查找图书函数获得图书记录号*/

	if (iBookId == -1) /*未找到该序号的图书,直接返回*/
		return;

	/*找到该序号的图书,可以进行修改操作*/
	iBookRecord = ReadBookFile("rb");
	ShowModifyBookMenu();   /*显示修改选项的菜单*/

	scanf("%d", &iItem);
	getchar();
	switch (iItem)
	{
	case 1:
		printf("请输入图书编号:");
		do{
			iFlagExist = 0;
			scanf("%d", &iNum);
			getchar();
			for (i = 0; i < iBookRecord; i++)
			{
				if (iNum == astBook[i].iNum && i != iBookId)
				{
					iFlagExist = 1;
					printf("错误,该图书编号已存在,请重新输入:");
					break;
				}
			}
		} while (iFlagExist == 1);
		astBook[iBookId].iNum = iNum;
		break;
	case 2:
		printf("请输入图书名称:");
		gets(astBook[iBookId].acName);
		break;
	case 3:
		printf("请输入图书作者:");
		gets(astBook[iBookId].acAuthor);
		break;
	case 4:
		printf("请输入图书出版社:");
		gets(astBook[iBookId].acPress);
		break;
	case 5:
		printf("请输入图书库存量:");
		scanf("%d", &astBook[iBookId].iAmount);
		getchar();
		break;
	}
    /*调用SaveBookFile函数将修改记录存入文件*/
	SaveBookFile(iBookId);
	printf("图书信息修改成功!\n");
}

int SearchBook()
{
	int iBookNum, iBookRecord, iBookId, i;
	system("cls");

	iBookRecord = ReadBookFile("rb");/*以"rb"形式打开文件,如果失败则返回*/
	if (iBookRecord == -1)
	{
		printf("文件打开失败!\n");
		printf("| 按任意键返回子菜单 |");
		getch();
		return -2;/*文件打开失败,返回-2*/
	}
	else if (iBookRecord == 0)
	{
		printf("没有图书记录!\n");
		printf("| 按任意键返回子菜单 |");
		getch();
		return -3; /*没有记录,返回-3*/
	}

	/*以下进入查找程序*/
	printf("请输入图书编号:");
	scanf("%d", &iBookNum);
	getchar();
	for (i = 0; i < iBookRecord; i++)
	{
		if (iBookNum == astBook[i].iNum)
		{
			iBookId = i;/*找到记录,返回记录号*/
			printf("%d号图书信息如下:\n", iBookNum);
			printf("\t|---------------------------------------------------------|\n");
			printf("\t  %-6s%-16s%-10s%-20s%-4s\n", "编号", "书名", "作者", "出版社", "库存");
			printf("\t  %-6d%-16s%-10s%-20s%-4d\n", BOOK_DATA);
			printf("\t|---------------------------------------------------------|\n");
			break;
		}
	}
	if (i == iBookRecord)/*遍历循环,没有找到记录,提示用户*/
	{
		printf("找不到%d号图书信息!\n", iBookNum);
		iBookId = -1;/*找不到记录,返回-1*/
	}
	return iBookId;
}

/*显示读者信息函数*/
void ShowReader()
{
	int i, iReaderRecord;
	system("cls");

	iReaderRecord = ReadReaderFile("rb");
	if (iReaderRecord == -1)
		printf("文件打开失败!请先添加读者信息!\n");
	else if (iReaderRecord == 0)
		printf("文件中没有读者信息\n");
	else
	{
		printf("\t|---------------------------------------------------------|\n");
		printf("\t  %-8s%-12s%-6s%-16s%-16s\n","编号","姓名","性别","当前可借书数量","最大可借书数量");
		for (i = 0; i < iReaderRecord; i++)
			printf("\t  %-8d%-12s%-6s%-16d%-16d\n", READER_DATA);
		printf("\t|---------------------------------------------------------|\n");
	}

}
/*==============================读者管理相关函数============================*/

/*添加读者信息函数*/
void AddReader()
{
	FILE *pfReader;
	int iFlagExist,iReaderRecord, i;
	char cFlag;

	system("cls");

	iReaderRecord = ReadReaderFile("ab+"); /*ab+追加方式打开或新建二进制文件*/
	if (iReaderRecord == -1)
	{
		printf("文件打开失败!\n");
		return;
	}
	else if (iReaderRecord == 0)
		printf("没有读者记录!\n");
	else
		ShowReader();

	/*以下代码为循环录入读者信息*/
	printf("请选择是否键入信息(y/n):");
	cFlag = getchar();
	getchar();
	if (cFlag == 'n')
		return;

	pfReader = fopen("reader.txt", "ab+");
	if (pfReader == NULL)
	{
		printf("文件打开失败!\n");
		return;
	}

	while (cFlag == 'y')
	{
		if (iReaderRecord >= READER_NUM)
		{
			printf("记录已满!");
			fclose(pfReader);
			return;
		}
		printf("请输入读者编号:");
		do
		{
			iFlagExist = 0;
			scanf("%d", &astReader[iReaderRecord].iNum);
			getchar();

			for (i = 0; i < iReaderRecord; i++)
			{
				if (astReader[i].iNum == astReader[iReaderRecord].iNum)
				{
					iFlagExist = 1;
					printf("该读者编号已存在!请重新输入:");
				}
			}
		} while (iFlagExist == 1);

		printf("请输入读者姓名:");
		gets(astReader[iReaderRecord].acName);
		printf("请输入读者性别:F/M:");
		while (gets(astReader[iReaderRecord].acSex) != NULL)
		{
			if (strcmp(astReader[iReaderRecord].acSex, "F") == 0 || strcmp(astReader[iReaderRecord].acSex, "M") == 0)
				break;
			printf("错误,只能输入'F'或者'M',请重新输入\n");
		}
		printf("请输入读者最大可借书数:(范围为5-10):");
		while (scanf("%d", &astReader[iReaderRecord].iMax) == 1)
		{
			getchar();
			if (astReader[iReaderRecord].iMax >= 5 && astReader[iReaderRecord].iMax <= 10)
				break;
			printf("错误,读者最大借阅数范围为5-10,请重新输入\n");
		}
		astReader[iReaderRecord].iAmount = astReader[iReaderRecord].iMax;

		for (i = 0; i < astReader[iReaderRecord].iMax; i++)//数组初始化为0,表示该读者一本书也没有借;
			astReader[iReaderRecord].aiBookId[i] = 0;


		if (fwrite(&astReader[iReaderRecord], LEN_READER, 1, pfReader) != 1)
		{
			printf("无法保存该信息!\n");
		}
		else
		{
			printf("%d号读者信息已保存!\n", astReader[iReaderRecord].iNum);
			iReaderRecord++;
		}
		printf("继续输入信息吗(y/n)");
		cFlag = getchar();
		getchar();
	}
	fclose(pfReader);
	printf("添加读者执行完毕!\n");
}

void DeleteReader()
{
	FILE *pfReader;
	int iReaderId, iReaderRecord,i;
	char cFlag;

	system("cls");

	iReaderId = SearchReader();
	if (iReaderId == -1)
		return;

	iReaderRecord = ReadReaderFile("rb");
	printf("已找到该读者,是否删除?(y/n)");
	cFlag = getchar();
	getchar();

	if (cFlag == 'n')
		return;
	else if (cFlag == 'y')
	{
		for (i = iReaderId; i < iReaderRecord - 1; i++)
			astReader[i] = astReader[i + 1];
		iReaderRecord--;
	}

	pfReader = fopen("reader.txt", "wb");
	if (pfReader != NULL)
	{
		for (i = 0; i < iReaderRecord; i++)
		{
			if (fwrite(&astReader[i], LEN_READER, 1, pfReader) != 1)
			{
				printf("无法保存该信息!\n");
				return;
			}
		}
		fclose(pfReader);
		printf("%d号读者信息已删除!\n", astReader[iReaderId].iNum);
	}
}

void ModifyReader()
{
	int iReaderId,iReaderRecord,iBorrow,iItem,iNum,iMax,iFlagExist,i;

	system("cls");
	iReaderId = SearchReader();
	if (iReaderId == -1)
		return;

	/*能查询到该读者,则可以进行修改操作*/
	iReaderRecord = ReadReaderFile("rb");/*以"rb"形式打开文件,如果失败则返回*/
	ShowModifyReaderMenu();
	scanf("%d", &iItem);
	getchar();

	switch (iItem)
	{
	case 1:
		printf("请输入读者编号:");
		do{
			iFlagExist = 0;
			scanf("%d", &iNum);
			getchar();
			for (i = 0; i < iReaderRecord; i++)
			if (iNum == astReader[i].iNum && i != iReaderId)
				{
					iFlagExist = 1;
					printf("错误,该读者编号已存在,请重新输入:\n");
					break;
				}
		} while (iFlagExist == 1);
		astReader[iReaderId].iNum = iNum;
		break;
	case 2:
		printf("请输入读者名字:");
		gets(astReader[iReaderId].acName);
		break;
	case 3:
		printf("请输入读者性别:F/M:");
		while (gets(astReader[iReaderId].acSex) != NULL)
		{
			if (strcmp(astReader[iReaderId].acSex, "F") == 0 || strcmp(astReader[iReaderId].acSex, "M") == 0)
				break;
			printf("错误,只能输入'F'或者'M',请重新输入\n");
		}
		break;
	case 4:
		iBorrow = astReader[iReaderId].iMax - astReader[iReaderId].iAmount;
		printf("请输入读者最大可借书数:(范围为5-10):");
		while (scanf("%d", &iMax) == 1)
		{
			getchar();
			if (iMax >= 5 && iMax <= 10)
			{
				if (iBorrow > iMax)
				{
					printf("该读者目前借阅图书数量大于该数目,需要先还书后修改!\n");
					return;
				}
				else
				{
					astReader[iReaderId].iMax = iMax;
					astReader[iReaderId].iAmount = iMax - iBorrow;
					for (i = iBorrow; i < iMax; i++)
						astReader[iReaderId].aiBookId[i] = 0;
					break;
				}
			}
			printf("错误,读者最大借阅数范围为5-10,请重新输入\n");
		}
		break;
	}/*switch 结束*/

	SaveReaderFile(iReaderId);
	printf("读者信息修改成功!\n");
}

int SearchReader()
{
	int iReaderNum,iReaderRecord, iReaderId, i;
	system("cls");

	iReaderRecord = ReadReaderFile("rb");
	if (iReaderRecord == -1)
	{
		printf("文件打开失败!\n");
		return -2; /*文件打开失败,返回-2*/
	}
	else if (iReaderRecord == 0)
	{
		printf("没有读者记录!\n");
		return -3; /*没有记录,返回-3*/
	}

	printf("请输入读者编号:");
	scanf("%d", &iReaderNum);
	getchar();
	for (i = 0; i < iReaderRecord; i++)
	{
		if (iReaderNum == astReader[i].iNum)
		{
			iReaderId = i; /*找到记录,返回记录号*/
			printf("%d号读者信息如下:\n", iReaderNum);
			printf("\t|---------------------------------------------------------|\n");
			printf("\t  %-8s%-12s%-6s%-16s%-16s\n", "编号", "姓名", "性别", "当前可借书数量", "最大可借书数量");
			printf("\t  %-8d%-12s%-6s%-16d%-16d\n", READER_DATA);
			printf("\t|---------------------------------------------------------|\n");
			printf("\n");
			break;
		}
	}
	if (i == iReaderRecord)/*遍历循环,没有找到记录,提示用户*/
	{
		printf("找不到%d号读者信息!\n", iReaderNum);
		iReaderId = -1;/*找不到记录,返回-1*/
	}
	return iReaderId;
}

void ManageBook()
{
	int iItem;

	ShowBookMenu();	/*显示子菜单*/
	scanf("%d", &iItem);
	getchar();
	/*用while循环和switch语句进行选择*/
	while (iItem)
	{
		switch (iItem)
		{
		case 1:
			ShowBook();/*显示图书信息*/
			break;
		case 2:
			AddBook();/*新增图书信息*/
			break;
		case 3:
			SearchBook();/*查找图书*/
			break;
		case 4:
			DeleteBook();/*删除图书*/
			break;
		case 5:
			ModifyBook();/*修改图书信息*/
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t");
		}
		printf("| 按任意键返回子菜单 |");
		getch();   /*接收用户输入任意字符*/

		ShowBookMenu();
		scanf("%d", &iItem);
		getchar();
	}
}

void ManageReader()
{
	int iItem = 0;
	ShowReaderMenu();

	scanf("%d", &iItem);
	getchar();

	while (iItem)
	{
		switch (iItem)
		{
		case 1:
			ShowReader();
			break;
		case 2:
			AddReader();
			break;
		case 3:
			SearchReader();
			break;
		case 4:
			DeleteReader();
			break;
		case 5:
			ModifyReader();
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t");
		}

		printf("| 按任意键返回子菜单 |");
		getch();   /*接收用户输入任意字符*/
		ShowReaderMenu();
		scanf("%d", &iItem);
		getchar();
	}
}

void BorrowReturnManage()
{
	int iItem = 0;
	ShowBorrowReturnMenu();

	scanf("%d", &iItem);
	getchar();

	while (iItem)
	{
		switch (iItem)
		{
		case 1:
			BorrowBook();
			break;
		case 2:
			ReturnBook();
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t");
		}
		printf("| 按任意键返回子菜单 |");
		getch();
		ShowBorrowReturnMenu();
		scanf("%d", &iItem);
		getchar();
	}
}

int main()
{
	int iItem;
	ShowMainMenu();/*调用ShowMainMenu函数绘制界面*/
	scanf("%d", &iItem);/*提示用户输入数字*/
	getchar();
	while (iItem)
	{
		switch (iItem)
		{
		case 1:
			ManageBook();
			break;
		case 2:
			ManageReader();
			break;
		case 3:
			BorrowReturnManage();
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单");
			Sleep(3000);
		}
		ShowMainMenu();
		scanf("%d", &iItem);
		getchar();
	}
	return 0;
}
derMenu();
		scanf("%d", &iItem);
		getchar();
	}
}

void BorrowReturnManage()
{
	int iItem = 0;
	ShowBorrowReturnMenu();

	scanf("%d", &iItem);
	getchar();

	while (iItem)
	{
		switch (iItem)
		{
		case 1:
			BorrowBook();
			break;
		case 2:
			ReturnBook();
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t");
		}
		printf("| 按任意键返回子菜单 |");
		getch();
		ShowBorrowReturnMenu();
		scanf("%d", &iItem);
		getchar();
	}
}

int main()
{
	int iItem;
	ShowMainMenu();/*调用ShowMainMenu函数绘制界面*/
	scanf("%d", &iItem);/*提示用户输入数字*/
	getchar();
	while (iItem)
	{
		switch (iItem)
		{
		case 1:
			ManageBook();
			break;
		case 2:
			ManageReader();
			break;
		case 3:
			BorrowReturnManage();
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单");
			Sleep(3000);
		}
		ShowMainMenu();
		scanf("%d", &iItem);
		getchar();
	}
	return 0;
}

八、项目总结

图书馆管理系统实现了对图书信息和读者信息的增、删、改、查管理功能,并且实现了借书登记和还书登记功能。

通过项目,学习到如下内容。

  • 如何显示主功能菜单和响应用户输入
  • 如何使用结构体数组记录信息
  • 如何利用文件操作保存结果
  • 如何进行函数封装使代码结构更清晰
  • 55
    点赞
  • 467
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
C语言程序设计 课 程 设 计 题 目 图书管理系统 系 (部) 信息工程系 班 级 姓 名 学 号 指导教师 2015年 月 日至 月 日 共 周 年 月 日 C语言程序设计 课程设计任务书 "一、设计题目、内容及要求 " "题目:图书管理系统设计 " "内容:本题目适合于学校图书馆的资料管理和检索。要求程序实现分级管理" ",管理员可对图书和学生信息进行录入、查询、修改、输出、删除、插入、" "保存等操作。 " "要求:程序结构合理、算法准确、语法正确,并生成可执行文件。 " "二、要求的设计成果(课程设计说明书、设计实物、图纸等) " "1. 课程设计说明书:课程设计说明书1份,不少于2000字。说明书中要包含 " "需求分析、总体设计、详细设计以及主要的算法描述等内容。 " "2. 源代码:图书管理系统程序清单 " "三、进程安排 " "星期1(7.6):完成需求分析和程序总体设计。 " "星期2(7.7):完成数据录入、删除、修改、插入和浏览功能模块的设计。 " "星期3(7.8):完成密码设置和数据检索模块,程序调试无误,生成可执行文" "件。 " "星期4(7.9):撰写课程设计说明书初稿。 " "星期5(7.10):提交课程设计说明书、程序和数据。 " "四、主要参考资料 " "[1] 谭浩强,张基温.C语言程序设计教程(第3版)[M].北京:高等教育出 " "版社,2006 " "[2] " "吕凤煮.C语言基础教程——基础理论与案例[M].北京:清华大学出版社,20" "05 " "[3] " "黄明、梁旭、万洪莉.C语言课程设计[M].北京:电子工业出版社,2006 " "[4] 郭宁,郑小玲.管理信息系统[M].北京:人民邮电出版社,2006 " "[5] " "赵池龙,杨林,陈伟.实用软件工程[M].北京:电子工业出版社,2006 " "指导教师(签名): "教研室主任(签名): " 课程设计成绩评定表 "出勤 "出勤天数 " " "情况 " " " " "缺勤天数 " " "成 "出勤情况及设计过程表现(20分) " " "绩 " " " "评 " " " "定 " " " " "课设答辩(20分) " " " "设计成果(60分) " " " "总成绩(100分) " " "提问 " " "(答辩) " " "问题 " " "情况 " " " " " " " " " " " " " " "综 " " "合 " " "评 " " "定 " " " " " " " " " " " " "指导教师签名: " " "年 月 日 " 引言 图书管理系统的需求分析主要确定系统的主要功能,对系统进行概要描述,对系统 的各个主要功能分别进行需求描述,目的是使软件在设计过程中尽量符合客户的需要。 图书管理系统是一个对学生和图书信息进行录入、查询、修改、输出、删除、插入 、保存等操作的管理应用软件,用户可以对文件中存储的学生和图书信息进行查找和浏 览。该软件提供了一个简单的人机界面,管理员可以根据提示输入操作项并进行一系列 对学生和图书信息资料的管理操作 本系统主要应用结构化的设计思想实现学生和图书信息的增、删、改和查等典型管理 功能。各主要模块的数据均存储在文件中,因此包含对文件的读、写等基本操作。在软 件开发过程中应用了高级语言程序设计中的基本控制结构,如选择、循环、顺序结构。 系统的设计方法是结构化设计方法,采用C语言进行开发。 2 总体设计 图书馆的信息管理和检索系统的需求分析主要确定系统的主要功能,对系统进行概要 描述,对系统的各个主要功能分别进行需求描述,目的是使软件在设计过程中尽量符合 客户的需要。 2.1 系统概述 将程序整体进行模块化处理,使程序编译思路更加清晰,降低了编译程序的难度。图 书信息中包含学生姓名、性别、系别、班级、学号、借书时间、还书时间和图书的书名 、作者、图书编号等基本信息,程序具有信息录入、删除、修改、浏览、检索和保存功 能。 2.2 功能需求 该软件提供了一个对图书和学生信息进行管理和查看的平台,给用户提供了一个简单 友好的用户接口,功能需求如下: 2.2.1密码系统 通过已定密码进入对应管理目录,从而进行相应的操作功能。 2.2.2信息录入 根据提示输入学生的姓名、性别、系别、班级、学号和图书书名、作者、图书编号等 信息要素。 2.2.3信息查询 使用者可以根据系统提示按学生姓名、系别、班级、学号查询学生信息或按图书书名、 作者、图书编号查询图书信息。 2.2.4信息修改 使用者可以根据系统提示对系统中存在的学生的姓名、性别、系别、班级、学号、借 书时间、还书时间和图书书名、作者、图书编号等信息进行修改。 2.2.5信息输出 可输出学生姓名,性别,系别,班级,学号

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾亿-唯一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值