图书管理系统(C语言),功能齐全(增加,输出,更改,排序,查询,删除),以结构体为框架,以文件形式存储,非常详细

输入函数中关于文件的 FILE* pf = fopen("text.txt", "a");这一句,正常来说要新建一个文件的话写a是要报错的,但是我用的是VS2022,没有报错并且正常建立了一个新文件,后续用的时候还可以直接追加内容进文件里,我太懒了就没改,其他部分应该是没有问题的,大家自己写的时候可以用判断语句或者其他方法改正一下。本人小白,如有不正确的地方希望大佬指正,我在这里先行谢过。最重要的是文件,结构体,函数,qsort,指针等的结合,希望能帮大家解决一些问题吧(如果帮到你的话点个赞吧 求求了)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int j = 0;
struct Book
{
	int num[8];
	char name[20];
	int price[3];
	char author[20];
}arr[100];
//创建结构体及其变量数组

//输入函数:
void Insert(Book* arr)
{
	FILE* pf = fopen("text.txt", "a");
	int i = 0;
	while (1)
	{
		printf("请分别输入书号(数字8位) 书名(字符20位) 价格(数字3位) 作者(字符20位)\n");
		scanf("%d %s %d %s", &arr[j].num, arr[j].name, &arr[j].price, arr[j].author);
		j++;
		printf("如果继续输入1,结束输入2\n");
		scanf("%d", &i);
		if (i == 2)
		{
			break;
		}
	}
	if (pf != NULL)
	{
		for (i=0;i<j;i++)
		{
			fprintf(pf, "%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
		}
		fclose(pf);
	}
}

//输出函数:
void Put(Book* arr) 
{
	int i = 0;
	FILE* pf = fopen("text.txt", "r");
	if (pf != NULL) 
	{
		while (fscanf(pf, "%d %s %d %s\n", &arr[i].num, arr[i].name, &arr[i].price, arr[i].author) != EOF) 
		{
			printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
			i++;
		}
		fclose(pf);
		printf("\n");
	}
	else
	{
		printf("不存在该文件,列表为空,请按1输入图书信息\n");
		printf("\n");
	}
	if (i == 0)
	{
		printf("不存在该文件,列表为空,请按1输入图书信息\n");
		printf("\n");
	}
}

//应用qsort库函数时要用到的比较大小的函数:
//详情请自行查找qsort函数的使用方法,是一个很好用的库函数,建议学会
//按从小到大排列数字:
int A(const void* p1,const void*p2)
{
	return (*(int*)p1 - *(int*)p2);
}
//从大到小:        下面同理
int B(const void* p1, const void* p2)
{
	return (*(int*)p2 - *(int*)p1);
}
//按从小到大排列字符:
int C(const void* p1, const void* p2)
{
	return strcmp(((Book*)p1)->name, ((Book*)p2)->name);
}
int D(const void* p1, const void* p2)
{
	return strcmp(((Book*)p2)->name, ((Book*)p1)->name);
}
int E(const void* p1, const void* p2)
{
	return strcmp(((Book*)p1)->author, ((Book*)p2)->author);
}
int F(const void* p1, const void* p2)
{
	return strcmp(((Book*)p2)->author, ((Book*)p1)->author);
}

//将数组arr中的数据从小到大排列并输出,这个函数只是单纯为了查找什么的方便排序找到,才写的,可以不用太在意
void Sput(Book* arr, int n)
{
	int i = 0;
	qsort(arr, n, sizeof(arr[0]), A);
	for (i = 0; i < n; i++)
	{
		printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
	}
}

//按书号排序,剩下三个同理:
void Num(Book* arr,int m)
{
	printf("顺序输出按1,倒序输出按2\n");
	int i = 0;
	scanf("%d", &i);
	if (i == 1)
		qsort(arr, m, sizeof(arr[0]), A);
	else if (i == 2)
		qsort(arr, m, sizeof(arr[0]), B);
	for (i = 0; i < m; i++)
	{
		printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
	}
	printf("\n");
}
void Name(Book* arr,int m)
{
	printf("顺序输出按1,倒序输出按2\n");
	int i = 0;
	scanf("%d", &i);
	if (i == 1)
		qsort(arr, m, sizeof(arr[0]), C);
	else if (i == 2)
		qsort(arr, m, sizeof(arr[0]), D);
	for (i = 0; i < m; i++)
	{
		printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
	}
	printf("\n");
}
void Price(Book* arr,int m)
{
	printf("顺序输出按1,倒序输出按2\n");
	int i = 0;
	scanf("%d", &i);
	if (i == 1)
		qsort(arr, m, sizeof(arr[0]), A);
	else if (i == 2)
		qsort(arr, m, sizeof(arr[0]), B);
	for (i = 0; i < m; i++)
	{
		printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
	}
	printf("\n");
}
void Author(Book* arr,int m)
{
	printf("顺序输出按1,倒序输出按2\n");
	int i = 0;
	scanf("%d", &i);
	if (i == 1)
		qsort(arr, m, sizeof(arr[0]), E);
	else if (i == 2)
		qsort(arr, m, sizeof(arr[0]), F);
	for (i = 0; i < m; i++)
	{
		printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
	}
	printf("\n");
}

//给数据排序:
void Sort(Book* arr)
{
	int i = 0, n = 0;
	FILE* pf = fopen("text.txt", "r");
	if (pf != NULL)
	{
		while (fscanf(pf, "%d %s %d %s\n", &arr[i].num, arr[i].name, &arr[i].price, arr[i].author) != EOF)
		{
			i++;
		}
		fclose(pf);
	}
	if (*arr[0].num == 0)
	{
		printf("列表为空,请按1输入图书信息\n");
		printf("\n");
		return;
	}
	printf("*****************************************************\n");
	printf("****** 1.按书号排序图书 *** 2.按书名排序图书   ******\n");
	printf("****** 3.按价格排序图书 *** 4.按作者名排序图书 ******\n");
	printf("*****************************************************\n");
	scanf("%d", &n);
	switch (n)
	{
	case 1:Num(arr, i); break;
	case 2:Name(arr, i); break;
	case 3:Price(arr, i); break;
	case 4:Author(arr, i); break;
	}
}

//改变数据内容:
void Change(Book* arr)
{
	int n = 0;
	FILE* pf = fopen("text.txt", "r");
	if (pf != NULL)
	{
		while (fscanf(pf, "%d %s %d %s\n", &arr[n].num, arr[n].name, &arr[n].price, arr[n].author) != EOF)
		{
			n++;
		}
		fclose(pf);
	}
	Sput(arr,n);
	if (*arr[0].num == 0)
	{
		printf("列表为空,请按1输入图书信息\n");
		printf("\n");
		return;
	}
	printf("请问第几本图书需要修改?\n");
	int i = 0;
	scanf("%d", &i);
	if (i>n)
	{
		printf("找不到该图书\n");
		printf("\n");
		return;
	}
	printf("请分别输入书号(数字8位) 书名(字符20位) 价格(数字3位) 作者(字符20位)\n");
	scanf("%d %s %d %s", &arr[i-1].num, arr[i - 1].name, &arr[i - 1].price, arr[i - 1].author);
	pf = fopen("text.txt", "w");
	if (pf != NULL)
	{
		for (i = 0; i < n; i++)
		{
			fprintf(pf, "%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
		}
		fclose(pf);
	}
	printf("修改成功\n");
	printf("\n");
}

//按书号查询,以下同理:
void Find1(Book* arr,int m)
{
	int i = 0;
	int arr1[8];
	printf("请输入要查询的图书的书号:\n");
	scanf("%d", &arr1);
	int n = 0;
	for (i = 0; i < m; i++)
	{
		if (*arr[i].num != *arr1)
		{
			continue;
		}
		else
		{
			printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
			n++;
		}
	}
	if (i == m && n == 0)
	{
		printf("找不到该图书\n");
		printf("\n");
	}
}
void Find2(Book* arr, int m)
{
	int i = 0, n = 0;
	char arr2[20];
	printf("请输入要查询的图书的书名:\n");
	scanf("%s", arr2);
	for (i = 0; i < m; i++)
	{
		if (*arr[i].name != *arr2)
		{
			continue;
		}
		else
		{
			printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
			n++;
		}
	}
	if (i == m && n == 0)
	{
		printf("找不到该图书\n");
		printf("\n");
	}
}
void Find3(Book* arr, int m)
{
	int i = 0, n = 0;
	int arr3[3];
	printf("请输入要查询的图书的价格:\n");
	scanf("%d", &arr3);
	for (i = 0; i < m; i++)
	{
		if (*arr[i].price != *arr3)
		{
			continue;
		}
		else
		{
			printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
			n++;
		}
	}
	if (i == m && n == 0)
	{
		printf("找不到该图书\n");
		printf("\n");
	}
}
void Find4(Book* arr, int m)
{
	int i = 0, n = 0;
	char arr4[20];
	printf("请输入要查询的图书的作者:\n");
	scanf("%s", arr4);
	for (i = 0; i < m; i++)
	{
		if (*arr[i].author != *arr4)
		{
			continue;
		}
		else
		{
			printf("%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
			n++;
		}
	}
	if (i == m && n == 0)
	{
		printf("找不到该图书\n");
		printf("\n");
	}
}

//查找图书:
void Find(Book* arr)
{
	int i = 0, n = 0;
	FILE* pf = fopen("text.txt", "r");
	if (pf != NULL)
	{
		while (fscanf(pf, "%d %s %d %s\n", &arr[i].num, arr[i].name, &arr[i].price, arr[i].author) != EOF)
		{
			i++;
		}
		fclose(pf);
	}
	if (*arr[0].num == 0)
	{
		printf("列表为空,请按1输入图书信息\n");
		printf("\n");
		return;
	}
	printf("*****************************************************\n");
	printf("******  1.按书号查询图书 *** 2.按书名查询图书  ******\n");
	printf("******  3.按价格查询图书 *** 4.按作者查询图书  ******\n");
	printf("*****************************************************\n");
	scanf("%d", &n);
	switch (n)
	{
	case 1:Find1(arr,i); break;
	case 2:Find2(arr,i); break;
	case 3:Find3(arr,i); break;
	case 4:Find4(arr,i); break;
	}
}

//删除图书:
void Delete(Book* arr)
{
	int n = 0;
	FILE* pf = fopen("text.txt", "r");
	if (pf != NULL)
	{
		while (fscanf(pf, "%d %s %d %s\n", &arr[n].num, arr[n].name, &arr[n].price, arr[n].author) != EOF)
		{
			n++;
		}
		fclose(pf);
	}
	Sput(arr, n);
	if (*arr[0].num == 0)
	{
		printf("列表为空,请按1输入图书信息\n");
		printf("\n");
		return;
	}
	printf("请问第几本图书需要删除?\n");
	int i = 0, m = 0;
	scanf("%d", &m);
	pf = fopen("text.txt", "w");
	if (pf != NULL)
	{
		for (i = 0; i < n; i++)
		{
			if (i == m-1)
			{
				continue;
			}
			fprintf(pf, "%d %s %d %s\n", *arr[i].num, arr[i].name, *arr[i].price, arr[i].author);
		}
		fclose(pf);
	}
	if (m > n)
	{
		printf("找不到该图书\n");
		printf("\n");
		return;
	}
	printf("删除成功\n");
	printf("\n");
}
int main()
{
	arr[100] = { 0 };
	while (1)
	{
		printf("***************************************************\n");
		printf("******  1.输入图书信息  ***  2.输出图书信息  ******\n");
		printf("******  3.修改图书信息  ***  4.排序图书信息  ******\n");
		printf("******  5.查询图书信息  ***  6.删除图书信息  ******\n");
		printf("******             0.退出程序                ******\n");
		printf("***************************************************\n");
		int n = 0, i = 0;
		scanf("%d", &n);
		switch (n)
		{
		case 1:Insert(arr); break;
		case 2:Put(arr); break;
		case 3:Change(arr); break;
		case 4:Sort(arr); break;
		case 5:Find(arr); break;
		case 6:Delete(arr); break;
		}
		if (n == 0)
			break;
	}
	return 0;
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值