【C语言】---- 图书信息管理系统课程设计

1、介绍

某末流高校的大一C语言程序设计大作业,自己主要啃的C语言教程写的这个系统,大约花了半个月时间完成,有许多不足之处,主要是自己水平不足,大家多多指正。

2、实现的功能

开发一个简单的图书信息管理系统, 服务于图书管理员和普通用户,方便管理员和普通用户使用图书馆内的图书资源,使图书资源到达最大化利用。

2.1 图书管理员功能性需求

2.1.1用户信息方面:

  1. 批量创建普通读者账号(用户名为学生学号,用户密码可统一初始化。 并将用户信息存储到指定文件“userinfo.dat”中)。
  2. 批量删除普通读者账号。
  3. 可重置单个用户密码。
  4. 查看馆内所有用户信息。(添加的新功能)

2.1.2图书信息方面:

  1. 新书入库。书籍信息可保存到指定文件“bookinfo.dat”中。
  2. 图书信息查询。支持以下几种查询方式:(a)按书名查询(精确查找)
    (b)按作者名查询 ( c )按出版社查询 (d)按书名和作者名查询(多条件 查询)。
  3. 图书信息修改。
  4. 旧书下架。将指定图书删除,可(a)按书名删除(单种删除)(b) 按出版时间删除(批量删除)。
  5. 看出馆内所有图书信息。(添加的新功能)

2.2 普通用户功能需求分析

2.2.1 用户信息方面:
1. 用户可以自己注册系统账号。(添加的新功能)
2. 用户可更改自己账号的密码。
2.2.2 图书信息方面:
1. 图书信息查询。支持以下几种查询方式:(a)按书名查询(精确查找)(b) 按作者名查询 ( c)按出版社查询 (d)按书名和作者名查询(多条件查询)。

2.看出馆内所有图书信息。(添加的新功能)

3、程序部分

  • 一共1134行。
  • 运用结构体、链表、函数、文件、数组、指针等。
  • 使用前请先看图书管理系统使用说明
1.  管理员无需注册账号,直接登录唯一管理员账号  (账号:123456789 密码:666666) 即可。

2. 用户在没有图书管理系统账号时,可自己在系统内注册,或由管理员注册。  用户忘记密码可携带身份证到图书管理中心找回。

3.该图书系统通过识别账号信息进入  ‘管理员功能界面’ 或 ‘用户功能界面‘。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> // 调用isdigit函数检查注册账号是否为存数字账号 
#define N 20   //宏定义 
#define M 10000 //宏定义,用于用户信息结构体数组 

//定义结构体存储系统用户信息 
typedef struct userinfo 
{
	char Accont[N]; //账号 
	char Password[N];//密码 
	char ID[N]; //用户身份证号 
	char People_name[N];//用户姓名 
}USER;

//图书信息链表 
struct bookinfo
{
	char num[N];        //图书编号 
	char bookname[N];   //书名 
	char author[N];     //图书作者 
	char press[N];      //图书出版社 
	char category[N];   //图书类别 
	char wordnum[N];    //图书字数 
	char pubtime[N];    // 图书出版时间 
	char price[N];      //图书价格 
	char amount[N];     // 图书库存 
	char location[N];  //图书位置 
	struct bookinfo *next; // 结构指针 
};

typedef struct bookinfo Lbook,  *linklist;

void Register_system(); // 用户登录注册菜单函数  
void User_reg();// 新用户注册函数 
void User_enter();//系统用户登录函数 
void Menu_admist();// 管理员菜单
void Menu_user(); // 普通用户菜单 
void Menu1();//用户登录注册菜单界面 
void Menu2();//系统用户注册界面
void Menu3();//系统用户登录界面 
int sign = 0;// 区分用户标识符, 1: 系统管理员,  2:普通用户 
char ACCOUNT[N]; // 用于保存普通用户登录后的账号 
void Load(USER user[],  int *nptr); //把文本文件中用户信息加载到内存中 
void Save(USER user[],  int n); //把用户信息数据保存到文本文件中 
void Creat_account(USER user[],  int *nptr);  // 批量创建用户 
void De_account(USER user[],  int *nptr); //批量删除用户
void Edit_accont(USER user[],  int *nptr); // 重置账号密码或查看账户密码
void Print_account(USER *sptr); // 输出sptr所指的内容记录 
void PrAllAccount(USER user[],  int *nptr); // 查看当前馆内所有用户信息 
int FindByNum(USER user[],  int n, char *str);  // 定位待删除账号的位置 


void Loadbook(struct bookinfo *head); //将文本文件中图书信息存到内存中 
void creat_bookinfo(struct bookinfo *head); //新书入库
void Save_bookinfo(struct bookinfo *head); // 将最新图书数据存入磁盘中 
void De_bookinfo(struct bookinfo *head); //旧书下架界面 
void De_bookname(struct bookinfo *head); //按书名删除图书
void De_pubtime(struct bookinfo *head); //按出版时间删除图书
void Menu4(); //删除图书功能选项菜单
linklist end;//结尾指针
void Print_bookinfo(struct bookinfo *head);//查看所有图书信息 
void edit_bookinfo(struct bookinfo *head); //修改图书信息 
void seek_bookinfo(struct bookinfo *head);//查询图书信息 
void Menu5();//查询图书功能菜单界面 
void seek_bookByname(struct bookinfo *head);//按书名查询图书 
void seek_bookBytime(struct bookinfo *head);//按出版时间查询图书 
void seek_bookByauthor(struct bookinfo *head);//按作者查询图书 
void seek_bookByNamAut(struct bookinfo *head);//按书名和作者查询图书 

