1.设计任务

1.1 设计题目的描述

该系统包含管理员管理系统、读者查询系统和批量查询系统。
功能如下:
(1)管理员可以显示、增加、删除、修改图书信息;
(2)读者可以通过书名、图书编号和作者查询图书信息,并告诉读者书籍是否借出,如果未借出,返回图书存放地址;
(3)通过出版社或作者批量查询图书;
(4)书库的容量可以自由增加;

1.2 设计要求

(1)仔细审题,明确题目要求。
(2)按照结构化的程序设计思想,将程序模块化,将相对独立的功能写成函数。
(3)要求编程、调试通过并演示;程序编写规范,添加适当注释。
(4)按照课程设计报告的内容和格式要求,撰写课程设计报告,并且打印。

2.设计方案说明

2.1 数据的存储结构

定义的结构体数组如下:

struct  Book {
   
	int iNum;              //图书编号
	char Category[20];     //类别
	char Name[20];         //图书名称
	char Author[20];       //作者
	char Press[20];        //出版社
	char Day[15];          //出版日期
	char Location[20];     //存放位置
	int Lendto;            //是否借出
};

2.2函数之间的调用关系说明

图1 函数调用关系:

2.3函数说明

ManageBook()函数

1)	函数的原型声明
	void ManageBook(); //图书管理子系统;2)	函数功能及参数说明
	功能:完成图书显示、添加、删除、修改等操作函数的调用;
	参数:无;	
(3)	函数中使用的关键变量说明
	变量1:n , 用来记录选择的操作类型
(4)	算法设计
	1.	输入n;
	2.	显示子菜单;
	3.	while()循环,n为‘0’时退出系统;
	4.	switch()操作功能的选择,调用相应的函数;
	注:(ManageReader()函数; pLBook()函数;原理大致相同)

ShowBook()函数

1)	函数的原型声明
	void ShowBook();
(2)	函数功能及参数说明
	功能:显示已录入的图书
	参数:无
(3)	函数中使用的关键变量说明
	变量1:i , 循环变量
	变量2:iBookRecord ,图书记录文件中已存储的图书数量
(4)	算法设计
	1.	清屏;
	2.	调用ReadBookFile()函数,读取文件中图书数量;
	3.	判断文件是否打开成功
	4.	遍历输出已录入的图书信息

AddBook()函数

1)	函数的原型声明
	void AddBook();
(2)	函数功能及参数说明
	功能:实现图书的添加,并写入文件中
	参数:无
(3)	函数中使用的关键变量说明
	变量1:pBook ,文件指针
	变量2:iBookRecord ,图书记录文件中已存储的图书数量 
	变量3:cFlag , 是否录入图书选项
(4)	算法设计
	1.	清屏
	2.	调用ReadBookFile()函数,读取文件中图书数量;
	3.	判断文件是否打开成功
	4.	输入选项,是否添加图书
	5.	while() 循环判断输入
	6.	判断文件内存是否充足,内存不足调用gaidaxiao()函数扩容
	7.	输入各类图书信息
	8.	判断是否正确写入文件,写入则图书数量+1
	9.	关闭文件

DeleteBook()函数

1)	函数的原型声明
	void DeleteBook();
(2)	函数功能及参数说明
	功能:实现图书从文件中删除 
	参数:无
(3)	函数中使用的关键变量说明
	变量1:pBook ,文件指针
	变量2:iBookRecord ,图书记录文件中已存储的图书数量 
	变量3:cFlag , 是否录入图书选项
	变量4:iBookId , 记录要删除图书的位置
(4)	算法设计
	1.	清屏
	2.	调用SearchBook()函数,读取要删除图书的位置
	3.	调用ReadBookFile()函数,读取文件中图书数量;
	4.	输入选项,是否删除图书
	5.	把从删除图书的那一项开始的后每项都向前移动一个脚标,达到删除的目的。
	6.	以“wb”的形式打开文件
	7.	将删除后的数据写入文件
	8.	判断是否正确写入文件
	9.	关闭文件

