基于C语言的图书馆管理系统(数据存储在文件中)

本文介绍了一个使用C语言编程实现的图书馆管理系统,涵盖了图书录入、删除、修改、查询等功能,通过结构体和文件操作实现数据存储和读取,强调了人机交互界面的设计和程序逻辑处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序设计课程实践

------基于C语言图书馆管理系统编程设计

1.课程目的

本程序旨在训练学生的C语言基本编程能力,通过串联C语言输入输出、循环语句、子函数设计、数组、结构体等知识点,完成一个简单系统的设计开发。

2.系统功能

(1)通过菜单的形式实现人机交互界面

(2)实现录入图书基本信息

(3)实现删除指定图书的基本信息

(4)实现修改指定图书的基本信息

(5)实现查询指定图书的基本信息

3.设计思想

(1)人机交互界面

使用printf()和scanf()输入输出函数设计出主界面交互菜单,通过switch case语句判断输入的选项值,执行相对应得子函数。

每一个选项执行完毕,需要考虑清屏(system("cls");),然后重新显示主界面,供用户下一次操作。

设计程序退出菜单选项,用户执行其选项后,需要使用C语言文件操作,保存当前录入得全部图书信息。

程序启动时需要打开上次保存得数据文件,读入到内存中,如果没有则新建一个文件用于程序退出时保存数据。

人机交互界面可以自己设计,可以加上开发者信息,体现每个学生的差异。

展示如下:

(2)添加图书信息

设计为单独的子函供主函数调用。

定义一个结构体类型,包括七个成员变量(图书编号,图书名,作者名,出版单位,数量),并用该类型定义一个全局的结构体数组,供外部录入图书信息时存储。

//定义一个全局变量来存储当前学生个数

添加图书信息时,需要从外部读入图书的图书编号,图书名,作者名,出版单位,数量,在获取图书编号时需要判断是否输入重复,图书个数变量加一,并根据当前图书个数将其保存在结构体数组对应序号的元素中。

一个图书信息录入结束后可以提示用户输入Y/N来选择是否接着输入下一个图书。

(3)显示全部图书信息

通过对当前结构体数组进行遍历,并显示输出

展示如下:

(4)查找单个图书

根据输入需要查找图书名,遍历当前结构体数组,判断是否含有一致图书名的元素,若有则显示输出对应的信息和成绩,否则显示无此书籍。

显示如下:

(5)修改图书信息

根据输入需要查找图书的编号,遍历当前结构体数组,判断是否含有一致编号的元素,

若有则依次从外部读入用户所修改的值,保存到对应成员变量中。

展示如下:

(6)删除指定图书

根据输入需要查找图书的编号,遍历当前结构体数组,判断是否含有一致图书名称的元素,若有则从该元素之后依次将下一个元素赋值到上一个元素,直至最后一个赋值完成,最后当前图书个数变量减一。

显示如下:

(7)借阅图书

  通过对当前结构体数组进行遍历,并显示输出

显示如下:

  1. 归还图书

通过对当前结构体数组进行遍历,并显示输出

 显示如下:

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h> 
#include<string.h>
#include<stdlib.h>

//定义结构体 
struct book
{
	int id;
	char name[30];
	char author[30];
	char publish[50];
	int store;
	int total;
	int user[10];
	int days[10];
};

const char* file = "Book.txt";	//图书文件
//显示整体标题标题函数 
void page_title(char* menu_item)
{
	printf("\t\t图书馆管理系统\n\n%s-\n\n", menu_item);
}

void add_book(struct book* lib, int* count)
{
	void menu();
	void page_title(char* menu_item);
	system("cls");   //清屏 
	page_title("注册新书");
	
		printf("序号:");
		scanf("%d", &lib[*count].id);
		printf("书名:");
		scanf("%s", &lib[*count].name);
		printf("作者:");
		scanf("%s", &lib[*count].author);
		printf("出版社:");
		scanf("%s", &lib[*count].publish);
		printf("数量:");
		scanf("%d", &lib[*count].total);
		lib[*count].store = lib[*count].total;
		(*count)++;
		printf("\n");

}

void Show_books(struct book* lib, int count)
{
	int i;
	system("cls");
	for (i = 0; i < count; i++)
	{
			printf("序号:%d\t  ", lib[i].id);
			printf("书名:%s\t  ", lib[i].name);
			printf("作者:%s\t  ", lib[i].author);
			printf("出版社:%s\t  ", lib[i].publish);
			printf("存数:%d\t", lib[i].store);
			printf("总数:%d\n\n", lib[i].total);		
	}

}

void search_book(struct book* lib, int count)
{
	system("cls");
	int i, flag;
	char nam[30];
	system("cls");
	printf("请输入书名:");
	scanf("%s", &nam);

	if (strlen(nam) > 1)
	{
		for (i = 0; i < count; i++)
		{
			if (strcmp(lib[i].name, nam) == 0)
			{
				printf("序号:%d\t  ", lib[i].id);
				printf("书名:%s\t  ", lib[i].name);
				printf("作者:%s\t  ", lib[i].author);
				printf("出版社:%s\t  ", lib[i].publish);
				printf("存数:%d\t", lib[i].store);
				printf("总数:%d\n", lib[i].total);
				flag = 1;
				break;
			}
		}
	}
	else {
		printf("输入错误!\n");
		return;
	}
	
	if (flag == 0)
	{
		printf("\n没有找到相关书籍\n");
	}
}