int main(void)
{
	int n;
	USER user[M]; //定义结构体数组保存用户信息 
	linklist head;  // 头指针
	head = (linklist)malloc(sizeof(Lbook));
	head->next = NULL;
	
	Register_system(); // 登录注册功能  系统管理员登录后sign = 1, 普通用户登录后 sign = 2,  
	Load(user, &n); // 把用户信息加载到内存中
	
	if(sign == 1) // 进入系统管理员菜单 
	{
		int select;	
		FILE *fp;	 
		while(1)
		{
			Menu_admist();
			printf("请输入菜单选项:\n");
			scanf("%d", &select);
			switch(select)
			{
				case 1: // 批量创建用户
					Creat_account(user, &n);  
					break; 	
				case 2: // 批量删除用户
					De_account(user, &n);  
					break;
				case 3: //重置账号密码
					Edit_accont(user, &n); 
					break; 
				case 4: //重置账号密码
					PrAllAccount(user, &n);
					break; 
				case 5: //新书入库 
					if((fp = fopen("bookinfo.dat", "a")) == NULL) //创建 bookinfo.dat 文本文件 
					{
						printf("can not open this file\n");
					exit(0);
					} 
					fclose(fp); 
					Loadbook(head);//将当前文本文件中图书信息存到链表中 
					creat_bookinfo(end); //添加图书 
					Save_bookinfo(head); //将当前链表中图书数据保存到文本文件中 
					printf("新书入库成功§(* ̄▽ ̄*)\n\n");
					printf("请输入任意键返回管理员功能菜单界面.......\n");
					scanf("%*c%*c");
					break;
				case 6: // 查询图书 
					seek_bookinfo(head);  
					break;	
			    case 7: //修改图书信息
					edit_bookinfo(head); 
					break; 
				case 8: //旧书下架
					De_bookinfo(head); 
					break;
				case 9:	//查看所有图书信息
					 Print_bookinfo(head); 
					 break;
				case 0:	
					printf("成功退出系统,期待你的下次使用O(∩_ ∩)O, 祝你生活愉快!\n");
			 	    exit(0);
				default:
					printf("\n输入错误!无该菜单,输入任意键返回 *系统管理员功能菜单界面* ...\n");
              	  	scanf("%*c%*c");
					break;		
			} 
		} 
		
	} 
	if(sign == 2) // 进入系统普通用户菜单 
	{		
		while(1)
		{
			int select;	
			Menu_user(); 
			printf("请输入菜单选项:\n");
			scanf("%d", &select);
			switch(select)
			{
					case 1:
					 	Edit_accont(user, &n); //修改账号密码
						break; 
					case 2:
						seek_bookinfo(head); // 查询图书 
						break; 
					case 3:
					 	Print_bookinfo(head); //查看所有图书信息 
					 	break;	
					case 0:
						printf("成功退出系统,期待你的下次使用O(∩_ ∩)O, 祝你生活愉快!\n");
						exit(0);
					default:
						printf("\n输入错误!无该菜单,输入任意键返回 *系统普通用户功能菜单界面* ...\n");
              		  	scanf("%*c%*c");
						break;		
			} 
		}	
	} 
}


//用户登录注册菜单函数 
void Register_system()
{
	int select;
	Menu1(); 
	scanf("%d", &select);
	switch(select)
	{
		case 0:  //退出系统 
			printf("\n成功退出系统!期待你的下次使用O(∩_ ∩)O ,祝你生活愉快!\n");
			exit(0);
		case 1: //登录账户 
			User_enter(); 
			return; 
		case 2://注册账号 
			User_reg(); 
			return;
		default: //重新输入选项 
			printf("\n输入错误,输入任意键返回 *系统用户登录注册界面* ...\n");
            scanf("%*c%*c");
			system("cls");
			Register_system();
			return;		
	}	
}