SearchBook()函数

1)	函数的原型声明
	int SearchBook();
(2)	函数功能及参数说明
	功能:实现从文件中按图书编号查找图书 
	参数:无
(3)	函数中使用的关键变量说明
	变量1:iBookNum , 输入的图书编号
	变量2:iBookRecord ,图书记录文件中已存储的图书数量  
	变量3:iBookId , 记录要查找的图书位置
(4)	算法设计
	1.	清屏
	2.	调用ReadBookFile()函数,读取文件中图书数量;
	3.	文件是否打开成功
	4.	输入图书编号
	5.	遍历查找图书,找到输出图书信息
	注:(NameSearchBook();函数; AuthorSearchBook()函数; PressSearchBook()函数;原理大致相同)

ModifyBook()函数

1)	函数的原型声明
	void ModifyBook();
(2)	函数功能及参数说明
	功能:实现文件中图书的信息修改 
	参数:无
(3)	函数中使用的关键变量说明
	变量1:iItem , 修改选项的编号
	变量2:iBookRecord ,图书记录文件中已存储的图书数量  
	变量3:iBookId , 记录要查找的图书位置
(4)	算法设计
	1.	清屏
	2.	调用SearchBook()函数,查找相应的图书
	3.	调用ReadBookFile()函数,读取文件中图书数量;
	4.	调用	ShowModifyBookMenu()函数,显示修改选项菜单
	5.	输入修改选项编号
	6.	switch()选择并修改信息
	7.	调用	SaveBookFile()函数,保存修改结果

ReadBookFile函数

1)	函数的原型声明
	int ReadBookFile(const char *pcMode);
(2)	函数功能及参数说明
	功能:打开图书文件,并返回图书数量
	参数:const char *pcMode , 文件打开的方式
(3)	函数中使用的关键变量说明
	变量1:pBook ,文件指针
	变量2:iBookRecord ,图书记录文件中已存储的图书数量  
(4)	算法设计
	1.	打开文件
	2.	每次读一个结构体(一本书),成功后计数+1
	3.	关闭文件
	4.	返回文件中图书数量

FiNum()函数

1)	函数的原型声明
	void FiNum();
(2)	函数功能及参数说明
	功能:按图书编号查找图书
	参数:无
(3)	函数中使用的关键变量说明
	变量1:iBookId , 记录要查找的图书位置
(4)	算法设计
	1.	清屏
	2.	调用SearchBook()函数,在文件中找到图书编号所对应的图书;
	3.	判断图书是否有剩余,有则输出图书的位置
	注:(Fname()函数; Fauthor()函数; Fpress()函数;原理大致相同)

SaveBookFile()函数

1)	函数的原型声明
	void SaveBookFile(int iBookId);;
(2)	函数功能及参数说明
	功能:在文件中写入修改数据
	参数:int iBookId ,修改图书的位置
(3)	函数中使用的关键变量说明
	变量1:pBook ,文件指针
(4)	算法设计
	1.	打开文件
	2.	fseek()找到修改文件的位置
	3.	fwrite()写入修改信息
	4.	关闭文件

3设计题目源代码清单

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include<Windows.h>
#include<string.h>

#define Book_Data astBook[i].iNum,astBook[i].Name,astBook[i].Category,astBook[i].Press,astBook[i].Author,astBook[i].Day,astBook[i].Location,astBook[i].Lendto
#define LEN_BOOK sizeof(struct Book)//Book结构体的大小 
int BOOK_NUM=10;                //书的个数

struct  Book {
   
	int iNum;              //图书编号
	char Category[20];     //类别
	char Name[20];         //图书名称
	char Author[20];       //作者
	char Press[20];        //出版社
	char Day[15];          //出版日期
	char Location[20];     //存放位置
	int Lendto;            //是否借出
};
struct Book *astBook=(struct Book*)malloc(10*sizeof(struct Book));
//struct Book astBook[BOOK_NUM];//结构体数组记录所有图书信息