void modify_book(struct book* lib, int count)
{
	int i, id_change;
	system("cls");
	page_title("修改图书信息:");
	printf("输入要修改的图书id:");
	scanf("%d", &id_change);

	for (i = 0; i < count; i++)
	{
		if (lib[i].id == id_change)
		{

			printf("修改书名:");
			scanf("%s", &lib[i].name);
			printf("修改作者:");
			scanf("%s", &lib[i].author);
			printf("修改出版社:");
			scanf("%s", &lib[i].publish);
			printf("修改数量:");
			scanf("%d", &lib[i].total);
			lib[i].store = lib[i].total;
			printf("修改图书信息成功\n");
		}
		else if(i==count)  printf("\n没有找到相关信息\n");
	}
}

void delete_book(struct book* lib, int* count)
{
	int i, num;
	system("cls");
	page_title("删除图书");
	printf("输入所要删除的书的id:");
	scanf("%d", &num);
	for (i = 0; i <*count ; i++)
	{
		if (lib[i].id==num)
		{
				memmove(&lib[i], &lib[i + 1], (*count - i - 1) * sizeof(struct book));
				(*count)--;
				printf("删除成功!\n");
				break;
		}
		else {
			printf("未找到相关记录\n");
			break;   }
	}
	
}

//借书 
void borrow_book(struct book* lib, int count)
{
	void page_title(char* menu_item);
	char name[30];
	int i,s,d;
	system("cls");
	page_title("借阅图书");
	printf("请输入要借阅的书籍名称:");
	scanf("%s", name);
	for (i = 0; i < count; ++i)
	{
		if (strcmp(name, lib[i].name) == 0)
		{
			if (i != -1 && lib[i].store > 0)
			{
				printf("借书证序号:");
				scanf("%d", &s);
				printf("输入可借天数:");
				scanf("%d", &d);
				lib[i].user[i] = s;
				lib[i].days[i] = d;
				lib[i].store--;
				printf("借阅成功!\n");
				printf("序号:%d\t  ", lib[i].id);
				printf("书名:%s\t  ", lib[i].name);
				printf("作者:%s\t  ", lib[i].author);
				printf("出版社:%s\t  ", lib[i].publish);
				printf("存数:%d\t", lib[i].store);
				printf("总数:%d\n", lib[i].total);

		    }
			else if (lib[i].store == 0)
			{
				printf("此书已经完全借完\n\n");
			}
	    }
		else if(i==count) {
			printf("抱歉,未找到匹配的书籍!\n");
			break;
		}
	}
}

//归还图书
void return_book(struct book* lib, int count)
{
	int i,s;
	char name[30];
	page_title("归还图书");
	printf("请输入要归还的书籍名称:");
	scanf("%s", name);
	for (i = 0; i < count; ++i)
	{
		if (strcmp(name, lib[i].name) == 0)
		{
			if (i != -1 && lib[i].store < lib[i].total)
			{
				printf("借阅图书证列表\n");
			    if (lib[i].user != 0)
				{
				  printf("[%d]--%d天\n", lib[i].user[i], lib[i].days[i]);
				}
				printf("输入借书证号:");
				scanf("%d", &s);
				if (lib[i].user[i] == s)
				{
				  lib[i].store++;
				  printf("归还成功\n");
				}
			}
			else if (i != -1 && lib[i].store == lib[i].total)
			{
				printf("全部归还\n");
			}
		}
	}
}
//将图书信息保存到文件中
void save_books(struct book* lib, int count, const char* file_name)
{
	FILE* fp = fopen(file_name, "wb");
	fwrite(&count, sizeof(int), 1, fp);
	fwrite(lib, sizeof(struct book), count, fp);
	fclose(fp);
}
//从文件中读取图书信息
int load_books(struct book* lib, int* count, const char* file_name)
{
	FILE* fp = fopen(file_name, "rb");
	if (fp == NULL) {
		printf("读取文件失败");
	}
	fread(count, sizeof(int), 1, fp);
	fread(lib, sizeof(struct book), *count, fp);
	fclose(fp);
	return 1;
}

void menu()
{
	page_title("开发者:林**\n操作选单");
	printf("用数字选择操作\n\n");
	printf("\t\t(1)图书信息录入\t\t(2)显示图书\n");
	printf("\t\t(3)查询图书信息\t\t(4)修改图书信息\n");
	printf("\t\t(5)删除图书\t\t(6)借阅图书\n");
	printf("\t\t(7)归还图书\t\t(8)退出系统\n");
	
}
int main()
{
	char Step = 'Y';
	int choice=0, count =0;
	struct book* lib = (struct book*)malloc(sizeof(struct book) * 100);
	load_books(lib, &count, file);
	
	do {
		menu();
		printf("请按数字键:\n");
		scanf("%d", &choice);
		switch (choice) {
		case 1:
			do {
				add_book(lib, &count);
				printf("输入(Y)继续添加图书 or 输入(N)结束添加:\n");
				scanf("%s", &Step);
			} while (Step != 'N');
		case 2:
			Show_books(lib, count);
			break;
		case 3:
			search_book(lib, count);
			break;
		case 4:
			modify_book(lib, count);
			break;
		case 5:
			delete_book(lib, &count);
			break;
		case 6:
			borrow_book(lib, count);
			break;
		case 7:
			return_book(lib, count);
			break;
		case 8:
			printf("感谢使用图书馆管理系统!\n");
			break;
		default:
			printf("请输入正确的选项!\n");
			break;
		}
	} while (choice != 8);
	save_books(lib, count, file);
	free(lib);
	return 0; 
}

以上内容参考文章:http://t.csdnimg.cn/wOwn7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SimonHey1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值