//新用户注册函数 
void User_reg()
{
	int select; 
	char Accont[N], Password1[N], Password2[N], ID[N], People_name[N];
	FILE *fp;
	Menu2(); // 新用户注册功能菜单
	if((fp = fopen("userinfo.dat", "a")) == NULL) //创建 userinfo.dat 文本文件 
	{
		printf("can not open this file\n");
		exit(0);
	}   
	fclose(fp); 
	scanf("%d", &select);
	switch(select)
	{
		case 1:	    // 注册账号密码 , 并检验注册账号是否符合规定,是否被注册 。 
			while(1)    
			{
				FILE *fp; 
				int i;
				char Accont1[N], password1[N], ID[N], People_name[N]; 
				int sign1 = 0; // 检查账号是否为数字账号,0:是  1:否
				system("cls");
				Menu2();
				printf("1\n"); 
				printf("请输入注册账号(九位数数字):\n");
				scanf("%s", Accont);
				if((fp = fopen("userinfo.dat", "r")) == NULL) 
				{
					printf("can not open this file\n");
					exit(0);
				}  
				for(i = 0; Accont[i] != '\0'; i++) // 检查是否为九位账号 
				{
					if(isdigit(Accont[i]) == 0)  // 检查账号是否为数字账号 
					{
						sign1 = 1; break;
					}
				}
				if(i >= 10 || sign1 == 1 || i < 9)
				{
					sign1 = 1;
					printf("未按要求注册账号,请重新注册! \n");
					printf("\n输入任意键返回 *系统用户注册界面* ...\n");
					scanf("%*c%*c");
					User_reg();
					return; 
				}
				while(!feof(fp)) // 检查账号是否被注册 
				{
					fscanf(fp, "%s %s %s %s", Accont1, password1, ID,  People_name);
					if(strcmp(Accont, Accont1) == 0)
					{
						fclose(fp);
						printf("该账号已被注册,请重新注册!\n");
						printf("\n输入任意键返回 *系统用户注册界面* ...\n");
						scanf("%*c%*c");
						sign1 = 1; 
						User_reg();
						return; 
					}
				} 
				if(i == 9 && sign1 == 0)
				{
					printf("注册账号符合要求。"); 
					break;
				}	
				
			}
			if((fp = fopen("userinfo.dat", "a")) == NULL)
			{
			printf("can not open this file\n");
			exit(0);
			}
			printf("请输入你的身份证号:\n");
			scanf("%s", ID);
			printf("请输入你的姓名:\n");
			scanf("%s", People_name);
			printf("请输入账号密码:\n");  
			scanf("%s", Password1);
			printf("请再次输入密码:\n");
			scanf("%s", Password2);
			if(strcmp(Password1, Password2) == 0)
			{
				fprintf(fp, "\n%s  %s  %s  %s\n", Accont, Password1, ID, People_name);
				fclose(fp);
				printf("****新用户创建成功( ̄▽ ̄)**** \n");
				printf("\n输入任意键返回 *系统用户登录注册界面* ...\n");
      		 	scanf("%*c%*c");
       			system("cls");
       			Register_system();
       			return;
			}else
			{
				printf("\n****两次输入密码不一致!!!! 请重新注册****\n");
				printf("\n输入任意键返回 *系统用户注册界面* ...\n");
        		scanf("%*c%*c");
				User_reg();
				return;
			}
		case 2: //返回上一界面 
			printf("\n输入任意键返回 *系统用户登录注册界面* ...\n");
            scanf("%*c%*c");
			system("cls");
			Register_system(); 	
			return;
		case 0:  //退出系统 
			printf("\n成功退出系统!期待你的下次使用O(∩_ ∩)O,祝你生活愉快!\n");
			exit(0);
		default:  //重新输入 
			printf("\n输入错误,无该菜单,输入任意键返回 *系统用户注册界面* ...\n");
            scanf("%*c%*c");
			system("cls");
			User_reg();	
			return;	
	}
}

//系统用户登录函数 
void User_enter()
{
	int select;
	char Accont[N], Password[N];
	char Accont1[N], Password1[N], ID1[N], People_name1[N];
	FILE *fp;
	if((fp = fopen("userinfo.dat", "a")) == NULL) //创建 userinfo.dat 文本文件 
	{
		printf("can not open this file\n");
		exit(0);
	}   
	fclose(fp); 
	Menu3(); // 系统用户登录界面 
	scanf("%d", &select);
	switch(select)
	{
		case 1: //登录账号密码 
			if((fp = fopen("userinfo.dat", "r")) == NULL)
			{
				printf("can not open this file\n");
				exit(0);
			}
			printf("请输入账号:\n");
			scanf("%s", Accont);
			printf("请输入密码:\n");
			scanf("%s", Password);
			while(!feof(fp))
			{
				fscanf(fp, "%s %s", Accont1, Password1, ID1,  People_name1);
				if(strcmp(Accont, "123456789") == 0 && strcmp(Password, "666666") == 0 )  // 图书管理系统管理员账户及密码识别 
				{
					sign = 1;   //系统管理员标识符 
					fclose(fp);
					printf("账号登录成功!!尊敬的管理员欢迎你使用 *河 工 大 图 书 管 理 员 处 理 系 统* \n");
					printf("\n输入任意键前往 *系统管理员功能菜单界面* ...\n");
            		scanf("%*c%*c"); 
					return;
			    }
				if(strcmp(Accont, Accont1) == 0 && strcmp(Password, Password1) == 0)  // 图书管理系统普通用户账号及密码识别 
				{
					strcpy(ACCOUNT, Accont);
					sign = 2;  //普通用户标识符 
					fclose(fp);
					printf("账号登录成功!!尊敬的用户欢迎你使用 *河 工 大 图 书 用 户 管 理 系 统*\n");
					printf("\n输入任意键前往 *系统用户功能菜单界面* ...\n");
            		scanf("%*c%*c"); 
					return;
				}
			}
			if(sign == 0)
			{
					printf("账号密码错误!! 请重新输入......\n");
					printf("温馨提醒:如若忘记账号密码可携带本人身份证到图书馆201室找回账号密码。\n"); 
					printf("\n输入任意键返回 *系统用户登录界面* ...\n");
            		scanf("%*c%*c");
           		 	User_enter();
           		 	return;
			} 			
		case 2: //返回上界面 
			printf("\n输入任意键返回 *系统用户登录注册界面* ...\n");
            scanf("%*c%*c");
			system("cls");
			Register_system(); 
			return ;          
		case 0: //退出系统 
			printf("\n成功退出系统! 期待你的下次使用O(∩_ ∩)O,祝你生活愉快!\n");
			exit(0);  
		default: //重新输入 
			printf("\n输入错误!无该菜单,输入任意键返回 *系统用户登录界面* ...\n");
           	scanf("%*c%*c");
			User_enter();
			return;   	 		 
	}
}

