个人书籍管理系统的编写、制作与实现(C语言)

本文介绍了一个C++编写的个人书籍管理系统,该系统包括录入、保存、浏览、查询、增加、删除、修改、统计和排序等功能。通过结构体数组和文本文件进行数据交互,具有启动和关闭动画,增强了用户体验。程序在处理用户输入时增加了错误检测和鲁棒性,确保了数据的一致性和完整性。
摘要由CSDN通过智能技术生成

仅供课外学习使用,任何个人与机构不得利用此文章进行任何形式的作弊。

C++版本:顺序、链式结构的个人书籍管理系统(C++)_CresCent_Charlot的博客-CSDN博客

github地址:BFU-CS_CourseDesign/BookManagementSystem/C at main · CCCP-lus/BFU-CS_CourseDesign (github.com)

项目要求:

代码实现:

设计思路:

该系统中,每本书作为元素,携带有序号、书名、作者、出版社、分类五个信息。根据常识,将序号定义为唯一关键字,而分类则可以作为预设信息将范围缩小至有穷。因此该程序中定义了书籍信息结构体,并将结构体数组作为书库的程序载体,其中除“分类”为枚举变量以外,均为字符串类型。

文件存储采用文本文件,文本中需要存储每本书的五个信息,同时文件内容也按照一定的格式排列,以方便程序读写。

程序的主要功能是实现:1.录入书籍信息2.保存书籍信息3.浏览书籍信息4.查询书籍信息5.增加书籍信息6.删除书籍信息7.修改书籍信息8.按类别统计书籍数量9.按书名对书籍进行排序10.退出,共计十个功能

实现过程:

该程序在实现上述十个功能的基础上,增加了启动动画与关机动画以增加观赏性。同时为了加强用户体验,对于个别功能也增加了最低要求之上的功能。为了加强程序鲁棒性,对于每一次操作都增加了防错误输入机制。具体原理是在判断字符合法性之后采用fflush函数清空缓存区,防止对下一步造成影响。

自定义结构体与函数一览:

实现主体功能的函数需要两个形式参数,统一命名为结构体指针p和表示书籍数目的整形指针q。put1函数的形式参数为要输出的字符串。其余函数无形参。

主函数:该程序主函数承载的作用分为三部分:初始化程序与数据、判定违法输入与控制函数循环、实现子函数调用

启动动画:采用自定义Opening函数实现,该函数无输入,输出内容为更改程序颜色并模拟程序载入动效。该函数的目的在于增强程序观赏性。

自定义格式输出:采用自定义put1函数实现,该函数输入为一个长度小于25的字符串,输出一个对齐后的字符串。其作用是根据预设的格式对其输出的数据,保证数据在用户界面的规范整齐性。

本程序对于信息的一切操作均借助修改程序内部的结构体数组中内容实现,然后通过对文本内容的更新实现信息的操作。因此包含下述两个自定义函数和一个宏定义:

文本读入结构体数组:采用自定义Inn函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是将文本文件中的有效内容读入结构体数组中,完成初始化以等待后续操作。该函数同时还是统计书籍数量的唯一函数,利用指针将书籍数量传递给主函数中表示书籍数量的变量。这种设定可以确保数量的正确性。同时也设置有判定文件无法打开的操作。

结构体数组输出文本:采用自定义Out函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是将旧的文本内容用新的空白同名文件代替,并将操作后结构体数组中内容输出至其中。同时也设置有判定文件无法打开的操作。

默认路径:定义同名文件夹下base.txt为默认路径文件

载入目录:通过自定义Menu函数实现,该函数无输入,输出菜单界面,其作用是供用户直观地选择程序功能。

1.录入书籍信息:采用自定义Step1函数实现,内部嵌套Inn函数,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是基础功能是录入默认路径文本内容,进阶的功能是录入指定路径的文本内容。同时也设置有判定文件无法打开的操作、判定关键字序号是否重合的查重操作、防止用户错误输入的体现鲁棒性的操作。

2.保存书籍信息:采用自定义Step2函数实现,内部嵌套Out函数,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是基础功能是输出内容到默认路径文本中,进阶的功能是输出内容到指定路径文本中。同时也设置有判定文件无法打开的操作、防止用户错误输入的体现鲁棒性的操作。操作成功会显示“保存成功”,若找不到指定路径的文件会显示“无法打开X处文件”并返回。