//函数声明
void ManageBook();   //图书管理子系统
void ManageReader(); //读者借阅系统
void pLBook();       //批量查询系统 

void ShowBookMenu(); //显示图书管理子系统菜单
void ShowReaderMenu();//显示读者借阅系统菜单
void ShowMainMenu(); //主菜单
void pLMenu();       //批量查询菜单 


int NameSearchBook();    //通过书名查找图书信息 
int AuthorSearchBook();  //通过作者查找图书信息
int AuthorSearchBook1(); //有输出 
int PressSearchBook();   //通过出版社查找图书信息 
int SearchBook();    //通过图书编号查找图书信息

void ShowBook();     //显示图书信息
void DeleteBook();   //删除图书信息
void ModifyBook();   //修改图书信息
void AddBook();      //添加图书信息

void ShowModifyBookMenu();        //显示修改图书的可修改选项 
int ReadBookFile(const char *pcMode);   //从图书文件中读取图书记录 
void SaveBookFile(int iBookId);   //写入函数 

void Fname();        //按书名查询图书
void FiNum();        //按图书编号查询图书
void Fauthor();      //按作者姓名查询图书
void Fauthor1();     //有输出 
void Fpress();       //按出版社查询图书 

int gaidaxiao(int BOOK_NUM);//扩容 
void Print(int i,int iBookId);//打印查找的书籍和借书状态 
 