//把文本文件中用户信息加载到内存中 
void Load(USER user[],  int *nptr)  
{
	
	FILE *fp;
	int i = 0;
	
	if((fp = fopen("userinfo.dat", "r")) == NULL)
	{
		*nptr = 0;
		return;
	}
	while(fscanf(fp,  "%s %s %s %s",  user[i].Accont, user[i].Password, user[i].ID, user[i].People_name) != EOF)
	{
		i++;
	}
	*nptr = i ; //  *nPtr记录文件中当前用户人数
	fclose(fp);  	
}

// 批量创建用户 
void Creat_account(USER user[],  int *nptr)
{
	int i = *nptr;
	printf("请输入待创建用户信息, 输入 0 表示结束添加!\n");
	printf("九位数数字账号 ---- 密码 ---- 用户身份证号 ---- 用户姓名:\n");
	while(1)
	{
		scanf("%s", &user[i].Accont);
		if(strcmp(user[i].Accont, "0") == 0)
		{
			break;
		}
		scanf("%s", &user[i].Password);
		scanf("%s", &user[i].ID);
		scanf("%s", &user[i].People_name);
		i++;
	}
	*nptr = i;
	Save(user, *nptr); // //把数据保存到文本文件中
	printf("\n创建成功!!输入任意键返回 *系统管理员功能菜单界面*....... \n");
	scanf("%*c%*c");
} 

//把数据保存到文本文件中
void Save(USER user[],  int n) 
{
	int i;
	FILE *fp;
	if((fp = fopen("userinfo.dat", "w")) == NULL)
	{
		printf("can not open this file!!");
		exit(0);
	}
	for(i = 0; i < n; i++)
	{
		fprintf(fp, "%s %s %s %s\n",  user[i].Accont, user[i].Password, user[i].ID, user[i].People_name);
	}
	fclose(fp);
}

//批量删除用户
void De_account(USER user[],  int *nptr) 
{
	int i, index;
	char account1[N];
	while(printf("\n输入待删除的账号, 注意:输入 0 表示结束输入\n"), scanf("%s", account1), strcmp(account1, "0") != 0)
	{
		index = FindByNum(user, *nptr,  account1);  //定位待删除用户信息在数组的下标 
		if(index < 0)
		{
			printf("\n系统内%s账号不存在!!请重新输入\n" , account1);
		}else
		{
			
			Print_account(&user[index]);
			for(i = index; i < *nptr - 1; i++)
			{
				user[i] = user[i+1]; 
			}
			(*nptr)--;
			Save(user, *nptr); 
			printf("\n删除成功 o(* ̄▽ ̄*)o\n ");
		}			
	}
	printf("\n输入任意键返回 *系统管理员功能菜单界面*....... \n");
	scanf("%*c%*c");
} 

// 定位待删除账号的位置 
int FindByNum(USER user[],  int n, char *str)
{
	int i;
	for(i = 0; i < n; i++)
	{
		if(strcmp(user[i].Accont, str) == 0)
		{
			return i;	//返回待删除用户信息在数组的下标 
		}	
	}
	return -1;
}

// 管理员和用户修改账号密码 
void Edit_accont(USER user[],  int *nptr)
{
	int i, index;
	char account1[N], password1[N], password2[N];
	if(sign == 1) //管理员修改密码 
	{
		printf("请输入要重置密码或要查看密码的账号:\n");
		scanf("%s", account1);
	}else
	{
		if(sign == 2); // 用户修改密码 
		strcpy(account1, ACCOUNT); // 将普通用户登录后的账号存入account1中 
	}
	index =  FindByNum(user, *nptr, account1);
	if(index == -1)
	{
		printf("\n系统内无该账号信息!!\n");
		Edit_accont(user, nptr);
		return;
	}
	Print_account(&user[index]);
	while(1)
	{
		printf("\n请输入要更换的密码:\n");  
		scanf("%s", password1);
		printf("请再次输入密码:\n");
		scanf("%s", password2); 
		if(strcmp(password1, password2) == 0)
		{
			printf("\n密码修改成功 ^_~ \n");
			strcpy(user[index].Password, password2);
			break;	 
		}else
		{
			printf("\n输入的两次密码不同,请重新修改。>﹏<\n"); 
		}
	}
	Save(user, *nptr); 
	printf("\n输入任意键返回 *系统管理员功能菜单界面* ...\n");
    scanf("%*c%*c");
}

