c语言图书管理系统(详细个人理解)

图书管理系统

1.1 前言

​ 这个是我们大一上c语言的课设大作业,以二进制文件操作写一个图书管理系统

要求如下:
1.实现新进图书的信息录入

​2.实现图书基本信息的查询

​3.实现对图书信息的删除`

​4.实现借书人办理注册

​5.实现用户办理借书手续

​6.实现用户办理还书手续

​7.使用二进制文件方式存储数据,系统以菜单方式工作

1.2 语句

先来了解一些程序中常用到的语句

1.2.1 二进制文件操作语句

fwrite()

fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

将buffer中的数据写入文件stream中,写入count个项,输入完后跳过size大小
buffer 获取数据的地址
size 读取的大小
count 写入的项数
stream 写入的路径

fread()
fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

从文件stream中读取数据,读取count个项,读入buffer中,读取完后跳过size大小
buffer 用于接收数据的地址
size 读取的大小
count 读取的项数
stream 读取的路径

!!!fwrite()和fread()操作完后会跳过size大小,在后面的修改数据有大用

fseek()
fseek(FILE *stream, long offset, int fromwhere);

设置指针stream指向以fromwhere为基准,偏移offset大小的位置(+为向下移,-为向上移)
在该程序中设置offset为文件大小,以便于在修改函数中将指针指向上一个数据

fopen()
FILE * fopen(const char * path, const char * mode);

FILE *fd = fopen(filename,"rb"); 
    if(fd == NULL)
    {
		printf("打开失败")exit(1);                          //0是正常退出,1是错误退出
	}

path字符串是欲打开的文件路径和文件名
mode表示文件的打开方式

fclose()
用于关闭文件,有fopen一定就要有fclose

feof()
判断文件是否结束,使用这个函数来便利文件
原理:feof站在光标所在位置,向后看还有没有字符,如果有就返回0;如果没有就返回非0

1.2.2 system语句

1.system(“cls”) 清屏
2.system(“pause”) 暂停

1.2.3 模块思路
添加模块

思路:用fopen以二进制方式ab+打开文件,数据写入时在原内容后追加
tip:ab+表示以二进制文件方式打开,数据写入后在原内容追加,若为空文件则创建一个文件

删除模块

思路:用fopen以二进制方式rb+打开文件,再以wb+建立一个临时文件,用strcmp比较,再fwrite将原文件中除需要删除的数据以外的所有数据写入到临时文件中,然后remove删除原文件,将临时文件rename重新命名为原文件的名字
tip:rb+表示以二进制方式打开,打开文件后不会清空文件原内容,进行写入操作时会覆盖掉原有位置的内容
wb+表示以二进制方式打开,如果文件不存在则建立,若存在则以空文件形式覆盖原文件

查询模块

思路:用fopen以二进制方式rb+打开文件,fseek将指针指向开头,用while以fread为条件循环直至读到文件结尾,循环过程中用strcmp比较,如果读到的数据与输入的数据相同,则输出该数据

显示所有图书模块也是大差不差,利用while以!feof为条件一直从文件头读到文件结束,过程中用fread将数据循环输出

修改模块(借书,还书)

思路:用fopen以二进制方式rb+打开文件,fseek将指针位置移至文件开头,用fread将文件数据读到结构体中,再用strcmp将输入数据与结构体对比,如果相同则输出结构体信息,随后用strcpy将所需修改的内容写入结构体中,再用fseek将指针位置移至该数据开头,随后用fwrite把结构体的信息覆盖掉原数据,完成修改
tip:fread进程结束后会移动offset大小,利用fseek将指针位置移回数据开头位置,再用fwrite覆盖写入即可

2.1 模块

​ 将程序模块化设计,把不同的功能模块化再组合在一起

1.添加模块
void Input()                                 //录入图书 
{
	FILE *fp = NULL;          //初始化指针
	book nidi;
	char flag = 'y';
	fp = fopen("book1.data","ab+");        //ab+表示以二进制方式打开,数据写入时在原内容后追加
	if (fp == NULL)
	{
		printf("打开失败!\n");
		exit(1);
	}

	while((flag == 'y'))
	{
		system("cls");
	
		printf("请输入书名:\n");
		scanf("%s",&nidi.bname);
		printf("请输入书籍id:\n");
		scanf("%s",&nidi.bid);
		printf("请输入单价:\n");
		scanf("%f",&nidi.bprice);
		printf("请输入作者:\n");
		scanf("%s",&nidi.bauthor);
		printf("请输入存在状态:        \n(若无的话,填‘无’,下同)\n");
		scanf("%s",&nidi.state);
		printf("请输入借书人姓名:\n");
		scanf("%s",&nidi.student);
		printf("请输入性别:\n");
		scanf("%s",&nidi.gender);
		printf("请输入学号:\n");
		scanf("%s",&nidi.num);
		
		fwrite( &nidi, sizeof(book), 1, fp);  //把nidi中的数据写入文件,分成1份,每块是book类型大小 
		
		printf("还要继续输入吗?继续的话请输入'y',否则返回主界面\n");
		scanf("%c",&flag);
	}
	
	fclose(fp);         //关闭文件
	return; 
}
2.删除模块
void Delete()              //删除   
{
	system("cls");
	book nid;
	FILE* fp;
	char a[10];
	fp = fopen("book1.data","rb+");      //rb+和wb+的区别 对于rb+如果打开的文件不存在 会报错(返回NULL)
	                                                    //对于wb+ 如果文件不存在则会建立,如果文件存在 会覆盖
	
	if ( fp == NULL)
	{
		printf("打开失败!!\n");
		exit(1);
	}
	
	printf("请输入图书ID:");
	scanf("%s",a);
	printf("删除成功\n");
	
	fseek(fp, 0, SEEK_SET);
	FILE* fp1;
	fp1 = fopen("linshi.data", "wb+");
	
	while(fread(&nid, sizeof(book), 1, fp))    //从fp中读数据 
	{
		if ( strcmp(a, nid.bid) != 0)          //不是要删除的内容 
		{
			fwrite (&nid, sizeof(book), 1, fp1);          //将除要删除外的数据写入fp1中 
		}
	}
	fclose(fp);
	fclose(fp1);
	remove("book1.data");            //删除原文件
	rename("linshi.data", "book1.data");         //重命名为原文件
	
	fflush(stdin);        
	return;
}
3.查询模块
void IDSearch()           //ID查询 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	char a[10];
	bool found = false;
	
	printf("请输入图书编号\n");
	scanf("%s",a);
	
	fp = fopen("book1.data","rb+");
	
	
	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	
	fseek(fp,0,SEEK_SET);        
	while (fread(&nidi, sizeof(book), 1, fp))       
	{
		if (strcmp ( a, nidi.bid) == 0 )          
		{
			printf("书名: %s\n",nidi.bname);
			printf("编号: %s\n",nidi.bid);
			printf("单价: %.1f\n",nidi.bprice);
			printf("作者: %s\n",nidi.bauthor);
			printf("存在状态: %s\n",nidi.state);
			printf("借书人姓名: %s\n",nidi.student);
			printf("性别: %s\n",nidi.gender);
			printf("学号: %s\n",nidi.num);
			found = true;
            break; 
		}
		
	}
	fclose(fp);
    if (!found) 
    {
        printf("没有该图书!");
    }
    system("pause");
 	SearchMenu();	
}
4.修改模块
void Borrow()           //借书 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	char a[10];
	bool found = false;
	int sta = -1;
	
	printf("请输入所要借的图书编号\n");
	scanf("%s",a);
	
	fp = fopen("book1.data","rb+");
	
	
	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	
	fseek(fp,0,SEEK_SET);        //移动文件读写指针位置
	while (fread(&nidi, sizeof(book), 1, fp))         //从fp中读取数据 
	{
		if (strcmp ( a, nidi.bid) == 0 )          //strcmp相同返回0
		{
			printf("书名: %s\n",nidi.bname);
			printf("编号: %s\n",nidi.bid);
			printf("单价: %.1f\n",nidi.bprice);
			printf("作者: %s\n",nidi.bauthor);
			printf("存在状态: %s\n",nidi.state);
			printf("借书人姓名: %s\n",nidi.student);
			printf("性别: %s\n",nidi.gender);
			printf("学号: %s\n",nidi.num);
			if(strcmp (nidi.state, "1") == 0)
			{
				printf("该图书已被借出\n");
				
			}else{
				printf("如若借该书请输入'0'\n输入其他即取消\n");
				scanf("%d",&sta);
				if ( sta == 0)
				{
					strcpy(nidi.state, "1");
                	printf("请输入您的姓名:\n");
                	scanf("%s", nidi.student);
                	printf("请输入您的性别:\n");
                	scanf("%s", nidi.gender);
                	printf("请输入您的学号:\n");
                	scanf("%s", nidi.num);
                	fseek(fp, -sizeof(book), SEEK_CUR);       //为负值,则向上移动
                	fwrite(&nidi, sizeof(book), 1, fp);
                	printf("借书成功!\n");
                	fclose(fp);
				}
			}
			found = true;
            break; // 找到匹配的书籍后立即退出循环
		}
		
	}
	fclose(fp);
    if (!found) // 没有找到匹配的书籍
    {
        printf("没有该图书!");
    }
    system("pause");
    Play();
}

3.源码

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

typedef struct Book          //创建结构体
{
	char bname[30];//书名 
	char bid[10];//书编号 
	float bprice;//单价 
	char bauthor[10];//作者 
	char state[6];//存在状态 
	char student[10];//借书人姓名 
	char gender[4];//性别 
	char num[13];//学号 

}book;

typedef struct User
{
	char name[30];         //用户名 
	char password[30];          //密码 
}user;

void Menu();         //主页面 
void Choice();       //主页面用户交互 
void BookControl();  //书籍管理 
void Choice2();      //书籍管理用户交互 
void Input();        //书籍登记 
void Delete();       //书籍删除 
void SearchMenu();   //查询书籍 
void Choice1();      //查询书籍用户交互 
void IDSearch();     //ID查询 
void NameSearch();   //书名查询 
void AuthorSearch(); //作者查询 
void AllSearch();    //查询所有书籍 
void UserControl();  //用户管理 
void Choice3();      //用户管理用户交互 
void Registe();      //用户注册 
void Load();         //用户登录 
void Play();         //借书还书 
void Choice4();      //借书还书用户交互 
void Borrow();       //借书 
void Return();       //还书 
void DeleteUser();   //用户注销 

void Menu()                         //菜单管理 
{	
	system("cls");
	printf("*****************************************\n");
	printf("*\t\t0.退出系统\t\t*\n");
	printf("*\t\t1.查询书籍\t\t*\n");
	printf("*\t\t2.书籍管理\t\t*\n");
	printf("*\t\t3.用户管理\t\t*\n");
	printf("*****************************************\n");
	printf("请输入一个数<0-3>\n");
}  

void Choice()                      //主界面用户交互 
{
	int choice = 0;
	printf("请输入选项:");
	scanf("%d",&choice);
	switch(choice){
		case 0:
		printf("退出成功\n");
		
			exit(0); 
			break;
		case 1:
			SearchMenu();
			break;
		case 2:
			BookControl();
			break;
		case 3:
			UserControl();
			break;
		default:
			printf("错误!请输入0-3\n");
			break; 
	} 
}

void BookControl()                       //书籍管理
{
	system("cls");
	printf("*****************************************\n");
	printf("*\t\t0.返回上一级\t\t*\n");
	printf("*\t\t1.录入书籍\t\t*\n");
	printf("*\t\t2.删除书籍\t\t*\n");
	printf("*****************************************\n");
	printf("请输入一个数<0-2>\n");
	Choice2();
} 

void Choice2()                      //书籍管理用户交互 
{
	int choice = 0;
	printf("请输入选项:");
	scanf("%d",&choice);
	switch(choice){
		case 0:
			Menu();
			break;
		case 1:
			Input();
			break;
		case 2:
			Delete();
			break;
		default:
			printf("错误!请输入0-3\n");
			break; 
	} 
}

void Input()                                 //录入图书 
{
	FILE *fp = NULL;          //初始化指针23
	book nidi;
	char flag = 'y';
	fp = fopen("book1.data","ab+");        //ab+表示以二进制方式打开,数据写入时在原内容后追加
	if (fp == NULL)
	{
		printf("打开失败!\n");
		exit(1);
	}

	while((flag == 'y'))
	{
		system("cls");
	
		printf("请输入书名:\n");
		scanf("%s",&nidi.bname);
		printf("请输入书籍id:\n");
		scanf("%s",&nidi.bid);
		printf("请输入单价:\n");
		scanf("%f",&nidi.bprice);
		printf("请输入作者:\n");
		scanf("%s",&nidi.bauthor);
		printf("请输入存在状态:        \n(若无的话,填‘无’,下同)\n");
		scanf("%s",&nidi.state);
		printf("请输入借书人姓名:\n");
		scanf("%s",&nidi.student);
		printf("请输入性别:\n");
		scanf("%s",&nidi.gender);
		printf("请输入学号:\n");
		scanf("%s",&nidi.num);
		
		fwrite( &nidi, sizeof(book), 1, fp);  //把nidi中的数据写入文件,分成1份,每块是book类型大小 
		//fflush(stdin);        //刷新缓冲区
		
		printf("还要继续输入吗?继续的话请输入'y',否则返回主界面\n");
		scanf("%c",&flag);
	}
	
	fclose(fp);         //关闭文件
	return; 
}

void Delete()              //删除   
{
	system("cls");
	book nid;
	FILE* fp;
	char a[10];
	fp = fopen("book1.data","rb+");      //rb+和wb+的区别 对于rb+如果打开的文件不存在 会报错(返回NULL)
	                                                    //对于wb+ 如果文件不存在则会建立,如果文件存在 会覆盖
	
	if ( fp == NULL)
	{
		printf("打开失败!!\n");
		exit(1);
	}
	
	printf("请输入图书ID:");
	scanf("%s",a);
	printf("删除成功\n");
	
	fseek(fp, 0, SEEK_SET);
	FILE* fp1;
	fp1 = fopen("linshi.data", "wb+");
	
	while(fread(&nid, sizeof(book), 1, fp))    //从fp中读数据 
	{
		if ( strcmp(a, nid.bid) != 0)          //不是要删除的内容 
		{
			fwrite (&nid, sizeof(book), 1, fp1);          //将除要删除外的数据写入fp1中 
		}
	}
	fclose(fp);
	fclose(fp1);
	remove("book1.data");            //删除原文件
	rename("linshi.data", "book1.data");         //重命名为原文件
	
	fflush(stdin);        
	return;
}

void SearchMenu()             //查询界面 
{
	system("cls");
	printf("*************************************************\n");
	printf("*\t\t0.返回上一级\t\t\t*\n");
	printf("*\t\t1.按书籍名称查询\t\t*\n");
	printf("*\t\t2.按书籍编号查询\t\t*\n");
	printf("*\t\t3.按书籍作者查询\t\t*\n");
	printf("*\t\t4.显示所有书籍\t\t\t*\n");
	printf("*************************************************\n");
	printf("请输入一个数<0-3>\n");
	Choice1(); 
}

void Choice1()             //查询界面用户交互 
{
	int choice = 0;
	printf("请输入选项:");
	scanf("%d",&choice);
	switch(choice){
		case 0:
			Menu();
			break;
		case 1:
			NameSearch();
			break;
		case 2:
			IDSearch();
			break;
		case 3:
			AuthorSearch();
			break;
		case 4:
			AllSearch();
			break;
		default:
			printf("错误!请输入0-3\n");
			break; 
	} 
}

void IDSearch()           //ID查询 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	char a[10];
	bool found = false;
	
	printf("请输入图书编号\n");
	scanf("%s",a);
	
	fp = fopen("book1.data","rb+");
	
	
	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	
	fseek(fp,0,SEEK_SET);        
	while (fread(&nidi, sizeof(book), 1, fp))       
	{
		if (strcmp ( a, nidi.bid) == 0 )          
		{
			printf("书名: %s\n",nidi.bname);
			printf("编号: %s\n",nidi.bid);
			printf("单价: %.1f\n",nidi.bprice);
			printf("作者: %s\n",nidi.bauthor);
			printf("存在状态: %s\n",nidi.state);
			printf("借书人姓名: %s\n",nidi.student);
			printf("性别: %s\n",nidi.gender);
			printf("学号: %s\n",nidi.num);
			found = true;
            break; 
		}
		
	}
	fclose(fp);
    if (!found) 
    {
        printf("没有该图书!");
    }
    system("pause");
 	SearchMenu();	
}

void NameSearch()            //书名查询 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	char a[30];
	bool found = false;
	
	printf("请输入图书名字\n");
	scanf("%s",a);
	
	fp = fopen("book1.data","rb+");
	
	
	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	
	fseek(fp,0,SEEK_SET);      
	while (fread(&nidi, sizeof(book), 1, fp))      
	{
		if (strcmp ( a, nidi.bid) == 0 )      
		{
			printf("书名: %s\n",nidi.bname);
			printf("编号: %s\n",nidi.bid);
			printf("单价: %.1f\n",nidi.bprice);
			printf("作者: %s\n",nidi.bauthor);
			printf("存在状态: %s\n",nidi.state);
			printf("借书人姓名: %s\n",nidi.student);
			printf("性别: %s\n",nidi.gender);
			printf("学号: %s\n",nidi.num);
			found = true;
            break; 
		}
		
	}
	fclose(fp);
    if (!found) 
    {
        printf("没有该图书!\n");
    }
    system("pause");
 	SearchMenu();	
}

void AuthorSearch()               //作者查询 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	char a[10];
	bool found = false;
	
	printf("请输入图书作者\n");
	scanf("%s",a);
	
	fp = fopen("book1.data","rb+");
	
	
	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	
	fseek(fp,0,SEEK_SET);        
	while (fread(&nidi, sizeof(book), 1, fp))        
	{
		if (strcmp ( a, nidi.bid) == 0 )         
		{
			printf("书名: %s\n",nidi.bname);
			printf("编号: %s\n",nidi.bid);
			printf("单价: %.1f\n",nidi.bprice);
			printf("作者: %s\n",nidi.bauthor);
			printf("存在状态: %s\n",nidi.state);
			printf("借书人姓名: %s\n",nidi.student);
			printf("性别: %s\n",nidi.gender);
			printf("学号: %s\n",nidi.num);
			found = true;
            break; 
		}
		
	}
	fclose(fp);
    if (!found) // 没有找到匹配的书籍
    {
        printf("没有该图书!");
    }
    system("pause");
 	SearchMenu();	
}


void AllSearch()          //所有书籍显示 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	fp = fopen("book1.data", "rb+");

	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	printf("书名\t编号\t单价\t作者\t状态\t姓名\t性别\t学号\n");

	fseek(fp, 0, SEEK_SET);

	while (!feof(fp))  //如果文件没有结束则返回非0值 
	{
		if (fread(&nidi, sizeof(book), 1, fp))
		{
			printf("%s\t%s\t%.1f\t%s\t%s\t%s\t%s\t%s\n",nidi.bname, nidi.bid, nidi.bprice, nidi.bauthor, nidi.state, nidi.student, nidi.gender, nidi.num);
		}
	
	}

	fclose(fp);
	return;
}

void UserControl()
{
	system("cls");
	printf("*****************************************\n");
	printf("*\t\t0.返回上一级\t\t*\n");
	printf("*\t\t1.学生登录\t\t*\n");
	printf("*\t\t2.注册\t\t\t*\n");
	printf("*\t\t3.注销\t\t\t*\n");
	printf("*****************************************\n");
	printf("请输入一个数<0-3>\n");
	Choice3(); 
}

void Choice3()                      //登录界面用户交互 
{
	int choice = 0;
	printf("请输入选项:");
	scanf("%d",&choice);
	switch(choice){
		case 0:
			Menu();           
			break;
		case 1:
			Load();
			break;
		case 2:
			Registe();
			break;
		case 3:
			DeleteUser();
			break;
		default:
			printf("错误!请输入0-2\n");

			break; 
	} 
}

void Registe()                 //用户注册 
{
    system("cls");	
	user nidia;
	FILE* fp = NULL;
	char name[10];
	fp = fopen("user.data","ab+");
	int i = 0;
	
	if ( fp == NULL)
	{
		printf("打开失败!\n");
		exit(1);
	}
	
	printf("请输入用户名\n");
		scanf("%s",name);
		if( strcmp( name, nidia.name) == 0)
		{
			printf("该用户名存在\n");
		}else{
			strcpy( nidia.name, name);
			printf("请输入密码\n");
			scanf("%s",&nidia.password);
			printf("注册成功!!\n");
		
		fwrite ( &nidia, sizeof(user), 1, fp);
		fclose(fp);
		} 
		
	system("pause"); 
	UserControl();
}

void Load()                  //用户登录 
{
	system ("cls");
	FILE* fp = NULL;
	char z[31],m[31];
	user nidi;
	int i = 3;
	fp = fopen("user.data","rb+");
	
	if ( fp == NULL)
	{
		printf("打开失败!\n");
		exit(1);
	}
	
	
	fseek( fp, 0, SEEK_SET); 
	while ( fread( &nidi, sizeof(user), 1, fp) != 0)
	{
		printf("请输入用户名:\n");
		scanf("%s",z);
		
		if (!strcmp(z,nidi.name)) 
		{
			printf("请输入密码:\n你有三次机会\n");
            while (i != 0) 
			{
                scanf("%s",m);
                if (!strcmp(m,nidi.password)) {
                    printf("登录成功!\n");
                    i = 0;
                    Play();
                }else{
                    printf("密码错误!\n");
                    i--;
                }
            }
        } else {
            printf("帐号不存在!\n");
        }
	}
	
	fclose(fp);
	return;
}

void DeleteUser()              //用户注销   
{
	system("cls");
	user nid;
	FILE* fp;
	char a[30];
	fp = fopen("user.data","rb+");      
	
	if ( fp == NULL)
	{
		printf("打开失败!!\n");
		exit(1);
	}
	
	printf("请输入名字:");
	scanf("%s",a);
	printf("删除成功\n");
	
	fseek(fp, 0, SEEK_SET);
	FILE* fp1;
	fp1 = fopen("linshi.data", "wb+");
	
	while(fread(&nid, sizeof(user), 1, fp))    
	{
		if ( strcmp(a, nid.name) != 0)          
		{
			fwrite (&nid, sizeof(user), 1, fp1);          
		}
	}
	fclose(fp);
	fclose(fp1);
	remove("user.data");          
	rename("linshi.data", "user.data");         
	
	fflush(stdin);        
	return;
}

void Play()                    //借书还书 
{
	system("cls");
	printf("*****************************************\n");
	printf("*\t\t0.返回上一级\t\t*\n");
	printf("*\t\t1.办理借书手续\t\t*\n");
	printf("*\t\t2.办理还书手续\t\t*\n");
	printf("*****************************************\n");
	printf("请输入一个数<0-2>\n");
	Choice4(); 
} 

void Choice4()                //借书还书用户交互 
{
	int choice = 0;
	printf("请输入选项:");
	scanf("%d",&choice);
	switch(choice){
		case 0:
			UserControl();
			break;
		case 1:
			Borrow();
			break;
		case 2:
			Return();
			break;
		default:
			printf("错误!请输入0-2\n");
			break; 
	} 
}

void Borrow()           //借书 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	char a[10];
	bool found = false;
	int sta = -1;
	
	printf("请输入所要借的图书编号\n");
	scanf("%s",a);
	
	fp = fopen("book1.data","rb+");
	
	
	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	
	fseek(fp,0,SEEK_SET);        //移动文件读写指针位置
	while (fread(&nidi, sizeof(book), 1, fp))         //从fp中读取数据 
	{
		if (strcmp ( a, nidi.bid) == 0 )          //strcmp相同返回0
		{
			printf("书名: %s\n",nidi.bname);
			printf("编号: %s\n",nidi.bid);
			printf("单价: %.1f\n",nidi.bprice);
			printf("作者: %s\n",nidi.bauthor);
			printf("存在状态: %s\n",nidi.state);
			printf("借书人姓名: %s\n",nidi.student);
			printf("性别: %s\n",nidi.gender);
			printf("学号: %s\n",nidi.num);
			if(strcmp (nidi.state, "1") == 0)
			{
				printf("该图书已被借出\n");
				
			}else{
				printf("如若借该书请输入'0'\n输入其他即取消\n");
				scanf("%d",&sta);
				if ( sta == 0)
				{
					strcpy(nidi.state, "1");
                	printf("请输入您的姓名:\n");
                	scanf("%s", nidi.student);
                	printf("请输入您的性别:\n");
                	scanf("%s", nidi.gender);
                	printf("请输入您的学号:\n");
                	scanf("%s", nidi.num);
                	fseek(fp, -sizeof(book), SEEK_CUR);
                	fwrite(&nidi, sizeof(book), 1, fp);
                	printf("借书成功!\n");
                	fclose(fp);
				}
			}
			found = true;
            break; // 找到匹配的书籍后立即退出循环
		}
		
	}
	fclose(fp);
    if (!found) // 没有找到匹配的书籍
    {
        printf("没有该图书!");
    }
    system("pause");
    Play();
}

void Return()                        //还书 
{
	system("cls");
	FILE *fp = NULL;
	book nidi;
	char a[10];
	bool found = false;
	int sta = -1;
	
	printf("请输入所要还的图书编号\n");
	scanf("%s",a);
	
	fp = fopen("book1.data","rb+");
	
	
	if (fp == NULL)
	{
		printf("打开失败! \n");
		exit(1);
	}
	
	fseek(fp,0,SEEK_SET);        //移动文件读写指针位置
	while (fread(&nidi, sizeof(book), 1, fp))         //从fp中读取数据 
	{
		if (strcmp ( a, nidi.bid) == 0 )          //strcmp相同返回0
		{
			printf("书名: %s\n",nidi.bname);
			printf("编号: %s\n",nidi.bid);
			printf("单价: %.1f\n",nidi.bprice);
			printf("作者: %s\n",nidi.bauthor);
			printf("存在状态: %s\n",nidi.state);
			printf("借书人姓名: %s\n",nidi.student);
			printf("性别: %s\n",nidi.gender);
			printf("学号: %s\n",nidi.num);
			if(strcmp (nidi.state, "1") == 0)
			{
				printf("如若还该书请输入'0'\n输入其他即取消\n");
				scanf("%d",&sta);
				if ( sta == 0)
				{
					strcpy(nidi.state, "0");
                	strcpy(nidi.gender, "0");
                	strcpy(nidi.student, "0");
                	strcpy(nidi.num, "0");
                	fseek(fp, -sizeof(book), SEEK_CUR);
                	fwrite(&nidi, sizeof(book), 1, fp);
                	printf("还书成功!\n");
                	system("pause");
                	fclose(fp);
				}
			}
			found = true;
            break; 
		}
		
	}
	fclose(fp);
    if (!found)
    {
        printf("没有该图书!");
    }
    system("pause");
    Play();
		
}

	
int main(int argc, char *argv[]) 
{
	while (1)
	{
		Menu();
		Choice();
		system("pause");  
		system("cls");
	}
	return 0;
}

4.总结

​ 程序方面大同小异,都是由4个主要模块进行调整修改,这个程序不足的地方就是冗余,在函数调用返回上一个函数的过程中有大问题

​ ·

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值