C语言实现图书管理系统(课设)

闲来无事,消磨时光。
我是一个电脑小白,这个程序在大佬面前不值一提,望谅解。
欢迎批评指正。

图书管理系统(课设)

编译器

Visual Studio 2019

语言

C语言

功能需求:

1.整体功能描述
对图书进行录入、查询、修改信息、删除注销、按图书编号排序等操作并进行管理。
2.开始界面
显示开始界面(即用户界面)。通过输入操作选项前的数字来进行对图书的相关操作及管理。
3.查看图书
可以查看图书信息,查询现有的图书。选择“查看图书”选项后,系统将显示已经录入的图书信息(图书名、编号、数量),若没有录入图书,则可以显示图书馆没有图书的提示。
4.录入图书
可以对图书进行保存。选择“录入图书”选项后,用户要按照提示输入图书名、图书编号、图书数量,若显示注册成功后,则代表录入图书操作完成,否则重新录入图书。
5.修改图书信息
可以返回开始页面进行图书相关问题的修改。选择“修改图书信息”选项后,可以显示已经录入的所有的图书信息,选择要修改信息的图书的编号,用户可以选择不同的选项对图书名、图书数量、图书编号等信息进行修改(也可放弃修改),同时可以询问用户是否确认对信息进行修改。
6.删除图书
可以删除图书。用户可以选择“删除图书”选项,并通过显示的所有图书的信息选择要注销的图书的编号,同时可以询问用户是否确认注销选择的图书。
7.图书排序
可以对图书按编号由小到大进行排序并显示。用户可以选择“图书排序”选项,界面可以显示排序结果并返回开始界面。但需要录入两本书才可实现图书排序功能,否则将提醒“排序的图书不存在”。
8.取消操作
退出系统。用户可以选择“取消操作”选项,退出系统。

初步设计

采用链表:因为是图书,所以是以Book为名的链表,然后通过一个无限循环作为开头达到管理图书的目的。循环里面有如下方法:保存新进入的图书、查询已经储存的图书、修改已经储存的图书、删除已经储存的图书、排序已经储存的图书。

详细设计:

1.开始界面
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)

typedef struct book {
	char* name;    //图书名称
	int id;    //图书编号
	int count;    //图书数量
	struct book* next;
}Book;
int a;    //选择操作方式
void error(char*);    //异常提醒
int usrmanager();
int viewbook();
int addbook();
int modbook();
int delbook();
int sortbook();
void printbook(Book*);    //打印图书信息
Book* lookup(char*, int);    //搜索图书
Book* head = NULL;    //动态链表
int nbook = 0;    //记录图书种类数量
int main() {
	while (1) {
		printf("\n请对图书进行管理");
		usrmanager();
	}
	return 0;
}
void error(char* s) {    //异常提醒
	fprintf(stderr, "%s\n", s);
}
int usrmanager() {    //用户初始界面
	printf("-------------------------------------\n");
	printf("请输入项目前编号执行相关操作:\n");
	printf("[1] 查看图书\n[2] 录入图书\n[3] 修改图书信息\n[4] 删除图书\n[5] 图书排序\n[6] 取消操作\n");
	printf("请输入数字(1-6):");
	scanf("%d", &a);
	getchar();
	switch (a) {
	case 1:
		system("cls");
		viewbook();    //查询图书
		return -1;
		break;
	case 2:
		system("cls");
		addbook();    //添加图书
		break;
	case 3:
		system("cls");
		modbook();    //修改图书信息
		break;
	case 4:
		system("cls");
		delbook();    //删除图书
		break;
	case 5:
		system("cls");
		sortbook();    //图书排序
		break;
	case 6:
		system("cls");
		exit(0);    //取消操作
	default:
		system("cls");
		error("出现错误!请输入1,2,3,4,5,6!");
		break;
	}
	return -1;
}

用户开始界面