//查看当前馆内所有用户信息 
void PrAllAccount(USER user[],  int *nptr)
{
	int i;
	printf("\t\t  *所有用户信息*\n");
	printf("%-15s%-15s%-18s%-15s\n","用户账号:", "用户密码:", "用户身份证号:", "用户姓名:");
	for(i = 0; i < *nptr; i++)
	{ 
		printf("\n%-15s%-15s%-18s%-15s\n", user[i].Accont, user[i].Password, user[i].ID, user[i].People_name);
	}
	printf("\n请输入任意键返回 *系统管理员功能菜单界面* .....\n");
	scanf("%*c%*c");
} 

//输出sptr指针所指记录的内容 
void Print_account(USER *sptr)
{
	printf("\n%s账号信息为:\n", sptr->Accont);
	printf("%-15s%-15s%-18s%-15s\n","用户账号:", "用户密码:", "用户身份证号:", "用户姓名:");
	printf("%-15s%-15s%-18s%-15s\n", sptr->Accont, sptr->Password, sptr->ID, sptr->People_name);
}

//新书入库  (尾插法) 
void creat_bookinfo(struct bookinfo *head)
{
	char num[N], bookname[N], author[N], press[N], category[N];
	char wordnum[N], pubtime[N], price[N], amount[N], location[N];
	linklist p, rear = head;
	printf("请输入图书信息,注意:输入图书编号为 0 表示结束输入!\n");
	printf("图书编号 -- 书名 -- 图书作者 -- 出版社 -- 图书分类 -- 图书字数 -- 图书出版时间 -- 图书价格 -- 图书库存 -- 图书位置\n");
	while(1)
	{
		p = (linklist)malloc(sizeof(Lbook)); 
		scanf("%s", num);
		if(strcmp(num, "0") == 0){
			break;
		}else{
			strcpy(p->num, num);
		}
		scanf("%s %s %s %s %s %s %s %s %s", bookname, author, press, category, 
				wordnum, pubtime, price, amount, location);
		strcpy(p->bookname, bookname); strcpy(p->author, author); 
		strcpy(p->press, press); strcpy(p->category, category);
		strcpy(p->wordnum, wordnum); strcpy(p->pubtime, pubtime);
		strcpy(p->price, price); strcpy(p->amount, amount);
		strcpy(p->location, location);
		rear->next = p;
		rear = p;
	}
	rear->next = NULL;	
} 

//旧书下架界面 
void  De_bookinfo(struct bookinfo *head)
{
	Loadbook(head); //将文本文件中图书信息存到内存中 
	int select;
	while(1)
	{
		Menu4();
		scanf("%d", &select);
		switch(select)
		{
			case 1:
				De_bookname(head);
				break;
			case 2:
				De_pubtime(head);
				break;
			case 3:
				printf("\n输入任意键返回 *系统管理员功能菜单界面* ......\n");
				scanf("%*c%*c");
				return;
			default:
				printf("\n输入错误,无该菜单,输入任意键返回 *旧书下架界面* ......\n");
				scanf("%*c%*c");
				De_bookinfo(head);
				return;
		}
	}	
} 

//按书名删除图书 ************** sign1 
void De_bookname(struct bookinfo *head)
{
	int sign1 = 0;
	char bookname[N];
	while(printf("\n请输入要删除的图书书名(注:书名号《》要输入),注意:输入 0 表示结束输入!\n"), scanf("%s", bookname), strcmp(bookname, "0") != 0)
	{
		linklist p = head, pre = head->next;
		while(pre)
		{
			if(strcmp(pre->bookname, bookname) == 0)
			{
				sign1 = 1;
				break;
			}
			pre = pre->next;
		}
		if(sign1 == 0)
		{
			printf("\n查无该书!!请重新输入\n");	
		}else
		{
			pre = head->next;
			while(pre)
			{
				if(strcmp(pre->bookname, bookname) == 0)
				{
		             printf("\t\t\t\t\t\t\t\t\t待下架的图书信息为:\n");
		            printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 				"出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
		        	printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", pre->num, pre->bookname, pre->author, pre->press, pre->category, 
							pre->wordnum, pre->pubtime, pre->price, pre->amount, pre->location);
					 p->next = pre->next;
					 free(pre);
					 Save_bookinfo(head);
					 printf("\n删除成功!\n"); 
		             break;
				}
				p = p->next;
				pre = pre->next;
			}	
			sign1 = 0;
		}	
	}
	printf("\n输入任意键返回 *旧书下架功能菜单界面* .....\n");
	scanf("%*c%*c");
}

