c语言编写图书管理系统例子

#关于用C语言(c++类似)编写一个在控制台展示的图书管理系统(帮朋友写的课程作业)
#其中只有图书增加 删除 借书 还书 查找图书 5个功能(小试牛刀)
#工具:visual studio2019
#设计图
c语言编写图书管理系统例子
#思路是:打算用链表操作数据 然后把数据写入到txt文件 每次执行数据操作前从txt文件把数据读取到链表

下面先看看功能展示图

c语言编写图书管理系统例子
c语言编写图书管理系统例子
c语言编写图书管理系统例子
c语言编写图书管理系统例子
c语言编写图书管理系统例子
c语言编写图书管理系统例子

#下面贴代码,因为只是小作业,所以没有用良好的编写习惯,只用了一个.c文件就把所有代码写完了(无自定义头文件)

1.include要用的头文件,定义struck结构体,定义函数

#define _CRT_SECURE_NO_WARNINGS//只会在该文件里起作用,下面会用到一些不安全函数(版本问题)strcpy,scanf #include<stdio.h> #include<stdlib.h> #include<string.h> #pragma warning(disable:4996) struct book { 	int bid; //书本号 	char bname[100]; //书名 	char wname[100]; //作者 	char publish[100]; //出版社 	int present_count; //当前在架册数 	int old_count; //馆藏册数 	char show[100]; //书本简介 	struct book* next; //结构体内指针变量 	}; 	  //定义函数 struct book* creatbook();                          //创建链表 struct book* addbook(struct book* head);           //添加图书 int yanzheng(struct book* head, int m);             //验证新添加的图书编码是否已存在 void deletebook(struct book* head);                //删除图书 void fprint(struct book* head);                    //将链表写入文件 struct book* load();                               //从文件中读取信息并建成链表 void num_chaxun(struct book* head);                //按图书编号查询图书 void xiugai(struct book* head);  //借阅书本 void xiugai2(struct book* head); //归还书本 

2.编写程序入口main函数