3.浏览书籍信息:采用自定义Step3函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是内置插入排序算法,按照序号升序排列书籍信息,利用put1函数按格式打印信息。若无信息则显示“暂无数据”

4.查询书籍信息:采用自定义Step4函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是可以分别根据序号、书名、作者、出版社、类别进行查询并显示结果。嵌套put1函数。

5.增加书籍信息:采用自定义Step5函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是提示用户按一定格式输入要增加的书籍信息,并设置有针对序号的查重,如果查重不通过则返回重新输入。增加操作可在内存允许的条件下自动重复该流程直至人为退出。增加结束后自动保存信息

6.删除书籍信息:采用自定义Step6函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是首先调用查询以帮助用户确定要删除的书籍信息,查询会显示查询结果。然后进行功能选择:仍需检索请输入0、不需要则输入要删除的书籍序号、任意键取消删除。删除结束后自动保存信息

7.修改书籍信息:采用自定义Step7函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是先调用查询以帮助用户确定要删除的书籍信息,查询会显示查询结果。然后进行要修改内容的选择。修改结束后自动保存信息

8.按类别统计书籍数量:采用自定义Step8函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是功能分二级。一级功能内置桶排序算法,显示统计数据一览表,二级功能展示用户选择分类下的书籍详细信息

9.按书名对书籍进行排序:采用自定义Step9函数实现,该函数输入为结构体指针p和表示书籍数目的整形指针q。其作用是内置插入排序算法,实现按书名对书籍的升序显示,同名书籍按序号进行升序显示

10.退出:操作置于主函数中。提示用户确认操作以后退出循环并调用Closing函数。

关闭动画:采用自定义Closing函数实现,发表作者致谢。

代码实例:

(这是作者学了三个月C写出来的第一个作品,大家看着图个乐,然后请各位大牛轻喷)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <windows.h>
//一堆头文件 
#define FILE_NAME "base.txt"
//定义默认文件路径 
enum Class 
{
	Professional = 1, Reference, Reports, Novels, Others
};
//初始化枚举 
struct Book
{
	char number[25];//序号 
	char name[25];//书名 
	char writer[25];//作者 
	char press[25];//出版社 
	enum Class clas;//分类 
};
//书籍信息结构体 
void Menu() 
{
	printf("*************欢迎使用个人书籍管理系统************\n");
	printf("-------------------------------------------------\n");
	printf("-----------------1.录入书籍信息------------------\n\n");
	printf("-----------------2.保存书籍信息------------------\n\n");
	printf("-----------------3.浏览书籍信息------------------\n\n");
	printf("-----------------4.查询书籍信息------------------\n\n");
	printf("-----------------5.增加书籍信息------------------\n\n");
	printf("-----------------6.删除书籍信息------------------\n\n");
	printf("-----------------7.修改书籍信息------------------\n\n");
	printf("-----------------8.按类别统计书籍数量------------\n\n");
	printf("-----------------9.按书名对书籍进行排序----------\n\n");
	printf("-----------------10.退出-------------------------\n");
	printf("-------------------------------------------------\n");
	printf("********************谢谢使用*********************\n\n");
}
//自定义目录函数
void Opening()
{
	system("color 0a");//黑客帝国配色 
	int i;
	printf("天e阁个人书籍管理系统正在加载中,请稍后......\n\n");
	printf("制作不易请多多支持^_^\n\n");
	for(i = 0; i < 25; i++)
	{
		printf("/");
		Sleep(100);
		if(i >18) Sleep(200);
	}
	Sleep(2000);
	printf("/\n");
	Sleep(1000);
	printf("加载完毕\n");
	Sleep(2000);
	system("cls"); 
}
//启动动画
void Closing()
{
	//偶尔也需要抖一下机灵 
	Sleep(1000);
	system("cls");
	printf("程序到这里就结束啦\n");
	Sleep(1000);
	printf("感谢\n");
	Sleep(500);
	printf("我的女朋友");
	Sleep(500);
	printf("对我的帮助与支持!\n");
	Sleep(1000);
	printf("因为......\n");
	Sleep(2000);
	printf("在我18年的生命中她从未出现过\n");
	printf("所以我才可以专心学习...");
	Sleep(2000);
} 
//关机动画 
void put1(const char* string)
{
	int a = strlen(string), i;
	while (*string)
		putchar(*string++);
	for (i = 0; i < 10 - a; i++)
		printf(" ");
	//其作用是根据格式对齐输出 
}
//自定义输出方式
void Inn(struct Book *p, int *q)
{
	FILE* fp;
	fp = fopen(FILE_NAME, "a+");
	if (fp == NULL)//考虑文件无法打开的情况 
	{
		printf("无法打开%s\n", FILE_NAME);
	}
	int i;
	char asd[2] = {'\0'};//判定非空时使用,后续会多次使用同名结构 
	*q = 0;
	for(i = 0; i < 2000; i++)
	{
		fscanf(fp, "%s", (*(p + i)).number);
		fscanf(fp, "%s", (*(p + i)).name);
		fscanf(fp, "%s", (*(p + i)).writer);
		fscanf(fp, "%s", (*(p + i)).press);
		fscanf(fp, "%u", &(*(p + i)).clas);
		if(strcmp((*(p + i)).number, asd) != 0)//非空判定
			(*q)++; //标记书籍数量 
	}
	fclose(fp);
}
//将文本内容装入结构体数组
void Out(struct Book *p, int *q)
{
	char asd[2] = {'\0'};
	remove(FILE_NAME);
	//移除旧文本替换为新文本 
	FILE *fp;
	fp = fopen(FILE_NAME, "a+");
	if (fp == NULL)//考虑文件无法打开的情况 
	{
		printf("无法打开%s,请检查后重试\n", FILE_NAME);
		goto loop;
	}
	int i;
	for(i = 0; i < (*q); i++)
	{
		if(strcmp((*(p + i)).number, asd) != 0)
		{
			fprintf(fp, "%-6s\t", (*(p + i)).number);
			fprintf(fp, "%-25s\t", (*(p + i)).name);
			fprintf(fp, "%-25s\t", (*(p + i)).writer);
			fprintf(fp, "%-25s\t", (*(p + i)).press);
			fprintf(fp, "%-25u\t\n", (*(p + i)).clas);
		}
	}
	fclose(fp);
	printf("正在为您保存...");
	for(i = 0; i < 3; i++)
	{
		Sleep(500);
		printf(".");
	}
	Sleep(500);
loop:
	printf("\n操作完毕!\n");
}
//将结构体数组内容保存至默认路径文本
void Step1(struct Book *p, int *q) 
{
	printf("-----------------1.录入书籍信息------------------\n");
	Sleep(1000);
	char x; int flag = 0, i;
	getchar(); 
loop:
	printf("请选择:1.录入默认路径 2.录入指定路径\n");
	x = getchar();
	fflush(stdin);//清空输入缓存区 
	if(x == '1')
	{
		Inn(p, q);
		flag = 1;
	}
	else if(x == '2')
	{
		printf("请输入录入文件的路径:\n");
		FILE *fp;
		char z[100] = {'\0'};
		gets(z);
		fp = fopen(z, "a+");
		if (fp == NULL)//考虑文件无法打开的情况 
		{
			printf("无法打开%s处的文件\n", z);
			goto loop1;
		}
		char asd[2] = {'\0'};
		*q = 0;
		for(i = 0; i < 2000; i++)
		{
			fscanf(fp, "%s", (*(p + i)).number);
			fscanf(fp, "%s", (*(p + i)).name);
			fscanf(fp, "%s", (*(p + i)).writer);
			fscanf(fp, "%s", (*(p + i)).press);
			fscanf(fp, "%u", &(*(p + i)).clas);
			if(strcmp((*(p + i)).number, asd) != 0)//非空判定
				(*q)++; //标记书籍数量 
		}
		fclose(fp);
		flag = 1;		
	}
	if(flag != 1)
	{
		printf("无效数据,请重新输入:\n");
		goto loop;
	}
	printf("正在为您录入...");
	for(i = 0; i < 3; i++)
	{
		Sleep(500);
		printf(".");
	}
	Sleep(500);
loop1:
	printf("\n操作完毕!\n");
}
//录入书籍信息
void Step2(struct Book *p, int *q)
{
	printf("-----------------2.保存书籍信息------------------\n");
	Sleep(1000);
	char x; int flag = 0, i;
	getchar();
loop:
	printf("请选择:1.保存至默认路径 2.保存至指定路径\n");
	x = getchar();
	fflush(stdin);//清空输入缓存区 
	if(x == '1')
	{
		Out(p, q);
		flag = 1;
	}
	else if(x == '2')
	{
		printf("请输入保存文件的路径:\n");
		FILE *fp;
		char z[500] = {'\0'};
		gets(z);
		remove(z);
		fp = fopen(z, "a+");
		if (fp == NULL)//考虑文件无法打开的情况 
		{
			printf("无法打开%s处的文件\n", z);
			goto loop;
		}
		char asd[2] = {'\0'};
		for(i = 0; i < (*q); i++)
		{
			if(strcmp((*(p + i)).number, asd) != 0)
			{
				fprintf(fp, "%-6s\t", (*(p + i)).number);
				fprintf(fp, "%-25s\t", (*(p + i)).name);
				fprintf(fp, "%-25s\t", (*(p + i)).writer);
				fprintf(fp, "%-25s\t", (*(p + i)).press);
				fprintf(fp, "%-25u\t\n", (*(p + i)).clas);
			}
		}
		printf("正在为您保存...");
		for(i = 0; i < 3; i++)
		{
			Sleep(500);
			printf(".");
		}
		Sleep(500);
		printf("\n操作完毕!\n");
		fclose(fp);
		flag = 1;		
	}
	if(flag != 1)
	{
		printf("无效数据,请重新输入:\n");
		goto loop;
	}
}
//保存书籍信息 
void Step3(struct Book *p, int *q)
{
	printf("-----------------3.浏览书籍信息------------------\n");
	Sleep(1000);
	printf("第X   本书:\t序号\t书名\t\t作者\t\t出版社\t\t分类\n"); 
	int i, j, k, flag = 0;//flag用于标记书库是否为空
	struct Book t;
	char asd[2] = {'\0'};
	for(i = 0; i < (*q); i++)
	{
		k = i;
		for(j = i + 1; j < (*q); j++)
			if(strcmp((*(p + k)).number, (*(p + j)).number) > 0) 
			//编号升序排列 
				k = j;
		if(k != i)
		{
			t = (*(p + i));
			(*(p + i)) = (*(p + k));
			(*(p + k)) = t;
		}
	}	
	for(i = 0; i < (*q); i++)
	{
		if(strcmp((*(p + i)).number, asd) != 0)
		{
			printf("第%-4d本书:\t", i + 1);
			printf("%-6s\t", (*(p + i)).number);
			put1((*(p + i)).name); printf("\t");
			put1((*(p + i)).writer); printf("\t");
			put1((*(p + i)).press); printf("\t");
			switch ((*(p + i)).clas) 
			{
				case 1:
					printf("Professional");
					break;
				case 2:
					printf("Reference");
					break;
				case 3:
					printf("Reports");
					break;
				case 4:
					printf("Novels");
					break;
				case 5:
					printf("Others");
					break;
			}
			printf("\n");
			flag = 1; 
		}
	} 
	if(flag == 0) printf("暂无数据\n");
	else printf("共%d本书\n", (*q));
}
//浏览书籍信息 
void Step4(struct Book *p, int *q)
{
	printf("-----------------4.查询书籍信息------------------\n");
	Sleep(1000);
	printf("请按下对应按键选择查询类别:\n1 序号  2 书名  3 作者  4 出版社  5 分类\n");
	int i, n, flag1 = 0; 
	char asd[2] = {'\0'};
	char x[25];
	scanf("%d", &n);//对应查询, 并采取了防止错误输入的措施
	switch(n)
	{
		case 1:
			printf("请输入查询序号:\n");
			getchar();
			gets(x);
			for(i = 0; i < (*q); i++)
			{
				if(strcmp((*(p + i)).number, x) == 0)
				{ 
					printf("%-6s\t", (*(p + i)).number);
					put1((*(p + i)).name); printf("\t");
					put1((*(p + i)).writer); printf("\t");
					put1((*(p + i)).press); printf("\t");
					switch ((*(p + i)).clas) 
					{
						case 1:
							printf("Professional");
							break;
						case 2:
							printf("Reference");
							break;
						case 3:
							printf("Reports");
							break;
						case 4:
							printf("Novels");
							break;
						case 5:
							printf("Others");
							break;
					}
					printf("\n");
					flag1 = 1;
				}
			}
			if(flag1 == 0) printf("共查询到   0个结果\n");
			else printf("共查询到   1个结果\n");
			//序号为唯一标识 
			break;
		case 2:
			printf("请输入查询书名:\n");
			getchar();
			gets(x);
			int num2 = 0;
			for(i = 0; i < (*q); i++)
			{
				if(strcmp((*(p + i)).number, asd) != 0 && strcmp(x, (*(p + i)).name) == 0)
				{
					printf("%-6s\t", (*(p + i)).number);
					put1((*(p + i)).name); printf("\t");
					put1((*(p + i)).writer); printf("\t");
					put1((*(p + i)).press); printf("\t");
					switch ((*(p + i)).clas) 
					{
						case 1:
							printf("Professional");
							break;
						case 2:
							printf("Reference");
							break;
						case 3:
							printf("Reports");
							break;
						case 4:
							printf("Novels");
							break;
						case 5:
							printf("Others");
							break;
					}
					printf("\n");
					num2++;
				}
			}
			if(num2 == 0) printf("共查询到   0个结果\n");
			else printf("共查询到%4d个结果\n", num2);
			break;
		case 3:
			printf("请输入查询作者:\n");
			getchar();
			gets(x);
			int num3 = 0;
			for(i = 0; i < (*q); i++)
			{
				if(strcmp((*(p + i)).number, asd) != 0 && strcmp(x, (*(p + i)).writer) == 0)
				{
					printf("%-6s\t", (*(p + i)).number);
					put1((*(p + i)).name); printf("\t");
					put1((*(p + i)).writer); printf("\t");
					put1((*(p + i)).press); printf("\t");
					switch ((*(p + i)).clas) 
					{
						case 1:
							printf("Professional");
							break;
						case 2:
							printf("Reference");
							break;
						case 3:
							printf("Reports");
							break;
						case 4:
							printf("Novels");
							break;
						case 5:
							printf("Others");
							break;
					} 
					printf("\n");
					num3++;
				}
			}
			if(num3 == 0) printf("共查询到   0个结果\n");
			else printf("共查询到%4d个结果\n", num3);
			break;
		case 4:
			printf("请输入查询出版社:\n");
			getchar();
			gets(x);
			int num4 = 0;
			for(i = 0; i < (*q); i++)
			{
				if(strcmp((*(p + i)).number, asd) != 0 && strcmp(x, (*(p + i)).press) == 0)
				{
					printf("%-6s\t", (*(p + i)).number);
					put1((*(p + i)).name); printf("\t");
					put1((*(p + i)).writer); printf("\t");
					put1((*(p + i)).press); printf("\t");
					switch ((*(p + i)).clas) 
					{
						case 1:
							printf("Professional");
							break;
						case 2:
							printf("Reference");
							break;
						case 3:
							printf("Reports");
							break;
						case 4:
							printf("Novels");
							break;
						case 5:
							printf("Others");
							break;
					}
					printf("\n");
					num4++;
				}
			}
			if(num4 == 0) printf("共查询到   0个结果\n");
			else printf("共查询到%4d个结果\n", num4);
			break;
		case 5:
			printf("请输入查询分类:\n");
			printf("1.Professional 2.Reference 3.Reports 4.Novels 5.Others\n");
			unsigned int xx; 
			scanf("%u", &xx);
			int num5 = 0;
			for(i = 0; i < (*q); i++)
			{
				if(strcmp((*(p + i)).number, asd) != 0 && (*(p + i)).clas == xx)
				{
					printf("%-6s\t", (*(p + i)).number);
					put1((*(p + i)).name); printf("\t");
					put1((*(p + i)).writer); printf("\t");
					put1((*(p + i)).press); printf("\t");
					switch ((*(p + i)).clas) 
					{
						case 1:
							printf("Professional");
							break;
						case 2:
							printf("Reference");
							break;
						case 3:
							printf("Reports");
							break;
						case 4:
							printf("Novels");
							break;
						case 5:
							printf("Others");
							break;
					}					
					printf("\n");
					num5++;
				}
			}
			if(num5 == 0) printf("共查询到   0个结果\n");
			else printf("共查询到%4d个结果\n", num5);
			break;
	}	
}
//查询书籍信息 
void Step5(struct Book *p, int *q)
{
	printf("-----------------5.增加书籍信息------------------\n");
	Sleep(1000);
	printf("请按以下格式输入书籍信息\n");
	int i, j, k, num = 0;//num统计数量 
	char asd[2] = {'\0'};
	for(i = 0; i < 2000; i++)
	{
		while(strcmp((*(p + i)).number, asd) != 0) i++;//遍历数组寻找空位增加数据 
		loop:
		printf("请注意! 本程序不支持空格,请使用_代替空格!\n\n");
		Sleep(1000);		
		printf("请输入一个不超过6位的首位为正值的书籍序号,输入0结束:\n");
		scanf("%s", (*(p + i)).number);
		char dsa[2] = {'0'};
		if(strcmp((*(p + i)).number, dsa) == 0)
		{
			for(k = 0; k < 6; k++)
				(*(p + i)).number[k] = '\0';//无效数据,归零 
			Sleep(1000);
			printf("结束,本次已增加%d本书\n请不要忘记保存\n", num);
			break;
		}
		for(j = 0; j < 2000; j++)
		{
			if(strcmp((*(p + i)).number, (*(p + j)).number) == 0 && i != j)//判定是否已经拥有该书 
			{
				Sleep(1000);
				printf("本次已增加该书,不必重复增加\n");
				for(k = 0; k < 6; k++)
					(*(p + i)).number[k] = '\0';//无效数据,归零 
				goto loop;
			}
		}
		printf("请输入书名:\n");
		getchar();
		gets((*(p + i)).name);
		printf("请输入作者:\n");
		gets((*(p + i)).writer);
		printf("请输入出版社:\n");
		gets((*(p + i)).press);
		printf("请输入类别:\n");
		scanf("%u",&(*(p + i)).clas);
		num++;
		Sleep(500);
		printf("输入完毕,本次已增加%d本书\n\n", num);
		(*q)++;
	}	
	Out(p, q);	
}
//增加书籍信息 
void Step6(struct Book *p, int *q)
{
	printf("-----------------6.删除书籍信息------------------\n");
	Sleep(1000);
	printf("请根据序号查找需要修改的书籍信息\n");
loop:
	printf("正在调用查询\n");
	Sleep(1000);
	Step4(p, q);
	printf("仍需检索请输入0,不需要则输入要删除的书籍序号,任意键取消删除:\n");
	int i, k, flag = 0; 
	char n[25];
	gets(n);
	char dsa[2] = {'0'};
	if(strcmp(n, dsa) == 0) goto loop;
	for(i = 0; i < 2000; i++)
		if(strcmp((*(p + i)).number, n) == 0)
			{
				for(k = 0; k < 25; k++)
				{
					(*(p + i)).name[k] = '\0';
					(*(p + i)).writer[k] = '\0';
					(*(p + i)).press[k] = '\0';
				}
				for(k = 0; k < 6; k++)
					(*(p + i)).number[k] = '\0';
				(*(p + i)).clas = 0;
			flag = 1;
			break;
			}
	Sleep(1000);
	if(flag == 1) printf("删除成功, 请不要忘记保存\n");
	else printf("未检索到书籍信息,为您返回\n");
	Out(p, q);
}
//删除书籍信息 
void Step7(struct Book *p, int *q)
{
	printf("-----------------7.修改书籍信息------------------\n");
	Sleep(1000);
	printf("请根据序号查找需要修改内容的书籍信息\n");
loop:
	printf("正在调用查询\n");
	Sleep(1000);
	Step4(p, q);
	printf("仍需检索请输入0,不需要则输入要修改内容的书籍序号:\n");	
	int i; 
	char n[25];
	gets(n);
	char dsa[2] = {'0'};
	if(strcmp(n, dsa) == 0) goto loop;
	for(i = 0; i < 2000; i++)
		if(strcmp((*(p + i)).number, n) == 0)
		{
			printf("请输入要修改的信息:\n");
			printf("1.书名 2.作者 3.出版社 4.类别 任意键.取消\n");
			fflush(stdin);
			int w; scanf("%d", &w);
			switch (w) 
			{
				case 1:
					printf("请输入书名:\n");
					gets((*(p + i)).name);					
					break;
				case 2:
					printf("请输入作者:\n");
					gets((*(p + i)).writer);
					break;
				case 3:
					printf("请输入出版社:\n");
					gets((*(p + i)).press);			
					break;
				case 4:
					printf("请输入类别:\n");
					scanf("%u", &(*(p + i)).clas);
					break;			
				default:
					printf("操作已取消\n");
					break;
			}
			Sleep(1000);
			printf("操作完毕, 请不要忘记保存\n");
			break; 
		}	
	Out(p, q);
}
//修改书籍信息
void Step8(struct Book *p, int *q)
{
	printf("-----------------8.按类别统计书籍数量---------------\n");
	Sleep(1000);
	printf("你可以输入对应数字查看相关情况,任意键返回:\n");
	int i, aa[6] = {0};
	for(i = 0; i < (*q); i++)
	{
		if((*(p + i)).clas == 1) aa[1]++; 
		if((*(p + i)).clas == 2) aa[2]++; 
		if((*(p + i)).clas == 3) aa[3]++; 
		if((*(p + i)).clas == 4) aa[4]++; 
		if((*(p + i)).clas == 5) aa[5]++; 
	}
	//桶排实现计数 
	printf("统计数据如下:\n");
	Sleep(1000);
	printf("1.Professional: %d\n2.Reference: %d\n", aa[1], aa[2]);
	printf("3.Reports: %d\n4.Novels: %d\n5.Others: %d\n\n", aa[3], aa[4], aa[5]);
	Sleep(1000);
	char asd[2] = {'\0'};
	unsigned int xxxxx; 
	scanf("%u", &xxxxx);
	int num5 = 0;
	for(i = 0; i < (*q); i++)
	{
		if(strcmp((*(p + i)).number, asd) != 0 && (*(p + i)).clas == xxxxx)
		{
			printf("%-6s\t", (*(p + i)).number);
			put1((*(p + i)).name); printf("\t");
			put1((*(p + i)).writer); printf("\t");
			put1((*(p + i)).press); printf("\t");
			switch ((*(p + i)).clas) 
			{
				case 1:
					printf("Professional");
					break;
				case 2:
					printf("Reference");
					break;
				case 3:
					printf("Reports");
					break;
				case 4:
					printf("Novels");
					break;
				case 5:
					printf("Others");
					break;
			}					
			printf("\n");
			num5++;
		}
	}
	if(num5 == 0) printf("正在返回...\n");
	else printf("共%4d条信息\n", num5);
}
//按类别统计书籍的数量
void Step9(struct Book *p, int *q)
{
	printf("-----------------9.按书名对书籍进行排序--------------\n");	
	Sleep(1000); 
	int i, j, k;
	struct Book t;
	char asd[2] = {'\0'};
	for(i = 0; i < (*q); i++)
	{
		k = i;
		for(j = i + 1; j < (*q); j++)
			if(strcmp((*(p + k)).number, (*(p + j)).number) > 0) 
			//编号升序排列 
				k = j;
		if(k != i)
		{
			t = (*(p + i));
			(*(p + i)) = (*(p + k));
			(*(p + k)) = t;
		}
	}		
	for(i = 0; i < (*q); i++)
	{
		k = i;
		for(j = i + 1; j < (*q); j++)	
			if(strcmp((*(p + k)).name, (*(p + j)).name) > 0) 
			//字典序升序排列 
				k = j;		
		if(k != i)
		{
			t = (*(p + i));
			(*(p + i)) = (*(p + k));
			(*(p + k)) = t;
		}
	}
	//考虑到追加数据,此处选插入排序更好 
	printf("序号\t书名\t\t作者\t\t出版社\t\t分类\n");
	int flag = 0; //flag标记有无书籍 
	for(i = 0; i < (*q); i++)
	{
		if(strcmp((*(p + i)).number, asd) != 0)
		{
			printf("%-6s\t", (*(p + i)).number);
			put1((*(p + i)).name); printf("\t");
			put1((*(p + i)).writer); printf("\t");
			put1((*(p + i)).press); printf("\t");
			switch ((*(p + i)).clas) 
			{
				case 1:
					printf("Professional");
					break;
				case 2:
					printf("Reference");
					break;
				case 3:
					printf("Reports");
					break;
				case 4:
					printf("Novels");
					break;
				case 5:
					printf("Others");
					break;
			} 
			printf("\n");
			flag = 1;
		}
	}
	if(flag == 0) printf("暂无数据\n");
	else printf("共%d本书\n", (*q));
} 
//按书名对书籍进行排序
int main()
{
	Opening(); //启动动画 
	struct Book ss[2000];//书籍结构体数组 
	memset(ss, 0, sizeof(ss));//调用memset方便后续操作 
	struct Book *p = ss;//结构体指针 
	int n; 
	int v = 0; int *q = &v;//以v表示书籍数量并创建指针 
	printf("首次操作请先录入数据\n");
	
	//以上部分用于初始化程序与数据 
	
loop0:	//完成循环 
	printf("\n");
	Sleep(2000);
	Menu();//调用菜单
	p = ss;
	fflush(stdin); //清空输入缓存区
	fflush(stdout);//清空输出缓存区
	Sleep(1000);
	printf("请选择 1-10:____\b\b\b"); 
	scanf("%d", &n);
	if (n < 1 || n > 10) 
		{
			Sleep(1000); 
			system("cls");
			printf("警告!无效的数据!请重新输入...\n");
			goto loop0;
		} 
	
	//以上部分防止输入不合法数据造成多次循环判定 
	
	system("cls");//清屏以美化程序 
	switch (n) //功能选择模块 
	{
		case 1:
			Step1(p, q); 
			n = 0;//防止旧数据造成影响 
			goto loop0;//loop实现连续的操作 
			break;
		case 2:
			Step2(p, q);
			memset(ss, 0, sizeof(ss));
			//重新装填数据防止无效数据占位
			Inn(p, q);
			n = 0;
			goto loop0;
			break;
		case 3:
			Step3(p, q);
			n = 0;
			goto loop0;
			break;
		case 4:
			Step4(p, q);
			n = 0;
			goto loop0;
			break;
		case 5:
			Step5(p, q);
			n = 0;
			goto loop0;
			break;
		case 6:
			Step6(p, q);
			n = 0;
			goto loop0;
			break;
		case 7:
			Step7(p, q);
			n = 0;
			goto loop0;
			break;
		case 8:
			Step8(p, q);
			n = 0;
			goto loop0;
			break;	
		case 9:
			Step9(p, q);
			n = 0;
			goto loop0;
			break;	
		case 10:
			printf("-----------------10.退出-------------------------\n");
			Sleep(1000);
			printf("确定退出吗? 按0确定, 任意键取消\n");
			n = 0;
			int qaz; scanf("%d", &qaz);
			if (qaz == 0) Closing();
			else
			{
				getchar();
				goto loop0;
			}
			break;
			//退出功能在主函数中实现 
	}
	return 0;
}