2.查看图书
int viewbook() {    //查看图书
	Book* bp;
	for (bp = head; bp != NULL; bp = bp->next) {
		printbook(bp);
	}
	if (nbook) {    //判断图书馆藏书种类数目
		return nbook;
	}
	else {
		printf("图书馆没有图书\n");
	}
	printf("请按ESC键返回主菜单\n");
	int cc = _getche();
	if (cc == 27) {
		system("cls");
	}
	return -1;
}
void printbook(Book* bp) {    //打印图书信息
	printf("-------------------------------------\n");
	printf("图书编号:%d\n", bp->id);
	printf("图书名:《%s》\n", bp->name);
	printf("图书存数:%d\n", bp->count);
	printf("-------------------------------------\n");
}

查看图书界面

3.录入图书
int addbook() {    //录入图书
	char sname[30];    //添加图书的名称
	Book* bp;
	int id;    //图书编号
	int count;    //图书数目
	char* namep;
	int f = 1;
	while (f) {
		id = 0;    //图书编号
		count = 0;    //图书数量
		namep = NULL;
		printf("请输入图书名:\n");
		scanf("%s", sname);
		getchar();
		printf("请输入图书编号(数字不小于0并且不大于1000):\n");
		scanf("%d", &id);
		getchar();
		if (!(id >= 0 && id <= 1000)) {
			error("输入编号不符合要求");
			continue;
		}
		printf("请输入图书数量(数字大于0并且不大于50):\n");
		scanf("%d", &count);
		getchar();
		if (!(count > 0 && count <= 50)) {
			error("输入数目不符合要求");
			continue;
		}
		if ((bp = lookup(namep = strdup(sname), id)) == NULL) {    //通过查找的方式添加注册图书
			bp = (Book*)malloc(sizeof(Book));
			if (bp == NULL || (bp->name = namep) == NULL) {
				error("注册图书失败");
				continue;
			}
			bp->id = id;
			bp->count = count;
			++nbook;
			bp->next = head;
			head = bp;
			printf("图书 《%s》 注册成功\n", sname);
			printf("请按ESC键返回主菜单\n");
			fflush(stdin);
			int cc = _getche();
			if (cc == 27) {
				f = 0;
				system("cls");
				break;
			}
			return id;
		}
		else {
			error("图书名或编号已经被占用");
			printf("请按ESC键返回主菜单\n");
			fflush(stdin);
			int cc = _getche();
			if (cc == 27) {
				f = 0;
				system("cls");
				break;
			}
		}
	}
	return -1;
}
Book* lookup(char* s, int id) {    //查找
	Book* bp;
	for (bp = head; bp != NULL; bp = bp->next) {
		if (id == bp->id || strcmp(s, bp->name) == 0) {
			return bp;
		}
	}
	return NULL;
}

录入图书界面