//按出版时间删除图书 sign2 
void De_pubtime(struct bookinfo *head)
{
	int sign2;  // 判断是否有该书
	int sign1 = 0;  // 找到指定出版时间图书后,重新返回头结点 
	char pubtime[N];
	while(printf("\n请输入待删除图书出版时间,注意:输入 0 表示结束输入!\n"), scanf("%s", pubtime), strcmp(pubtime, "0") != 0)
	{
		sign2 = 0; 
		linklist p = head, pre = head->next;
		while(pre)
		{
			if(strcmp(pre->pubtime, pubtime) == 0)
			{
				sign2 = 1;
				break;
			}
			pre = pre->next;
		}
		if(sign2 == 0)
		{
			printf("\n馆内无此年出版的图书!!请重新输入\n");	
		}else
		{
			printf("\n\t\t\t\t\t\t\t\t\t待下架的图书信息为:\n");
		    printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 		"出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
			pre = head->next;
			while(pre)
			{
				
				if(strcmp(pre->pubtime, pubtime) == 0)
				{
					 printf("\n%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", pre->num,  pre->bookname, pre->author, pre->press, pre->category, 
							pre->wordnum, pre->pubtime, pre->price, pre->amount, pre->location);
					 p->next = pre->next;
					 Save_bookinfo(head);
					 sign1 = 1; 
				}
				if(sign1 == 1)
				{
					pre = head->next;
					p = head;
					sign1 = 0;
				}else
				{
					p = p->next;
					pre = pre->next;
				}
			}	
			printf("\n删除成功!\n");
		}	
	}
	printf("\n输入任意键返回 *旧书下架功能菜单界面* .....\n");
	scanf("%*c%*c");
} 

//修改图书信息   sign1 ********* 
void edit_bookinfo(struct bookinfo *head)
{
	Loadbook(head);//将文本文件中图书信息存到内存中 
	int sign1;
	char num[N], bookname[N], author[N], press[N], category[N];
	char wordnum[N], pubtime[N], price[N], amount[N], location[N];
	while(printf("\n请输入要修改信息图书的编号, 注意:输入 0 表示结束输入!\n"), scanf("%s", num), strcmp(num, "0") != 0)
	{
		sign1 = 0;
		linklist p = head->next;
		while(p)
		{
			if(strcmp(p->num, num) == 0)
			{
				printf("\t\t\t\t\t\t\t\t\t修改前编号为%s的图书图书信息为:\n", num);
				printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 			"出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
				printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", p->num,  p->bookname, p->author, p->press, p->category, 
						p->wordnum, p->pubtime, p->price, p->amount, p->location);
				printf("\n请重新输入编号为%s图书的信息:\n", num);
				scanf("%s %s %s %s %s %s %s %s %s %s", num, bookname, author, press, category, 
						wordnum, pubtime, price, amount, location);
				strcpy(p->num, num);  strcpy(p->bookname, bookname); 
				strcpy(p->author, author); 	strcpy(p->press, press);
				strcpy(p->category, category); strcpy(p->wordnum, wordnum);
				strcpy(p->pubtime, pubtime); strcpy(p->price, price); 
				strcpy(p->amount, amount); strcpy(p->location, location);
				sign1 = 1;
				Save_bookinfo(head);
				printf("\n图书信息修改成功!\n");
				break;
			}
			p = p->next;
		}
		if(sign1 == 0)
		{
			printf("\n馆内无%s图书,请重新输入:\n", num); 
		} 	
	}
	printf("\n请输入任意键返回 *系统管理员功能菜单界面* .......\n");
	scanf("%*c%*c"); 
}

//将最新图书数据存入磁盘中 
void Save_bookinfo(struct bookinfo *head)
{ 
	linklist p;
	p = head->next;  
	FILE *fp;
	if((fp = fopen("bookinfo.dat" , "w")) == NULL)
	{
		printf("can not open this file!!\n");
		exit(0);
	}
	while(p)
	{
		fprintf(fp, "%s  %s   %s   %s   %s   %s   %s   %s   %s   %s\n", p->num, p->bookname,
		 p->author, p->press, p->category, p->wordnum, p->pubtime, p->price, p->amount, p->location);
		p = p->next;	
	} 
	fclose(fp);
} 

//将文本文件中图书信息存到内存中 
void Loadbook(struct bookinfo *head)
{
	char num[N], bookname[N], author[N], press[N], category[N];
	char wordnum[N], pubtime[N], price[N], amount[N], location[N];
	linklist p, rear = head;
	FILE *fp;
	if((fp = fopen("bookinfo.dat" , "r")) == NULL)
	{
		printf("can not open this file!!\n");
		exit(0);
	}
	while(fscanf(fp, "%s %s %s %s %s %s %s %s %s %s", num, bookname, author, press, category, 
			wordnum, pubtime, price, amount, location) != EOF)
	{
		p = (linklist)malloc(sizeof(Lbook));
		strcpy(p->num, num);  strcpy(p->bookname, bookname); 
		strcpy(p->author, author); 	strcpy(p->press, press);
		strcpy(p->category, category); strcpy(p->wordnum, wordnum);
		strcpy(p->pubtime, pubtime); strcpy(p->price, price); 
		strcpy(p->amount, amount); strcpy(p->location, location);
		rear->next = p;
		rear = p;
	}
	fclose(fp); 
	rear->next = NULL;
	end = rear;	
}