系统中,读者创建账户,账户内存储读者个人的详细信息,读者可以凭借借书卡号:readerid在系统进行图书的查询、借阅、还书操作,完成借书的同时要修改相应图书信息的状态、读者信息中的已借数量、在借阅表中添加书籍、 读者信息管理:读者信息的修改 读者注销账户跳回首页 图书信息管理:包括图书信息添加 查询 修改功能。管理员登录成功后,可以浏览所有图书信息和搜索特定图书的信息---搜索出来的可以进行添加图书、删除图书以及修改图书信息。 图书借阅管理:包括图书借阅和归还功能。 图书借阅功能:先输入读者编号,然后输入要借阅图书的信息,记录系统当前时间即借阅时间borrowdate和归还时间returndate 图书归还功能:先输入读者编号,然后输入要还图书的信息,记录系统当前时间即归还时间returndate; 删除借阅信息,更改管理日志表whether 用户修改个人信息——实现功能 用户通过点击右上角用户名,跳转到个人页面,个人页面显示个人的详细信息,点击修改按钮跳转到修改页面,修改页面回显个人详细信息。修改后点击确定。 成功——弹出成功信息,跳回个人页面并更新列表 失败——弹出失败信息,跳回个人页面。 用户查询信息——实现功能 用户通过点击右上角用户名,跳到个人页面,个人页面显示个人的详细信息(只显示不修改) 三、功能需求 功能划分:该系统主要有以下功能:浏览功能,查询功能,添加功能,修改功能,删除功能。 功能描述详解:①浏览 列出当前数据库中的图书信息、读者信息、借阅信息和还书信息(管理员日志)、 ②查 按照图书编号进行查询书籍信息、读者编号进行查询读者信息、借还界面查询书目与读者匹配信息 ③增 添加图书和读者记录、 借书和还书记录(管理日志) ④改 修改书目和读者信息及管理员信息、 读者借阅和归还图书在管理员日志上的变动及在图书信息表上的变动 ⑤删 删除书目和读者信息及管理员信息 ⑥各种弹框制定 ⑦运用CSS对页面进行显示处理 ⑧网页布局采用封面型布局
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CresCent_Charles

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

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

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

打赏作者

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

抵扣说明:

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

余额充值