int gaidaxiao(int BOOK_NUM){
   
	struct Book *astBook=(struct Book*)malloc(BOOK_NUM*sizeof(struct Book));
	
	BOOK_NUM*=2;
	astBook=(struct Book*)realloc(astBook,BOOK_NUM*sizeof(struct Book));
	return BOOK_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 pLMenu(){
   
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t|------------------欢迎进入--------------------|\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 ShowBookMenu(){
   
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t|------------------欢迎进入--------------------|\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| 0.返回主菜单 |\n");
	printf("\t|----------------------------------------------|\n");
	printf("\n");
	printf("\t\t请选择(0-4):");
}

void ShowReaderMenu(){
   
	system("cls");
	printf("\n\n\n\n\n");
	printf("\t|------------------欢迎进入--------------------|\n");
	printf("\t| 图书馆管理系统 |\n");
	printf("\t| 读者借阅系统 |\n");
	printf("\t| |\n");
	printf("\t| 1.按书名查询图书 |\n");//void Fname()
	printf("\t| 2.按图书编号查询图书 |\n");//void FiNum()
	printf("\t| 3.按作者姓名查询图书 |\n");//void Fauthor()
	printf("\t| 0.返回主菜单 |\n");
	printf("\t|----------------------------------------------|\n");
	printf("\n");
	printf("\t\t请选择(0-3):");
}

void ShowModifyBookMenu(){
   
	printf("\n\n\n\n\n");
	printf("\t|------------------欢迎进入--------------------|\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| 6.存放位置 |\n");
	printf("\t| 7.是否借出 |\n");
	printf("\t| 0.返回主菜单 |\n");
	printf("\t|----------------------------------------------|\n");
	printf("\n");
	printf("\t\t请选择(0-7):");
}
void ManageBook() {
   
	int n;
	ShowBookMenu();//显示子菜单
	scanf("%d", &n);
	getchar();
	while (n) {
   
		switch (n) {
   
		case 1:
			ModifyBook();//修改图书信息
			break; 
		case 2:
			DeleteBook();//删除图书信息
			break;
		case 3:
			AddBook();//添加图书信息
			break;
		case 4:
			ShowBook();//显示图书信息 
			break;
		default:
			printf("\t\t请输入正确数字!\n\t\t");
		}
		printf("|按任意键返回子菜单|");
		getchar();

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

void pLBook() {
   
	int n;
	pLMenu();//显示子菜单
	scanf("%d", &n);
	getchar();
	while (n) {
   
		switch (n) {
   
		case 1:
			Fpress();//出版社 
			break; 
		case 2:
			Fauthor();//作者 
			break;
		default:
			printf("\t\t请输入正确数字!\n\t\t");
		}
		printf("|按任意键返回子菜单|");
		getchar();

		pLMenu();
		scanf("%d",&n);
		getchar();
	}
}

void ManageReader() {
   //读者借阅系统
	int n;
	ShowReaderMenu();//显示子菜单
	scanf("%d", &n);
	getchar();
	while (n) {
   
		switch (n) {
   
		case 1:
			Fname();        //按书名查询图书
			break;
		case 2:
			FiNum();        //按图书编号查询图书
			break;
		case 3:
			Fauthor1();      //按作者姓名查询图书
			break;
		default:
			printf("\t\t请输入正确数字!\n\t\t");
		}
		printf("|按任意键返回子菜单|");
		getchar();

		ShowReaderMenu();
		scanf("%d",&n);
		getchar();
	}
}

void ShowBook(){
   
	int 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%-12s%-6s%-12s%-10s%-10s%-10s%-2s\n",
		"编号","书名","类别","出版社","作者","出版日期","存放位置","是否借出('1'表示借出)"); 
	
		for(i=0;i<iBookRecord;i++){
   
			printf("\t %-6d%-12s%-6s%-12s%-10s%-10s%-10s%-2d\n",Book_Data);
		}
		printf("\t|-----------------------------------------------------------------------------|\n");
	}
} 

void AddBook() {
   
	FILE *pBook;//文件指针
	int iBookRecord;
	char cFlag;
	
	system("cls");
	iBookRecord = ReadBookFile("ab+");
	if(iBookRecord==-1){
   
		printf("文件打开失败!\n");
	}else if(iBookRecord==0){
   
		printf("没有图书信息!\n");
	}else 
		ShowBook();
	
	printf("请选择是否输入信息(y/n):");
	cFlag=getchar();
	getchar();
	
	if(cFlag=='n')
		return;
	pBook=fopen("book.txt","ab+");
	if(pBook==NULL){
   
		printf("文件打开失败"); 
		return; 
	}
	
	while(cFlag=='y'){
   
		if(iBookRecord>=BOOK_NUM){
   
			printf("记录已满!");
			BOOK_NUM=gaidaxiao(BOOK_NUM);
			printf("已自动扩容为%d",BOOK_NUM);
			
		// fclose(pBook);
		// return; 
		}
		
		printf("请输入图书编号:");
		scanf("%d",&astBook[iBookRecord].iNum);
		printf("请输入图书名称:");
		scanf("%s",astBook[iBookRecord].Name);
		printf("请输入图书类别:");
		scanf("%s",astBook[iBookRecord].Category);
		printf("请输入图书出版社:");
		scanf("%s",astBook[iBookRecord].Press);
		printf("请输入图书作者:");
		scanf("%s",astBook[iBookRecord].Author);
		printf("请输入图书出版日期:");
		scanf("%s",astBook[iBookRecord].Day);
		printf("请输入图书存放位置:");
		scanf("%s",astBook[iBookRecord].Location);
		printf("请输入图书是否借出('1'表示借出):");
		scanf("%d",&astBook[iBookRecord].Lendto);
		getchar();
		
		if(fwrite(&astBook[iBookRecord],LEN_BOOK,1,pBook)!=1){
   
			printf("无法保存该信息");
			return; 
		}
		else{
   
			printf("已保存!\n");
			iBookRecord++;
		}
		printf("是否继续输入信息(y/n):");
		cFlag=getchar();
		getchar();
	}
	fclose(pBook);
	printf("添加图书执行完毕!\n"); 
}

int SearchBook(){
   
	int iBookNum,iBookRecord,iBookId,i;
	system("cls");
	
	iBookRecord = ReadBookFile("rb");
	if(iBookRecord == -1){
   
		printf("文件打开失败!\n");
		printf("按任意键返回子菜单");
		getch();
		return -1; 
	}else if(iBookRecord == 0){
   
		printf("没有图书记录\n");
		printf("按任意键返回子菜单");
		getch();
		return -1;
	}
	
	//进入查找程序
	printf("请输入图书编号:");
	scanf("%d",&iBookNum);
	getchar();
	for(int i=0;i<iBookRecord;i++){
   
		if(iBookNum==astBook[i].iNum){
   
			iBookId=i;
			printf("图书信息如下:\n");
			printf("\t|-----------------------------------------------------------------------------|\n");
			printf("\t %-6s%-12s%-6s%-12s%-10s%-10s%-10s%-2s\n",
			"编号","书名","类别","出版社","作者","出版日期","存放位置","是否借出('1'表示借出)"); 
			printf("\t %-6d%-12s%-6s%-12s%-10s%-10s%-10s%-2d\n",Book_Data);
			printf("\t|-----------------------------------------------------------------------------|\n");
		}
	} 
	if(i==iBookRecord){
   
		printf("找不到图书!\n");
		iBookId=-1;
	}
	return iBookId;
}

int NameSearchBook(){
   
	int iBookRecord,iBookId,i;
	char name[20]; 
	system("cls");
	
	iBookRecord = ReadBookFile("rb");
	if(iBookRecord == -1){
   
		printf("文件打开失败!\n");
		printf("按任意键返回子菜单");
		getch();
		return -1; 
	}else if(iBookRecord == 0){
   
		printf("没有图书记录\n");
		printf("按任意键返回子菜单");
		getch();
		return -1;
	}
	
	//进入查找程序
	printf("请输入书名:");
	scanf("%s",name);
	getchar();
	for(int i=0;i<iBookRecord;i++){
   
		if(strcmp(name,astBook[i].Name)==0){
   
			Print(i,iBookId); 
			if(astBook[i].Lendto==0){
   
				printf("图书还有剩余!\n"); 
				printf("图书的位置在:%s\n",astBook[i].Location);
			}
			else{
   
				printf("图书没有剩余了!"); 
			}

		}	
	} 
	if(i==iBookRecord){
   
		printf("找不到图书!\n");
		iBookId=-1;
	}
	return iBookId;
}

int PressSearchBook(){
   
	int iBookRecord,iBookId,i;
	char name[20]; 
	system("cls");
	
	iBookRecord = ReadBookFile("rb");
	if(iBookRecord == -1){
   
		printf("文件打开失败!\n");
		printf("按任意键返回子菜单");
		getch();
		return -1; 
	}else if(iBookRecord == 0){
   
		printf("没有图书记录\n");
		printf("按任意键返回子菜单");
		getch();
		return -1;
	}
	
	//进入查找程序
	printf("请输入出版社名称:");
	scanf("%s",name);
	getchar();
	for(int i=0;i<iBookRecord;i++){
   
		if(strcmp(name,astBook[i].Press)==0){
   
			Print(i,iBookId); 
		}
	} 
	if(i==iBookRecord){
   
		printf("找不到图书!\n");
		iBookId=-1;
	}
	return iBookId;
}

int AuthorSearchBook(){
   
	int iBookRecord,iBookId,i;
	char name[20]; 
	system("cls");
	
	iBookRecord = ReadBookFile("rb");
	if(iBookRecord == -1){
   
		printf("文件打开失败!\n");
		printf("按任意键返回子菜单");
		getch();
		return -1; 
	}else if(iBookRecord == 0){
   
		printf("没有图书记录\n");
		printf("按任意键返回子菜单");
		getch();
		return -1;
	}
	
	//进入查找程序
	printf("请输入作者姓名:");
	scanf("%s",name);
	getchar();
	for(int i=0;i<iBookRecord;i++){
   
		if(strcmp(name,astBook[i].Author)==0){
   
			Print(i,iBookId); 
		}
	} 
	if(i==iBookRecord){
   
		printf("找不到图书!\n");
		iBookId=-1;
	}
	return iBookId;
}

int AuthorSearchBook1(){
   
	int iBookRecord,iBookId,i;
	char name[20]; 
	system("cls");
	
	iBookRecord = ReadBookFile("rb");
	if(iBookRecord == -1){
   
		printf("文件打开失败!\n");
		printf("按任意键返回子菜单");
		getch();
		return -1; 
	}else if(iBookRecord == 0){
   
		printf("没有图书记录\n");
		printf("按任意键返回子菜单");
		getch();
		return -1;
	}
	
	//进入查找程序
	printf("请输入作者姓名:");
	scanf("%s",name);
	getchar();
	for(int i=0;i<iBookRecord;i++){
   
		if(strcmp(name,astBook[i].Author)==0){
   
			Print(i,iBookId); 
			if(astBook[i].Lendto==0){
   
				printf("图书还有剩余!\n"); 
				printf("图书的位置在:%s\n",astBook[i].Location);
			}
			else{
   
				printf("图书没有剩余了!"); 
			}
		}
	} 
	if(i==iBookRecord){
   
		printf("找不到图书!\n");
		iBookId=-1;
	}
	return iBookId;
}

void Print(int i,int iBookId){
   
	iBookId=i;
	printf("图书信息如下:\n");
	printf("\t|-----------------------------------------------------------------------------|\n");
	printf("\t %-6s%-12s%-6s%-12s%-10s%-10s%-10s%-2s\n",
	"编号","书名","类别","出版社","作者","出版日期","存放位置","是否借出('1'表示借出)"); 
	printf("\t %-6d%-12s%-6s%-12s%-10s%-10s%-10s%-2d\n",Book_Data);
	printf("\t|-----------------------------------------------------------------------------|\n");
	
}

void DeleteBook() {
   
	FILE *pBook;
	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--; 
	}
	
	pBook=fopen("book.txt","wb");
	if(pBook!=NULL){
   
		for(i=0;i<iBookRecord;i++){
   
			if(fwrite(&astBook[i],LEN_BOOK,1,pBook)!=1){
   
				printf("无法保存该信息!\n");
				return;
			}
		}
		fclose(pBook);
		printf("已删除!\n"); 
	}
}
void ModifyBook() {
   
	int iBookId,iBookRecord,iFlag,iItem,iNum,i;
	
	system("cls");
	iBookId=SearchBook();
	if(iBookId==-1){
   
		return;
	}
	
	//修改操作
	iBookRecord=ReadBookFile("rb");
	ShowModifyBookMenu(); 
	scanf("%d",&iItem);
	getchar();
	switch(iItem){
   
		case 1:
			printf("请输入图书名称:");
			scanf("%s",astBook[iBookId].Name);
			getchar();
			break;
		case 2:
			printf("请输入图书类别:");
			scanf("%s",astBook[iBookId].Category);
			getchar();
			break;
		case 3:
			printf("请输入图书出版社:");
			scanf("%s",astBook[iBookId].Press);
			getchar();
			break;
		case 4:
			printf("请输入图书作者:");
			scanf("%s",astBook[iBookId].Author);
			getchar();
			break;
		case 5:
			printf("请输入图书出版日期:");
			scanf("%s",astBook[iBookId].Day);
			getchar();
			break;
		case 6:
			printf("请输入图书存放位置:");
			scanf("%s",astBook[iBookId].Location);
			getchar();
			break;
		case 7:
			printf("请输入图书是否借出('1'表示借出):");
			scanf("%d",&astBook[iBookId].Lendto);
			getchar();
			break;		
	}
	
	SaveBookFile(iBookId);
	printf("图书修改成功!\n");
}

int ReadBookFile(const char *pcMode){
   
	int iBookRecord=0;
	FILE *pBook;
	pBook = fopen("book.txt",pcMode);
	if(pBook==NULL){
   
		return -1;
	}
	while(!feof(pBook)){
   
		if(fread(&astBook[iBookRecord],LEN_BOOK,1,pBook))
			iBookRecord++;
	}
	fclose(pBook);
	return iBookRecord;
}

void SaveBookFile(int iBookId){
   
	FILE *pBook;
	pBook=fopen("book.txt","rb+");
	if(pBook!=NULL){
   
		fseek(pBook,LEN_BOOK*iBookId,SEEK_SET);//SEEK_SET从文件开头偏移 
		if(fwrite(&astBook[iBookId],LEN_BOOK,1,pBook)!=1)
			printf("无法保存该信息!\n");
	} 
	fclose(pBook);	
} 

void Fname(){
   
	int iBookId;
	
	system("cls");
	iBookId=NameSearchBook();
	if(iBookId==-1){
   
		return;
	}
	printf("已找到图书\n");
	
}
void FiNum(){
   
	int iBookId;
	
	system("cls");
	iBookId=SearchBook();
	if(iBookId==-1){
   
		return;
	}	
	
	printf("已找到图书\n");
	if(astBook[iBookId].Lendto==0){
   
		printf("图书还有剩余!\n"); 
		printf("图书的位置在:%s\n",astBook[iBookId].Location);
	}
	else{
   
		printf("图书没有剩余了!"); 
	}
	
}

void Fauthor(){
   
	int iBookId;
	
	system("cls");
	iBookId=AuthorSearchBook();
	if(iBookId==-1){
   
		return;
	}	
	printf("已找到图书\n");

}

void Fauthor1(){
   
	int iBookId;
	
	system("cls");
	iBookId=AuthorSearchBook1();
	if(iBookId==-1){
   
		return;
	}	
	printf("已找到图书\n");

}

void Fpress(){
   
	int iBookId;
	
	system("cls");
	iBookId=PressSearchBook();
	if(iBookId==-1){
   
		return;
	}
	printf("已找到图书\n");
}

int main() {
   
	int n;
	ShowMainMenu();
	scanf("%d", &n);
	getchar();
	while (n) {
   
		switch (n) {
   
		case 1:
			ManageBook();
			break;
		case 2:
			ManageReader();
			break;
		case 3:
			pLBook();
			break;
		default:
			printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单");
			Sleep(3000);
		}
		ShowMainMenu();
		scanf("%d",&n);
		getchar();
	}
	
	return 0;
}

4 程序测试

4.1 测试数据说明

|-----------------------------------------------------------------------------|
      编号  书名        类别  出版社      作者      出版日期  存放位置  是否借出('1'表示借出)
      1     西安        Q     QWER        张三      20200901  A-1-1     1
      2     汉中        W     QWER        李四      20200321  A-1-2     1
      3     宝鸡        E     QWER        王五      20030212  A-1-3     0
      4     安康        R     ASDF        曹操      20090201  A-1-4     1
      5     榆林        T     ASDF        孙权      20090213  B-1-1     0
      6     西安        Q     QWER        张三      20200901  B-1-2     0
      7     咸阳        A     ASDF        刘备      20060121  B-1-3     0
      8     渭南        S     ASDF        张三      20060213  C-1-1     0
      9     延安        k     ZXCV        李四      20030201  C-1-2     0
      10    铜川        D     ZXCV        张三      20010302  C-1-3     1
  |-----------------------------------------------------------------------------| 

4.2 输出结果说明

目录:

1. 管理员管理系统:

1. 目录

2. 显示图书信息

3. 删除图书信息

4. 添加图书信息

5. 修改图书信息

2. 读者查询系统

1. 目录

2. 按书名查询图书

3. 按图书编号查询图书

4. 按作者姓名查询图书

3. 批量查询系统

1. 目录

2. 根据出版社批量查询

3. 根据作者批量查询

5 课程设计总结

问题及解决方案:

问题1:如何实现程序菜单

解决方案: 通过while()和switch()嵌套,做到对应功能的选择。

问题2:如何扩充文件中图书的数量

解决方案: 通过malloc()和realloc()实现动态内存分配

问题3:如何实现文件的读取和写入

解决方案: 通过文件指针和一系列函数实现具体如下:

1.	文件的打开FILE *fp; fp=fopen(filename,mode);
		三个基本模式:“r”(read)模式总是打开一个已经存在的文件,如果文件不存在则出错。“w”(write)模式建立一个新文件,如果文件已经存在,那么先删除存在的文件,再建立新文件。“a”(append)打开一个存在的文件,在文件的尾部追加数据。
		三个追加符:“b”(binary)表示二进制文件。“t”(或默认)表示文本文件。“+”表示将模式扩展为可读、可写方式。
2.	文件的关闭fclose(fp);//fp是文件指针;
3.	文件的写入fwrite(buf,size,count,fp);
		buf:类型为void指针,表示内存中存放着数据到首地址,通常是数组名或数组指针。size:无符号整型,表示一次写入的字节数。count:无符号整型,表示写入的大小为size的块的次数。fp:文件指针。
4.	文件的读取fread(buf,size,count,fp);
		buf:类型为void指针,表示内存中存放着数据到首地址,通常是数组名或数组指针。size:无符号整型,表示一次读取的字节数。count:无符号整型,表示读取的大小为size的块的次数。fp:文件指针。

问题4:有时程序执行完出现闪退问题

解决方案:
用getch();会等待你按下任意键,再继续执行下面的语句;所在头文件: conio.h;函数用途:从控制台读取一个字符,但不显示在屏幕上;函数原型:int getch(void);返回值:读取的字符

问题5:输入数据后程序卡住不动

解决方案:
scanf不接收回车符,只是遇到回车符就提交,因此,scanf提交之后,回车符还留在缓冲区中,程序卡住不动,问题不是出在scanf无法提交,而是出在scanf提交之后,下一次循环,scanf遇到了缓存中的回车,直接认为用户按回车了,再一次不接收回车符,如此循环
scanf之后,随便找个getchar()函数,接收一下回车符,这样缓存里面就没有回车符了,接收的回车符也不用管它,目的是把他接出来。

心得体会:

C语言是计算机程序设计的重要理论基础,在我们今后的学习生活中都有着十分重要的地位。要学好C语言,仅仅通过课本上的知识是远远不够的,我们要经常动手,锻炼实践能力。也只有多动手,多去实现程序功能开发,才能发现我们的一些问题,不断提高我们的学习能力,改进完善自己的知识体系,在我独立完成这个项目的过程中,我也遇到了一些之前不懂的知识点,特别是通过文件来存储数据,由于之前对文件知识的欠缺,导致一开始根本无从下手,通过这个项目也锻炼了我自主学习的能力,经过老师的讲解和网上资料的阅读学习,我基本上掌握了文件的创建、打开、写入、读取和关闭,通过本次项目的应用,我进一步熟悉文件操作的流程,为以后的程序开发打下基础,也培养了自己开发一个程序的思维,从功能构思,到伪代码设计,再到程序实现,最后的调试运行修改,通过一周的学习和不断完善,开发的图书信息管理系统完美实现项目要求,通过测试,各模块功能正常,感谢老师对我的指导,使我能够用这一周的时间开发出我自己的第一个C语言程序。我相信,有了这第一个程序的经验积累,今后一定能写出更加高效简洁的程序。


大一的C语言课设

💖推荐💖:

我的专栏:数据结构

或者进入2021-10-16【严蔚敏数据结构代码实现合集】【c语言学习必备】学习


🚩🚩🚩有问题欢迎评论区留言讨论,看到后我就会回复的!!!!