//查看所有图书信息 
void Print_bookinfo(struct bookinfo *head)
{
	Loadbook(head); //将文本文件中图书信息存到内存中 
	printf("\t\t\t\t\t\t\t\t\t*当前馆内所有图书信息*\n");
	printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 "出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
	linklist p = head->next;
	while(p)
	{
		printf("\n%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", p->num, p->bookname, p->author, p->press, p->category, 
				p->wordnum, p->pubtime, p->price, p->amount, p->location); 
		p = p->next;
	}
	printf("\n输入任意值返回 *管理员功能菜单界面* ......\n");
	scanf("%*c%*c");
}

//查询图书信息功能菜单 
void seek_bookinfo(struct bookinfo *head)
{
	int select; 
	Loadbook(head); 
	while(1)
	{
		Menu5();
		scanf("%d", &select);
		switch(select)
		{
			case 1:
				seek_bookByname(head);//按书名查询图书 
				break;
			case 2:
				seek_bookBytime(head);//按出版时间查询图书 
				break;
			case 3:
				seek_bookByauthor(head);//按作者名查询图书 
				break;
			case 4:
				seek_bookByNamAut(head);//按书名和作者名查询图书 
				break;
			case 5:
				printf("\n输入任意键返回 *系统管理员功能菜单界面* ......\n");
				scanf("%*c%*c");
				return;
			default:
				printf("\n输入错误,无该菜单,输入任意键返回 *查询图书功能菜单界面 * ......\n");
				scanf("%*c%*c");
				seek_bookinfo(head);
				return;
		}
	}
} 

//按书名查询图书 sign1 ******** 
void seek_bookByname(struct bookinfo *head)
{
	char bookname[N];
	int sign1;
	while(printf("\n请输入要查询的图书书名(注:书名号《》要输入),注意:输入 0 表示结束输入!\n"),scanf("%s", bookname))
	{
		sign1 = 0;
		linklist p = head->next;
		if(strcmp(bookname, "0") == 0)
		{
			printf("\n请输入任意键返回 *查询图书功能菜单界面 *........\n");
			scanf("%*c%*c");
			return;
		}
		while(p)
		{
			if(strcmp(p->bookname, bookname) == 0)
			{
				printf("\n\t\t\t\t\t\t\t\t\t%s图书信息为:\n", bookname);
		        printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 			"出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
		        printf("\n%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", p->num, p->bookname, p->author, p->press, p->category, 
						p->wordnum, p->pubtime, p->price, p->amount, p->location);
				sign1 = 1;
				break; 
			}
			p = p->next;
		}
		if(sign1 == 0){
			printf("\n亲爱的用户非常抱歉,馆内无%s图书, 馆长正快马加鞭采购中.......\n", bookname);
		}
	}	
} 

//按出版时间查询图书  sign1 ***** 
void seek_bookBytime(struct bookinfo *head)
{
	char pubtime[N];
	int sign1, time = 1;
	while(printf("\n请输入图书的出版时间,注意:输入 0 表示结束输入!\n"), scanf("%s", pubtime))
	{
		sign1 = 0;
		linklist p = head->next;
		if(strcmp(pubtime, "0") == 0)
		{
			printf("\n请输入任意键返回 *查询图书功能菜单界面 *........\n");
			scanf("%*c%*c");
			return;
		}
		while(p)
		{
			if(strcmp(p->pubtime, pubtime) == 0)
			{
		        while(time)
				{
					printf("\t\t\t\t\t\t\t\t\t图书信息为:\n");
		   			printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 				"出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
			 		time--;
		  		}
				printf("\n%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", p->num, p->bookname, p->author, p->press, p->category, 
						p->wordnum, p->pubtime, p->price, p->amount, p->location);
				sign1 = 1; 
			}
			p = p->next;
		}
		if(sign1 == 0){
			printf("\n亲爱的用户非常抱歉,馆内无在%s年出版图书, 馆长正快马加鞭采购中.......\n", pubtime);
		}
	}	
}

//按作者查询图书  sign1 **** 
void seek_bookByauthor(struct bookinfo *head)
{
	char author[N];
	int sign1, time = 1;
	while(printf("\n请输入图书作者,注意:输入 0 表示结束输入!\n"), scanf("%s", author))
	{
		sign1 = 0;
		linklist p = head->next;
		if(strcmp(author, "0") == 0)
		{
			printf("\n请输入任意键返回 *查询图书功能菜单界面 *........\n");
			scanf("%*c%*c");
			return;
		}
		while(p)
		{
			if(strcmp(p->author, author) == 0)
			{
		        while(time)
				{
					printf("\t\t\t\t\t\t\t\t\t图书信息为:\n");
		   			printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 				"出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
		   			time--;
		  		}
				printf("\n%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", p->num, p->bookname, p->author, p->press, p->category, 
						p->wordnum, p->pubtime, p->price, p->amount, p->location);
				sign1 = 1; 
			}
			p = p->next;
		}
		if(sign1 == 0){
			printf("\n亲爱的用户非常抱歉,馆内无%s作家的图书, 馆长正快马加鞭采购中........\n", author);
		}
	}
}			 