int main() { 	int choice, x; 	 	struct book* head = NULL;//初始化头指针 	 				x = 1; 				 				while (x) { 					system("cls"); 					printf("*******************************************************n"); 					printf("*             图 书 馆 管 理 系 统                    *n"); 					printf("*                    主菜单                           *n"); 					printf("*                                                     *n"); 					printf("*                  1,图书上架                         *n"); 					printf("*                  2,图书下架                         *n"); 					printf("*                  3,查找图书                         *n"); 					printf("*                  4,图书出借                         *n"); 					printf("*                  5,图书归还                         *n"); 					printf("*                  6,退出系统                         *n"); 					printf("*                                                     *n"); 					printf("*                  请选择菜单项:(1^6)              *n"); 					printf("*******************************************************n"); 					printf("请输入所选择的序号:"); 					scanf("%d", &choice); 					getchar();//获得键盘输入 					system("cls"); 					switch (choice) 					{ 					case 6: 						x = 0; break; 					case 1: 						head = load();//从文件中读取数据到链表 						if (head == NULL) { 							head = creatbook();录入实例到txt文件。其实这个方法很蠢 写的时候没想到,可以直接在txt手动加实例就好了 							head = addbook(head); 							fprint(head); 							printf("上架成功!n"); 							getchar(); 							break; 						} 						else { 							head = addbook(head); 							fprint(head); 							printf("上架成功!n"); 							getchar(); 							break; 						}  					case 2: 						head = load(); 						if (head == NULL) { 							printf("书库为空,请先上架书本!n"); 							getchar(); 							break; 						}  						else { 							deletebook(head); 							getchar(); 							break; 						} 						break; 					 					 					case 3: 						head = load(); 						if (head == NULL) { 							printf("书库为空,请先上架书本!n"); 							getchar(); 							break; 						} 						else { 							num_chaxun(head); 							getchar(); 							break; 						} 						break; 					case 4: 						head = load(); 						if (head == NULL) { 							printf("书库为空,请先上架书本!n"); 							getchar(); 							break; 						} 						else { 							 							xiugai(head); 							getchar(); 							break; 						} 						break;   					case 5: 						head = load(); 						if (head == NULL) { 							printf("书库为空,请先上架书本!n"); 							getchar(); 							break; 						} 						else { 							 							xiugai2(head); 							getchar(); 							break; 						} 						break; 					 					}  				} 			} 

3.函数编写

//录入数据并形成链表 struct book* creatbook() { 	struct book* head, * tail, * p; 	//初始时给txt文件添加一个实例先 免得报空指针错误,排错时间更多 不如提前堵住可能报错的问题 	int num=1, num2=1, num3=1; 	char bname[100]="实例", wname[100]= "实例", press[100]= "实例", sort[100]= "实例"; 	//sizeof操作符以字节形式给出了其操作数的存储大小 	int size = sizeof(struct book); 	head = tail = NULL; 	 	//malloc函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。 		p = (struct book*)malloc(size); 		p->bid = num; 		//strcpy函数对字符串进行复制拷贝之类的操作 		strcpy(p->bname, bname); 		strcpy(p->wname, wname); 		strcpy(p->publish, press); 		strcpy(p->show, sort); 		p->present_count = num2; 		p->old_count = num3; 		p->next = NULL; 		if (head == NULL) 			head = p; 		else 			tail->next = p;  		tail = p; 		fprint(head);//调用写入数据到txt文件函数 	    return head; } 
//将链表写入文件 void fprint(struct book* head) { 	FILE* fp;//文件指针 	char ch = '1'; 	struct book* p1; 	if ((fp = fopen("f1.txt", "w")) == NULL) {//打开文件 		printf("File open error!n"); 		exit(0); 	} 	fputc(ch, fp);//返回值:在正常调用情况下,函数返回写入文件的字符的ASCII码值,出错时,返回EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置。EOF是在头文件 stdio.h中定义的宏。 	for (p1 = head; p1; p1 = p1->next) { 		fprintf(fp, "%d %s %s %s %d %d %sn", p1->bid, p1->bname, p1->wname, p1->publish, p1->present_count, p1->old_count, p1->show); 	} 	fclose(fp); } 
从txt文件中读取数据并建成链表 struct book* load() { 	FILE* fp; 	char ch; 	struct book* head, * tail, * p1; 	head = tail = NULL; 	if ((fp = fopen("f1.txt", "r")) == NULL) { 		printf("File open error!n"); 		exit(0); 	} 	//从文件指针指定的文件中读入一个字符,该字符的ASCII值作为函数的返回值,若返回值为EOF,说明文件结束,EOF是文件结束标志,值为-1。 	ch = fgetc(fp); 	if (ch == '1') {  		while (!feof(fp)) { 			p1 = (struct book*)malloc(sizeof(struct book)); 			fscanf(fp, "%d%s%s%s%d%d%sn", &p1->bid, p1->bname, p1->wname, p1->publish, &p1->present_count, &p1->old_count, p1->show); 			if (head == NULL) 				head = p1; 			else 				tail->next = p1; 			tail = p1; 		} 		tail->next = NULL; 		fclose(fp); 		return head;//返回值可用来确定文件中是否有数据(图书馆中是否有书) 	} 	else 		return NULL;  } 
 //插入结点,并且插入后仍按一定顺序存储 struct book* addbook(struct book* head) {  	struct book* ptr, * p1, * p2, * p; 	p1 = NULL; 	char bname[100], wname[100], press[100], sort[100]; 	int size = sizeof(struct book); 	int bid, present_count, old_count ,n ; 	 	do { 		printf("请输入图书编号:"); 		scanf("%d", &bid); 		n = yanzheng(head, bid);//调用函数判断该编号是否存在 		if (n == 0) 			break; 		else 			printf("您输入的编号已存在,请重新输入!n"); 	} while (1); 	printf("请输入图书名:"); 	scanf("%s", bname); 	getchar(); 	printf("请输入作者名:"); 	scanf("%s", wname); 	getchar(); 	printf("请输入出版社:"); 	scanf("%s", press); 	getchar(); 	printf("请输入当前在架册数:"); 	scanf("%d", &present_count); 	getchar(); 	printf("请输入管藏册数:"); 	scanf("%d", &old_count); 	getchar(); 	printf("请输入书本简介:"); 	scanf("%s", sort); 	getchar(); 	p = (struct book*)malloc(size); 	p->bid = bid; 	strcpy(p->bname, bname); 	strcpy(p->wname, wname); 	strcpy(p->publish, press); 	strcpy(p->show, sort); 	p->present_count = present_count; 	p->old_count = old_count; 	p2 = head; 	ptr = p; 	while ((ptr->bid > p2->bid) && (p2->next != NULL)) { 		p1 = p2; 		p2 = p2->next; 	}//1,2,3,4,插入5 要把p2头指到4 此时p1指到3 ;1,2,5 插入4 要把p2指到5 此时p1指到2 	if (ptr->bid <= p2->bid) { 		if (head == p2) 			head = ptr; 		else { 			p1->next = ptr; 			p->next = p2; 		} 	} 	else { 		p2->next = ptr; 		p->next = NULL; 	} 	return head; } 
//验证添加的图书编号是否已存在 int yanzheng(struct book* head, int m) { 	struct book* p; 	p = head; 	while (p != NULL) { 		if (p->bid == m) 			break; 		p = p->next; 	} 	if (p == NULL) 		return 0; 	else 		return 1; } 
//删除图书信息 void deletebook(struct book* head) { 	int a; 	char b, ch = '1'; 	struct book* p1, * p2; 	FILE* fp; 	printf("请输入要删除的图书编号:"); 	scanf("%d", &a); 	p1 = head; 	p2 = NULL; 	if (p1->bid == a && p1->next == NULL) {  //假如txt里只有最初添加的实例一组数据时        		printf("是否下架唯一的书!(y/n)n"); 		getchar(); 		scanf("%c", &b); 		getchar(); 		switch (b) { 		case 'n': 			break; 		case 'y':  			if ((fp = fopen("f1.txt", "w")) == NULL) { 				printf("File open error!n"); 				exit(0); 			} 			fclose(fp); 			printf("文件已清空!n"); 		} 	} 	else { 		while (p1->bid != a && p1->next != NULL) {//不止一组数据,要删除节点也不是头节点时,寻找到对应编号对应的数据 			p2 = p1; 			p1 = p1->next; 		}  		if (p1->next == NULL) { 			if (p1->bid == a) { 				p2->next = NULL; 				printf("是否确定从书架中彻底删除该图书?(y/n)n"); 				getchar(); 				scanf("%c", &b);  				switch (b) { 				case 'n': 					break; 				case 'y': 					fprint(head); 					printf("删除成功!n"); 					getchar(); 					break; 				} 			}  			else { 				printf("没有找到要删除的数据!n"); 				getchar(); 			} 		} 		else if (p1 == head) {//删除节点时头结点时 			head = p1->next; 			printf("是否确定从书架中彻底删除该图书?(y/n)n"); 			getchar(); 			scanf("%c", &b);  			switch (b) { 			case 'n': 				break; 			case 'y': 				fprint(head); 				printf("删除成功!n"); 				getchar(); 				break; 			}  		} 		else { 			p2->next = p1->next; 			printf("是否确定从书架中彻底删除该图书?(y/n)n"); 			getchar(); 			scanf("%c", &b);  			switch (b) { 			case 'n': 				break; 			case 'y': 				fprint(head); 				printf("删除成功!n"); 				getchar(); 				break; 			} 		} 	}  } 
//按编号查询图书信息 void num_chaxun(struct book* head) { 	int a; 	struct book* p; 	printf("请选择您要查询的图书编号:"); 	scanf("%d", &a); 	getchar(); 	p = head; 	while (p != NULL) { 		if (p->bid == a) 			break; 		p = p->next; 	}  	if (p == NULL) { 		printf("没有找到该编号的图书!n"); 	} 	else { 		printf("书本信息:n"); 		printf("书名:%sn", p->bname); 		printf("作者:%sn", p->wname); 		printf("当前在架册数:%dn", p->present_count); 		printf("馆藏册数:%dn", p->old_count); 		printf("本书简介:%sn", p->show);  	} } 
//借阅书本 更改txt内对应书本编号的数量 void xiugai(struct book* head) { 	int a; 	 	 	struct book* p;  	 		printf("请输入要借的书本号:"); 		scanf("%d", &a);  		p = head;   		while (p != NULL) { 			if (p->bid == a) 				break; 			p = p->next; 		}   		if (p == NULL) { 			printf("没有找到该编号的图书!n"); 			getchar(); 		}   		else { 			 			printf("书名:%sn", p->bname); 			printf("作者:%sn", p->wname); 			printf("当前在架册数:%dn", p->present_count); 			printf("馆藏册数:%dn", p->old_count); 			printf("本书简介:%sn", p->show); 			getchar(); 				p->old_count = p->old_count - 1; 				p->present_count = p->present_count - 1; 				fprint(head);//修改后写入文件 				printf("借阅成功n"); 				getchar(); 	 		} 	} 
//归还书籍,改变数量 void xiugai2(struct book* head){ 	int a; 	 	 	struct book* p; 	 		printf("请输入要还的书本号:"); 		scanf("%d", &a); 		 		p = head; 		while (p != NULL) { 			if (p->bid == a) 				break; 			p = p->next; 		}  		if (p == NULL) { 			printf("没有找到该编号的图书!n"); 			getchar(); 		} 		else { 			 			printf("书名:%sn", p->bname); 			printf("作者:%sn", p->wname); 			printf("当前在架册数:%dn", p->present_count); 			printf("馆藏册数:%dn", p->old_count); 			printf("本书简介:%sn", p->show); 			 			getchar(); 			 				p->old_count = p->old_count + 1; 				p->present_count = p->present_count + 1; 				fprint(head); 				printf("归还成功n"); 				getchar(); 				 			} 		} 	 

版权声明:玥玥 发表于 2021-04-10 8:11:28。
转载请注明:c语言编写图书管理系统例子 | 女黑客导航