4.修改图书信息
int modbook() {    //修改图书信息
	Book* bp = NULL;
	while (1) {
		int id = 0;
		Book* k;
		for (k = head; k != NULL; k = k->next) {
			printbook(k);
		}
		printf("请输入要修改信息的图书编号(图书的旧编号,数字不小于0并且不大于1000):\n");
		scanf("%d", &id);
		getchar();
		if (!(id >= 0 && id <= 1000)) {
			error("图书编号不符合要求");
			continue;
		}
		if ((bp = lookup("", id)) != NULL) {
			char YN;
			printf("确定要修改此图书:Y  N\n");
			scanf("%c", &YN);
			getchar();
			if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
				system("cls");
				error("指令无效\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				continue;
			}
			if (YN == 'Y' || YN == 'y') {
				system("cls");
				printf("以下为要修改的图书的现有信息(请输入操作前所对应的编号):\n");
				printbook(bp);
				printf("[1] 修改图书名\n[2] 修改图书数量\n[3] 修改图书编号\n[0] 放弃修改\n");
				while (1) {
					int i;
					scanf("%d", &i);
					getchar();
					if (!(i == 1 || i == 2 || i == 3 || i == 0)) {
						error("请选择需要修改的事物,输入1,2,3,0");
						continue;
					}
					switch (i) {
					case 1:
						while (1) {
							char newname[100], * namep;    //新的图书名
							char YN;
							printf("请输入新的图书名:\n");
							scanf("%s", newname);
							getchar();
							if ((lookup(namep = strdup(newname), 0)) != NULL) {
								error("图书名已存在");
								continue;
							}
							printf("确定要修改此图书的名称:Y  N\n");
							scanf("%c", &YN);
							getchar();
							if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
								error("指令无效\n");
								continue;
							}
							if (YN == 'Y' || YN == 'y') {
								bp->name = namep;
								system("cls");
								printf("修改成功\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return id;
							}
							else {
								system("cls");
								printf("放弃修改\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return 0;
							}
						}
						break;
					case 2:
						while (1) {
							int bnum;    //新的图书的数量
							char YN;
							printf("请输入新的图书数量:(数字大于0并且不大于50)\n");
							scanf("%d", &bnum);
							getchar();
							if (!(bnum > 0 && bnum <= 50)) {
								error("数目不符合要求,请重新输入");
								continue;
							}
							printf("确定要修改此图书的数量:Y  N\n");
							scanf("%c", &YN);
							getchar();
							if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
								error("指令无效\n");
								continue;
							}
							if (YN == 'Y' || YN == 'y') {
								bp->count = bnum;
								system("cls");
								printf("修改成功\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return id;
								break;
							}
							else {
								system("cls");
								printf("放弃修改\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return 0;
							}
						}
						break;
					case 3:
						while (1) {
							int nid;    //新的图书编号
							char YN;
							printf("请输入新的图书编号:(数字不小于0并且不大于1000)\n");
							scanf("%d", &nid);
							getchar();
							if (!(nid >= 0 && nid <= 1000)) {
								error("编号格式不正确");
								continue;
							}
							printf("确定要修改此图书的编号:Y  N\n");
							scanf("%c", &YN);
							getchar();
							if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
								error("指令无效\n");
								continue;
							}
							if (YN == 'Y' || YN == 'y') {
								bp->id = nid;
								system("cls");
								printf("修改成功");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return id;
								break;
							}
							else {
								system("cls");
								printf("放弃修改\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return 0;
							}
						}
						break;
					case 0:
						system("cls");
						return -1;
					default:
						error("获取参数失败");
						break;
					}
				}
			}
			else {
				system("cls");
				printf("放弃修改\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				return 0;
			}
		}
		else {
			system("cls");
			printf("没有此图书\n");
			printf("请按ESC键返回主菜单\n");
			fflush(stdin);
			int cc = _getche();
			if (cc == 27) {
				system("cls");
			}
			return 0;
		}
	}
	return -1;
}

修改图书信息界面1
修改图书信息界面2

5.删除图书
int delbook() {    //删除注销图书
	Book* bp, * fbp, * k;
	int id = 0;
	for (k = head; k != NULL; k = k->next) {
		printbook(k);
	}
	printf("请输入要注销的图书编号(数字不小于0并且不大于1000):\n");
	scanf("%d", &id);
	getchar();
	system("cls");
	if (!(id >= 0 && id <= 1000)) {
		error("图书编号不符合要求");
		return -1;
	}
	for (fbp = bp = head; bp != NULL; fbp = bp, bp = bp->next) {
		if (bp->id == id) {
			printbook(bp);
			break;
		}
	}
	if (bp != NULL) {
		while (1) {
			char YN;
			printf("确定要注销此图书:Y  N\n");
			scanf("%c", &YN);
			getchar();
			if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
				error("指令无效\n");
				continue;
			}
			if (YN == 'Y' || YN == 'y') {
				bp == head ? head = bp->next : (fbp->next = bp->next);
				free(bp);
				bp = NULL;
				system("cls");
				printf("图书注销成功\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				--nbook;
				break;
			}
			else {
				system("cls");
				printf("放弃注销\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				return 0;
			}
		}
		return id;
	}
	else {
		system("cls");
		printf("要注销的图书编号不存在\n");
		printf("请按ESC键返回主菜单\n");
		fflush(stdin);
		int cc = _getche();
		if (cc == 27) {
			system("cls");
		}
		return -1;
	}
	return -1;
}

删除图书界面

6.图书排序
int sortbook() {
	Book* bp;
	Book* sp;
	Book* mid = (Book*)malloc(sizeof(Book));    //中间变量
	if ((bp = head) != NULL && (sp = head->next) != NULL) {
		while (bp != NULL) {
			while (sp != NULL) {
				if (bp->id > sp->id) {
					//中间转换
					//mid=bp;
					mid->count = bp->count;
					mid->id = bp->id;
					mid->name = bp->name;
					//编号大的放前面
					//bp=sp;
					bp->count = sp->count;
					bp->id = sp->id;
					bp->name = sp->name;
					//小的
					//sp=mid;
					sp->count = mid->count;
					sp->id = mid->id;
					sp->name = mid->name;
				}
				sp = sp->next;
			}
			bp = bp->next;
			sp = bp;
		}
		bp = head;
		printf("以下为排序结果\n");
		viewbook();
	}
	else {
		system("cls");
		printf("排序的图书不存在\n");
		printf("请按ESC键返回主菜单\n");
		fflush(stdin);
		int cc = _getche();
		if (cc == 27) {
			system("cls");
		}
		return 0;
	}
}

图书排序界面

源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)

typedef struct book {
	char* name;    //图书名称
	int id;    //图书编号
	int count;    //图书数量
	struct book* next;
}Book;
int a;    //选择操作方式
void error(char*);    //异常提醒
int usrmanager();
int viewbook();
int addbook();
int modbook();
int delbook();
int sortbook();
void printbook(Book*);    //打印图书信息
Book* lookup(char*, int);    //搜索图书
Book* head = NULL;    //动态链表
int nbook = 0;    //记录图书种类数量
int main() {    //主函数
	while (1) {
		printf("\n请对图书进行管理");
		usrmanager();
	}
	return 0;
}
void error(char* s) {    //异常提醒
	fprintf(stderr, "%s\n", s);
}
int usrmanager() {    //用户初始界面
	printf("-------------------------------------\n");
	printf("请输入项目前编号执行相关操作:\n");
	printf("[1] 查看图书\n[2] 录入图书\n[3] 修改图书信息\n[4] 删除图书\n[5] 图书排序\n[6] 取消操作\n");
	printf("请输入数字(1-6):");
	scanf("%d", &a);
	getchar();
	switch (a) {
	case 1:
		system("cls");
		viewbook();    //查询图书
		return -1;
		break;
	case 2:
		system("cls");
		addbook();    //添加图书
		break;
	case 3:
		system("cls");
		modbook();    //修改图书信息
		break;
	case 4:
		system("cls");
		delbook();    //删除图书
		break;
	case 5:
		system("cls");
		sortbook();    //图书排序
		break;
	case 6:
		system("cls");
		exit(0);    //取消操作
	default:
		system("cls");
		error("出现错误!请输入1,2,3,4,5,6!");
		break;
	}
	return -1;
}
int viewbook() {    //查看图书
	Book* bp;
	for (bp = head; bp != NULL; bp = bp->next) {
		printbook(bp);
	}
	if (nbook) {    //判断图书馆藏书种类数目
		return nbook;
	}
	else {
		printf("图书馆没有图书\n");
	}
	printf("请按ESC键返回主菜单\n");
	int cc = _getche();
	if (cc == 27) {
		system("cls");
	}
	return -1;
}
void printbook(Book* bp) {    //打印图书信息
	printf("-------------------------------------\n");
	printf("图书编号:%d\n", bp->id);
	printf("图书名:《%s》\n", bp->name);
	printf("图书存数:%d\n", bp->count);
	printf("-------------------------------------\n");
}
int addbook() {    //录入图书
	char sname[30];    //添加图书的名称
	Book* bp;
	int id;    //图书编号
	int count;    //图书数目
	char* namep;
	int f = 1;
	while (f) {
		id = 0;    //图书编号
		count = 0;    //图书数量
		namep = NULL;
		printf("请输入图书名:\n");
		scanf("%s", sname);
		getchar();
		printf("请输入图书编号(数字不小于0并且不大于1000):\n");
		scanf("%d", &id);
		getchar();
		if (!(id >= 0 && id <= 1000)) {
			error("输入编号不符合要求");
			continue;
		}
		printf("请输入图书数量(数字大于0并且不大于50):\n");
		scanf("%d", &count);
		getchar();
		if (!(count > 0 && count <= 50)) {
			error("输入数目不符合要求");
			continue;
		}
		if ((bp = lookup(namep = strdup(sname), id)) == NULL) {    //通过查找的方式添加注册图书
			bp = (Book*)malloc(sizeof(Book));
			if (bp == NULL || (bp->name = namep) == NULL) {
				error("注册图书失败");
				continue;
			}
			bp->id = id;
			bp->count = count;
			++nbook;
			bp->next = head;
			head = bp;
			printf("图书 《%s》 注册成功\n", sname);
			printf("请按ESC键返回主菜单\n");
			fflush(stdin);
			int cc = _getche();
			if (cc == 27) {
				f = 0;
				system("cls");
				break;
			}
			return id;
		}
		else {
			error("图书名或编号已经被占用");
			printf("请按ESC键返回主菜单\n");
			fflush(stdin);
			int cc = _getche();
			if (cc == 27) {
				f = 0;
				system("cls");
				break;
			}
		}
	}
	return -1;
}
Book* lookup(char* s, int id) {    //查找
	Book* bp;
	for (bp = head; bp != NULL; bp = bp->next) {
		if (id == bp->id || strcmp(s, bp->name) == 0) {
			return bp;
		}
	}
	return NULL;
}
int modbook() {    //修改图书信息
	Book* bp = NULL;
	while (1) {
		int id = 0;
		Book* k;
		for (k = head; k != NULL; k = k->next) {
			printbook(k);
		}
		printf("请输入要修改信息的图书编号(图书的旧编号,数字不小于0并且不大于1000):\n");
		scanf("%d", &id);
		getchar();
		if (!(id >= 0 && id <= 1000)) {
			error("图书编号不符合要求");
			continue;
		}
		if ((bp = lookup("", id)) != NULL) {
			char YN;
			printf("确定要修改此图书:Y  N\n");
			scanf("%c", &YN);
			getchar();
			if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
				system("cls");
				error("指令无效\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				continue;
			}
			if (YN == 'Y' || YN == 'y') {
				system("cls");
				printf("以下为要修改的图书的现有信息(请输入操作前所对应的编号):\n");
				printbook(bp);
				printf("[1] 修改图书名\n[2] 修改图书数量\n[3] 修改图书编号\n[0] 放弃修改\n");
				while (1) {
					int i;
					scanf("%d", &i);
					getchar();
					if (!(i == 1 || i == 2 || i == 3 || i == 0)) {
						error("请选择需要修改的事物,输入1,2,3,0");
						continue;
					}
					switch (i) {
					case 1:
						while (1) {
							char newname[100], * namep;    //新的图书名
							char YN;
							printf("请输入新的图书名:\n");
							scanf("%s", newname);
							getchar();
							if ((lookup(namep = strdup(newname), 0)) != NULL) {
								error("图书名已存在");
								continue;
							}
							printf("确定要修改此图书的名称:Y  N\n");
							scanf("%c", &YN);
							getchar();
							if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
								error("指令无效\n");
								continue;
							}
							if (YN == 'Y' || YN == 'y') {
								bp->name = namep;
								system("cls");
								printf("修改成功\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return id;
							}
							else {
								system("cls");
								printf("放弃修改\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return 0;
							}
						}
						break;
					case 2:
						while (1) {
							int bnum;    //新的图书的数量
							char YN;
							printf("请输入新的图书数量:(数字大于0并且不大于50)\n");
							scanf("%d", &bnum);
							getchar();
							if (!(bnum > 0 && bnum <= 50)) {
								error("数目不符合要求,请重新输入");
								continue;
							}
							printf("确定要修改此图书的数量:Y  N\n");
							scanf("%c", &YN);
							getchar();
							if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
								error("指令无效\n");
								continue;
							}
							if (YN == 'Y' || YN == 'y') {
								bp->count = bnum;
								system("cls");
								printf("修改成功\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return id;
								break;
							}
							else {
								system("cls");
								printf("放弃修改\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return 0;
							}
						}
						break;
					case 3:
						while (1) {
							int nid;    //新的图书编号
							char YN;
							printf("请输入新的图书编号:(数字不小于0并且不大于1000)\n");
							scanf("%d", &nid);
							getchar();
							if (!(nid >= 0 && nid <= 1000)) {
								error("编号格式不正确");
								continue;
							}
							printf("确定要修改此图书的编号:Y  N\n");
							scanf("%c", &YN);
							getchar();
							if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
								error("指令无效\n");
								continue;
							}
							if (YN == 'Y' || YN == 'y') {
								bp->id = nid;
								system("cls");
								printf("修改成功");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return id;
								break;
							}
							else {
								system("cls");
								printf("放弃修改\n");
								printf("请按ESC键返回主菜单\n");
								fflush(stdin);
								int cc = _getche();
								if (cc == 27) {
									system("cls");
								}
								return 0;
							}
						}
						break;
					case 0:
						system("cls");
						return -1;
					default:
						error("获取参数失败");
						break;
					}
				}
			}
			else {
				system("cls");
				printf("放弃修改\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				return 0;
			}
		}
		else {
			system("cls");
			printf("没有此图书\n");
			printf("请按ESC键返回主菜单\n");
			fflush(stdin);
			int cc = _getche();
			if (cc == 27) {
				system("cls");
			}
			return 0;
		}
	}
	return -1;
}
int delbook() {    //删除注销图书
	Book* bp, * fbp, * k;
	int id = 0;
	for (k = head; k != NULL; k = k->next) {
		printbook(k);
	}
	printf("请输入要注销的图书编号(数字不小于0并且不大于1000):\n");
	scanf("%d", &id);
	getchar();
	system("cls");
	if (!(id >= 0 && id <= 1000)) {
		error("图书编号不符合要求");
		return -1;
	}
	for (fbp = bp = head; bp != NULL; fbp = bp, bp = bp->next) {
		if (bp->id == id) {
			printbook(bp);
			break;
		}
	}
	if (bp != NULL) {
		while (1) {
			char YN;
			printf("确定要注销此图书:Y  N\n");
			scanf("%c", &YN);
			getchar();
			if (!((YN == 'Y' || YN == 'y') || (YN == 'N' || YN == 'n'))) {
				error("指令无效\n");
				continue;
			}
			if (YN == 'Y' || YN == 'y') {
				bp == head ? head = bp->next : (fbp->next = bp->next);
				free(bp);
				bp = NULL;
				system("cls");
				printf("图书注销成功\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				--nbook;
				break;
			}
			else {
				system("cls");
				printf("放弃注销\n");
				printf("请按ESC键返回主菜单\n");
				fflush(stdin);
				int cc = _getche();
				if (cc == 27) {
					system("cls");
				}
				return 0;
			}
		}
		return id;
	}
	else {
		system("cls");
		printf("要注销的图书编号不存在\n");
		printf("请按ESC键返回主菜单\n");
		fflush(stdin);
		int cc = _getche();
		if (cc == 27) {
			system("cls");
		}
		return -1;
	}
	return -1;
}
int sortbook() {    //图书排序
	Book* bp;
	Book* sp;
	Book* mid = (Book*)malloc(sizeof(Book));    //中间变量
	if ((bp = head) != NULL && (sp = head->next) != NULL) {
		while (bp != NULL) {
			while (sp != NULL) {
				if (bp->id > sp->id) {
					//中间转换
					//mid=bp;
					mid->count = bp->count;
					mid->id = bp->id;
					mid->name = bp->name;
					//编号大的放前面
					//bp=sp;
					bp->count = sp->count;
					bp->id = sp->id;
					bp->name = sp->name;
					//小的
					//sp=mid;
					sp->count = mid->count;
					sp->id = mid->id;
					sp->name = mid->name;
				}
				sp = sp->next;
			}
			bp = bp->next;
			sp = bp;
		}
		bp = head;
		printf("以下为排序结果\n");
		viewbook();
	}
	else {
		system("cls");
		printf("排序的图书不存在\n");
		printf("请按ESC键返回主菜单\n");
		fflush(stdin);
		int cc = _getche();
		if (cc == 27) {
			system("cls");
		}
		return 0;
	}
}

总结

本次课设实现了对部分数据结构的理论知识的运用,例如链表的知识,对较难管理的图书进行了管理,并通过链表实现了对不同图书的储存等其他一系列操作。要想实现图书管理系统,就需要清楚地了解链式存储结构,熟练地掌握对链式结构的操作、懂得如何运用文件指针进行代码的存储与读取。尤其在排序问题上,需要思考的问题较多,如何实现排序成为一大棘手的问题,最后经过研究发现需要运用指针来实现对图书编号进行由小到大的排序,由此可见指针对于简化程序具有重要意义。

心得

编写这个程序时也发生了一件令我哭笑不得的事情,我之所以说排序这个功能是一大棘手的问题(这只是对于我而言),是有原因的。这个代码其实很多都是借鉴了上个年级学长的课设论文中的代码,而且我发现学长的代码也是借鉴了百度上一位大佬的代码。但是他们的代码都有一个共同的特点,就是都没有排序功能并且直接复制下来也无法运行,(尽管我不知道我的代码能否在其他人的电脑上正常运行,但是经过我的测试,只要你正常输入程序要求你输入的东西,它是可以正常运行的,至少在我的电脑上可以,但是大量实验后也会有一些出人意料的bug,这些bug貌似不容易被触发,毕竟这不是一个完美的代码,显然这也不是一个解决问题的态度,但请各位谅解我,体谅体谅我是个电脑小白)这就让我很难过,毕竟当时我们进入了大二上学期期末复习阶段,由于疫情影响,我们要提前放假、提前考试,因此复习时间比较紧张,也因为我的拖延症,代码验收答辩的时间只剩一个晚上了。经过我的不懈努力,我将除排序以外的其他功能都完善了出来。也就是说还差一个排序功能,而彼时我的室友都在忙自己的代码,我怕打扰他们,没有让他们帮忙。眼看时间不多了,我只好尝试我一直都想尝试的事情:在淘宝上找程序员帮我代写剩下的排序代码,顺便看看他们靠不靠谱。我把我的另一个室友的代码也报了上去,(当时他的代码也没有完成),他用拳头砸了我的衣服柜,以此来发泄他的情绪(因为他的运气比较差,上学期学长的论文里没有他的题目,也就是说在上学期学长的论文里找不到他可以参考的源代码,而百度上的代码直接复制也运行不了)。看着他生气并且无奈的样子我也很着急,想帮他但又帮不了他,于是我也把他的代码报了上去,但我没有告诉他。我问程序员多少钱,他开口要价500元,我差点儿吐了口血,这也太贵了,但最后我还是答应了他。那个程序员先开始写室友的代码,但是就在他写代码的时候,我的室友将代码写完了,我便要退回室友的代码费,那位程序员说都要写完了,只能退50块钱,就这样450花出去了(现在想想看简直是血亏),但结果是排序的功能实现了。最后我告诉了室友,室友震惊了,认为我脑子缺根弦,他给我转了一些钱,我还是谢绝了。可悲的是在答辩的时候,我是全班最后一位同学,天色已黑,老师想早点儿回家,所以她并没有问我编程知识方面的问题,也只给了我一个B+的成绩(因为我去答辩的时间较晚并且这个代码也并不完全是我自己写的。如果和老师说这是自己写的,并且你把她问的问题都回答的很好,你的成绩会很高,但她问的问题会很深很难,答错便会降档,所以我就说我是抄的),但我还是很满意。虽然这个代码不完全是我写的,但是却全是我修改、完善、优化的,况且我们一个二本学校的大二学生很少能做到像那位老师说的自己写出程序(至少我的周围是这样,这个我敢肯定)。总的来说这个程序对我来说是一个不小的挑战,我为此付出了很多的汗水,不论老师最后给出的成绩如何,我都可以接受,毕竟这不是一个好的程序,但我很享受编程的过程。我相信随着时间的推移,我终将能够写出好的、优质的、能卖得出去的程序。当然我也相信几乎没有人会把我的心得都看完。如果您真的看完了,就请谅解我的所作所为。最后非常感谢您能花时间来看我的文章,希望您能身体健康,完事如意,开心、快乐地度过每一天。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

computer kingdom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值