//按书名和作者查询图书  sign1 ****** 
void seek_bookByNamAut(struct bookinfo *head)
{
	char bookname[N] , author[N];
	int sign1;
	while(printf("\n请输入要查询的图书书名和图书作者名(注:书名号《》要输入),注意:输入两个 0 表示结束输入!\n"),scanf("%s %s", bookname, author))
	{
		sign1 = 0;
		linklist p = head->next;
		if(strcmp(bookname, "0") == 0)
		{
			printf("\n请输入任意键返回 *查询图书功能菜单界面 *........\n");
			scanf("%*c%*c");
			return;
		}
		while(p)
		{
			if(strcmp(p->bookname, bookname) == 0 && strcmp(p->author, author) == 0)
			{
				printf("\t\t\t\t\t\t\t\t\t馆内%s作家的%s图书信息为:\n", author, bookname);
		         printf("%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n","图书编号:","书名:", "图书作者:",
			 			"出版社:", "图书分类:", "图书字数:", "图书出版时间:", "图书价格;", "图书库存:", "图书位置:");
		        printf("\n%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s%-17s\n", p->num, p->bookname, p->author, p->press, p->category, 
						p->wordnum, p->pubtime, p->price, p->amount, p->location);
				sign1 = 1;
				break; 
			}
			p = p->next;
		}
		if(sign1 == 0){
			printf("\n亲爱的用户非常抱歉,馆内无%s作家的%s图书, 馆长正快马加鞭采购中........\n", author, bookname);
		}
	}	
}

//系统用户登录注册界面
void Menu1()
{
	system("cls");
	printf("===============================================\n");
	printf("=                                             =\n");
	printf("=     *欢 迎 使 用 图 书 管 理 系 统 1.0      =\n");
	printf("=      该界面为:*系统用户登录注册界面*       =\n");
	printf("=     1: 登录  2:新用户注册  0: 退出系统     =\n");
	printf("=                                             =\n");
	printf("=    (系统版权归201916020321刘泽宇所属)     =\n");
	printf("===============================================\n");
	printf("请输入菜单项:\n");	
} 

//系统用户注册界面
void Menu2()
{
	system("cls");
	printf("====================================\n");
	printf("=                                  =\n");
	printf("=   该界面为:*系统用户注册界面*   =\n");
	printf("=     1: 注册账号                  =\n");
	printf("=     2:返回 *用户登录注册界面*   =\n");
	printf("=     0: 退出系统                 =\n");
	printf("=                                  =\n");
	printf("====================================\n"); 
	printf("请输入选项:\n");
}

//用户登录注册界面
void Menu3()
{
	system("cls");
	printf("====================================\n");
	printf("=                                  =\n");
	printf("=   该界面为:*系统用户登录界面*   =\n");
	printf("=      1:登录                     =\n");
	printf("=      2:返回 *用户登录注册界面*  =\n");
	printf("=      0: 退出系统                 =\n"); 
	printf("=                                  =\n");
	printf("====================================\n");
	printf("请输入选项:\n");
}

//旧书下架功能选项菜单 
void Menu4()
{
	system("cls");
	printf("============================================\n");
	printf("=                                          =\n");
	printf("=   该界面为:*旧书下架功能选项菜单界面*   =\n");
	printf("=      1:按书名删除图书                   =\n");
	printf("=      2:按出版时间删除图书               =\n");
	printf("=      3:返回 *管理员菜单界面*            =\n"); 
	printf("=                                          =\n");
	printf("============================================\n");
	printf("请输入选项:\n");
} 

//查询图书功能菜单界面 
void Menu5()
{
	system("cls");
	printf("============================================\n");
	printf("=                                          =\n");
	printf("=   该界面为:*查询图书功能菜单界面*       =\n");
	printf("=      1:按书名查询图书                   =\n");
	printf("=      2:按出版时间查询图书               =\n");
	printf("=      3:按作者查询图书                   =\n"); 
	printf("=      4:按书名和作者名查询               =\n");
	printf("=      5:返回 *上一界面*                  =\n"); 
	printf("=                                          =\n");
	printf("============================================\n");
	printf("请输入选项:\n");
} 

// 管理员菜单界面 
void Menu_admist()
{
	system("cls");
	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("=     7: 图书信息修改                    =\n");
	printf("=     8: 旧书下架                        =\n");
	printf("=     9: 查看当前馆内所有图书信息        =\n");
	printf("=     0: 退出系统                        =\n");
	printf("=                                        =\n");
	printf("==========================================\n");
}

// 普通用户菜单界面 
void Menu_user() 
{
	system("cls");
	printf("============================================\n");
	printf("=                                          =\n");
	printf("=   欢迎来到 *系统普通用户功能菜单界面*    =\n");
	printf("=     1: 重置密码                          =\n");
	printf("=     2: 查询图书信息                      =\n");
	printf("=     3: 查看馆内所有图书信息              =\n");
	printf("=     0: 退出系统                          =\n");
	printf("=                                          =\n");
	printf("============================================\n");
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值