IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021-12-23【C语言课程设计】【图书信息管理系统设计】 -> 正文阅读

[C++知识库]2021-12-23【C语言课程设计】【图书信息管理系统设计】

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语言学习必备】学习


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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:17:43  更:2021-12-24 18:19:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:45:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码