C语言写基础图书馆管理系统框架

#include <iostream>//相比stdio.h更优秀,一种安全性的头文件,以及后面会用到数据流清空函数
#include <conio.h>
#include <windows.h>
#include <time.h>//读取时间头文件
#include <string.h>//内含字符串复制,比较等函数
#include <stdlib.h>//调用头文件
using namespace std;//C++习惯性行为,虽然本篇设计没有使用
int N;//图书本数
char key[20] = "1";//设置初始密码
struct book//定义图书结构体类型
{
	int number;//图书索引号
	char name[20];//图书名称
	char address[10];//图书存放地址
	char type[11];//图书类别
	long price;//入库价格
	struct time//入库日期
	{
		int day;
		int month;
		int year;
	}t;
	int lent_number;//被借次数
	int lent=0;//被借状态
	struct back//归还日期
	{
		int day;
		int month;
		int year;
	}back;
	
}book[200];
/****判断并维护时间是否输入正确的函数****/
int maintenance_time(int year, int month, int day)
{
	if (month > 12 || month < 1)//判断输入月份
	{
		return -1;//-1返回值代表输入错误
	}
	else
	{
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//考虑闰年
		{
			if (month == 2)//闰年二月29天
			{
				if (day > 29 || day < 1)
					return -1;
				else
					return 1;
			}
		}
		if (month == 4 || month == 6 || month == 9 || month == 11)//考虑月份日期为30天的月份
		{
			if (day < 1 || day>30)
				return -1;
			else return 1;
		}
		else if (month != 2)//考虑剩余月份情况
		{
			if (day < 1 || day>31)
				return -1;
			else
				return 1;
		}
		else
		{
			if (day < 1 || day>28)
				return -1;
			else
				return 1;
		}
	}
	return 1;
}
/*****图书信息库*****/
void information()
{
	int i, input, g;//i为循环数,input为输入,g为返回数
	system("CLS");//简单的清屏函数
	printf("\t\t         =====================        \n");
	printf("\t\t               录入图书信息              \n");
	printf("\t\t         =====================        \n\n");
	do//判断录入数量是否大于等于0,若小于0则提醒重新输入
	{
	    g = 0;
		printf("\t\t请输入您要录入的数量:");
		scanf("%d", &input);
		if (input >= 1)
		{
			g = 1;
		}
		else
		{
			printf("\t\t输入有误请重新输入!\n");
			g = 2;
			cin.clear(); cin.sync();//先将错误改回0并进行重新输入,再清空已输入信息,达到防死循环效果
		}
	} while (g == 2);
	i = N;
	N += input;
	for (; i < N; i++)//图书信息录入
	{
		printf("\t\t请输入第%d本书的编号:", i + 1);
		scanf("%d", &book[i].number);
		printf("\t\t请输入第%d本书的名称:", i + 1);
		scanf("%s", book[i].name);
		printf("\t\t请输入第%d本书的馆藏地址:", i + 1);
		scanf("%s", book[i].address);
		printf("\t\t请输入第%d本书的价格:", i + 1);
		scanf("%d", &book[i].price);
		printf("\t\t请输入第%d本书的类别:", i + 1);
		scanf("%s", book[i].type);
		do
		{
			printf("\t\t请输入第%d本书的|正确|入库日期(用逗号隔开):", i + 1);
			scanf("%d,%d,%d", &book[i].t.year, &book[i].t.month, &book[i].t.day);
		}while(maintenance_time(book[i].t.year, book[i].t.month, book[i].t.day)==-1);
		printf("\t\t-----------------------------------------------\n");
	}
	system("CLS");//清屏
	printf("\t\t         =====================        \n");
	printf("\t\t               信息录入完成              \n");
	printf("\t\t         =====================        \n");
	printf("\n\t\t             按任意键继续...\n");
}
/******主菜单******/
int menu()
{
	char x ;
	printf("\n\n\n\n\n");
	printf("\t\t            |-------------------------------------------|\n");
	printf("\t\t            |                                           |\n");
	printf("\t\t            |          =========================        |\n");
	printf("\t\t            |          南京邮电大学图书管理系统         |\n");
	printf("\t\t            |          =========================        |\n");
	printf("\t\t            |                                           |\n");
	printf("\t\t            |             1:管理员入口                  |\n");
	printf("\t\t            |             2:学生/老师入口               |\n");
	printf("\t\t            |             3:休闲游戏                    |\n");
	printf("\t\t            |             4:退出                        |\n");
	printf("\t\t            |-------------------------------------------|\n");
	printf("\n\n\n\t\t          请选择:");
	
	scanf("%s",&x);
	return x;
}
/**************管理员密码验证*****************/
int identity_code()
{
	char tempkey[20];//用来存放用户输入的密码。全局变量初始密码在最前面
	printf("\n");
	printf("\t\t         ======================        \n");
	printf("                                           \n  ");
	printf("\t\t           欢迎使用图书管理系统            \n");
	printf("\t\t                管理员模式              \n  ");
	printf("                                             \n");
	printf("\t\t         ======================        \n");
	printf("\n");
	printf("\t\t          请输入密码:");
	int index = 0;//使用#号保护密码
	char cover;//覆盖变量
	int maxlen=20;//密码的最大长度
	while ((cover = getch()) != '\r')//当正常输入时,可进行覆盖操作
	 {

		if (cover == '\b' && index != 0)//此处进行密码输入退格
		 {
			index--;
			printf("\b \b");
		}
		else if (index < maxlen - 1 && cover != '\b') {
			tempkey[index++] = cover;//输入将被保存,而输出全为#号
			putchar('#');//输出#号
		}
	}
	tempkey[index] = '\0';//将保存密码的最后一位令为\0,可使比较操作正常进行
	if (strcmp(tempkey, key) == 0)//比较密码是否相同
		return 1;
	else
		return 0;
}
/**************修改密码***********/
void key_correction()
{
	char tempkey[20], temp1[20], temp2[20];/* temp_key[20]用来存放用户输入的密码,temp1[20],temp2[
20]分别用来存放用户输入的两次修改的密码*/
	printf("\n");
	printf("\t\t         ======================        \n");
	printf("\t\t                 修改密码                 \n");
	printf("\t\t         ======================        \n");
	printf("\n");
	printf("\t\t           请输入原始密码:");
	scanf("\t\t%s", tempkey);
	while (1)
	{
		if (strcmp(tempkey,key) == 0)//等于0则表示字符串相同
		{
			printf("\t请输入新密码:");
			scanf("%s", temp1);
			printf("\t请再输入一次:");//确认密码缓解
			scanf("%s", temp2);
			if (strcmp(temp1, temp2) == 0)
			{
				printf("\t修改密码成功!!您的密码为,任意键返回...");
				strcpy(key, temp1);//将正确密码存放到密码中
				system("pause"); break;
			}
			else
			{
				printf("\t输入两次密码不相同,修改失败!任意键返回...");
				system("pause");
				break;
			}
		}
		else
		{
			printf("\t密码错误!您不能进行密码修改!任意键返回...");
			system("pause");
			break;
		}
	}
}
/**************管理员窗口****************/
int administrator()
{
	char x;
	printf("\n\n\n\n");
	printf("\t\t|----------------------------------------|\n");
	printf("\t\t|                                        |\n");
	printf("\t\t|        ======================          |\n");
	printf("\t\t|               管理员模式               |\n");
	printf("\t\t|        ======================          |\n");
	printf("\t\t|                                        |\n");
	printf("\t\t|           1.录入图书信息               |\n");
	printf("\t\t|           2.查看图书信息               |\n");
	printf("\t\t|           3.修改图书信息               |\n");
	printf("\t\t|           4.修改管理密码               |\n");
	printf("\t\t|           5.退出系统                   |\n");
	printf("\t\t|----------------------------------------|\n");
	printf("\n\t\t请输入您的选择:");
	scanf("%s", &x);
	return x;
}
/***************学生/老师窗口********************/
int visitor()
{
	char x;
	printf("\n\n\n\n");
	printf("\t\t|----------------------------------------|\n");
	printf("\t\t|                                        |\n");
	printf("\t\t|        ======================          |\n");
	printf("\t\t|               欢迎光临                 |\n");
	printf("\t\t|        ======================          |\n");
	printf("\t\t|                                        |\n");
	printf("\t\t|           1.查看图书信息               |\n");
	printf("\t\t|           2.借阅图书                   |\n");
	printf("\t\t|           3.退出系统                   |\n");
	printf("\t\t|----------------------------------------|\n");
	printf("\n\t\t请输入您的选择:");
	scanf("%s", &x);
	return x;
}
/*********查看所有图书*******/
void all_book()
{
	int i,j,k;//三者均为循环使用变量
	struct book book_temp[200];//定义图书暂存数组,防止在修改过程中将原图书信息改动
	struct book book_internal[2];//中间数组,在以借阅次数排序中会使用
	for (i = 0; i < N; i++)
	{
		book_temp[i] = book[i];/*从此处开始进行按借阅次数排序。
		将所有的信息先存到暂用数组是为了避免原本信息被恶意修改,
		也可以防止在排序时将原本书库顺序改动*/

	}
	for (i = 0; i < N; i++)
	{
		k = i;
		for (j = i + 1; j < N + 1; j++)
		{
			if (book_temp[j].lent_number > book_temp[k].lent_number)//此处利用经典选择排序算法
			{
				k = j;//将位次大的下标赋给K
			}
		}
		book_internal[1] = book_temp[k]; //此处利用经典选择排序算法,依次将最大的放到前面
		book_temp[k] = book_temp[i];
		book_temp[i] = book_internal[1];
	}
	if (book[0].number == 0 && book[0].t.year == 0 || N == 0)
		printf("\t数据不存在,请先录入数据!\n\t\t按任意键返回...");
	else
	{
		printf("\t 编号     图书名称       馆藏地址     价格    类别       入库日期            归还日期         借阅次数     状态\n");
		for (i = 0; i < N; i++)
		{
			printf("\t%3d%20s   %8s    %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日   %d      ", book_temp[i].number,
			 book_temp[i].name, book_temp[i].address, book_temp[i].price, book_temp[i].type, 
			 book_temp[i].t.year, book_temp[i].t.month, book_temp[i].t.day, book_temp[i].back.year, book_temp[i].back.month, 
			 book_temp[i].back.day,book_temp[i].lent_number);
			if (book_temp[i].lent == 0)
				printf("    可以借阅\n");
			else
				printf("    已借阅完\n");
		}
	}
}
/****游客查看所有图书****/
void visitor_all_book()//所有注释基本同上一个函数
{
	int i,j,k;//循环使用变量
	struct book book_temp[200];
	struct book book_internal[2];
	for (i = 0; i < N; i++)
	{
		book_temp[i] = book[i];/*从此处开始进行按借阅次数排序。
		将所有的信息先存到暂用数组是为了避免原本信息被恶意修改,
		也可以防止在排序时将原本书库顺序改动*/

	}
	for (i = 0; i < N; i++)
	{
		k = i;
		for (j = i + 1; j < N + 1; j++)
		{
			if (book_temp[j].lent_number > book_temp[k].lent_number)//此处利用经典选择排序算法
			{
				k = j;
			}
		}
		book_internal[1] = book_temp[k]; //此处利用经典选择排序算法,依次将最大的放到前面
		book_temp[k] = book_temp[i];
		book_temp[i] = book_internal[1];
	}
	if (book[0].number == 0 && book[0].t.year == 0 || N == 0)
		printf("\t数据不存在,请先录入数据!\n\t\t按任意键返回...");
	else
	{
		printf("\t 编号     图书名称       馆藏地址        类别    借阅次数   状态\n");
		for (i = 0; i < N; i++)
		{
			printf("\t%3d%20s   %8s     %10s   %d      ", book_temp[i].number,
			 book_temp[i].name, book_temp[i].address, book_temp[i].type, book_temp[i].lent_number);
			if (book_temp[i].lent == 0)
				printf("  可以借阅\n");
			else
				printf("  已借阅完\n");
		}
	}
}
/*********按书名查看********/
void showbook_name()
{
	int i, k = 0, n;//K用来标记是否存在该书
	char book_name[20];
	printf("\t\t         =====================        \n");
	printf("\t\t               按书名查看                \n");
	printf("\t\t         =====================        \n");
	printf("\n\t\t请输入您要查看的图书名称:");
	scanf("%s", book_name);
	for (i = 0; i < N; i++)
		if (strcmp(book_name, book[i].name) == 0)//通过计算找到该书对应位置
		{
			n = i;
			if (k == 0)/* "项目"只输出一次*/
				printf("\t 编号     图书名称       馆藏地址      价格    类别       入库日期            归还日期      状态\n");
			printf("\t%3d%20s   %8s      %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[n].number, 
			book[n].name, book[n].address,  book[n].price, book[n].type, book[n].t.year, book[n].t.month, 
			book[n].t.day,book[n].back.year, book[n].back.month, book[n].back.day);
			if (book[n].lent == 1)//判断该书能否借阅
				printf("    已被借阅\n");
			else
				printf("    可以借阅\n");
			
			k++; /*k值不为零则表示找到图书*/
		}
	if (k == 0)  /*k值为零则表示未找到图书*/
		printf("\t不存在该书!按任意键返回...");
}
/*********按书号查看********/
void showbook_number()
{
	int n, book_number, i, k = 0;/*k用来标记是否存在该书*/
	printf("\t\t         =====================        \n");
	printf("\t\t               按书号查看                \n");
	printf("\t\t         =====================        \n");
	printf("\n\t\t请输入您要查看的图书编号:");
	scanf("%d", &book_number);
	for (i = 0; i < N; i++)
		if (book_number == book[i].number)//通过计算找到该书对应位置
		{
			n = i;
			if (k == 0)/*项目只输出一次*/
				printf("\t 编号     图书名称       馆藏地址      价格    类别       入库日期            归还日期      状态\n");
			printf("\t%3d%20s   %8s     %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[n].number, 
			book[n].name, book[n].address,  book[n].price, book[n].type, book[n].t.year, book[n].t.month, 
			book[n].t.day,book[n].back.year, book[n].back.month, book[n].back.day);
			if (book[n].lent == 1)
				printf("已被借阅\n");//判断该书能否借阅
			else
				printf("可以借阅\n");
			k++;
			
		}
	if (k == 0) /*k为零则表示未找到图书*/
		printf("\t不存在该书!按任意键返回...");
}
//计算归还日期是当年的第几天
int returnday(int i)
{
	int summary = 0;//归还图书的日子在一年当中的总天数
	switch (book[i].back.month)//通过Switch结构来判断规划日期应该在哪哥月份
	{
	case 1:summary = book[i].back.day;//假如在一月份,归还日期即为当年归还总日期
		break;
	case 2:summary = 31 + book[i].back.day;//假如不在一月份,则按照每个月的天数进行增加并计算
		break;
	case 3:summary = 59 + book[i].back.day;//此处二月份暂时按照28天进行计算,闰年问题后考虑
		break;
	case 4:summary = 90 + book[i].back.day;
		break;
	case 5:summary = 120 + book[i].back.day;
		break;
	case 6:summary = 151 + book[i].back.day;
		break;
	case 7:summary = 181 + book[i].back.day;
		break;
	case 8:summary = 212 + book[i].back.day;
		break;
	case 9:summary = 243 + book[i].back.day;
		break;
	case 10:summary = 273 + book[i].back.day;
		break;
	case 11:summary = 304 + book[i].back.day;
		break;
	case 12:summary = 334 + book[i].back.day;
		break;
	}
	if (book[i].back.month > 2)//解决闰年问题
	{
		if (((book[i].back.year % 4 == 0)&&(book[i].back.year % 100 != 0))||(book[i].back.year % 400)==0)//闰年条件
		{
			summary = summary + 1;
		}
	}
	return summary;
}
//年与年相差的天数
int year_year_defference(int year1, int year2)
{
	int summary_year_day;
	int i = 0;
	summary_year_day = (year2 - year1) * 365;//按照平年进行计算年与年之间相差时期
	for (i = year1; i < year2; i++)//判断闰年问题
	{
		if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400) == 0) {
			summary_year_day = summary_year_day + 1;
		}
	}
	return summary_year_day;
}
/***获取系统时间并判断对比是否过期***/
int if_expire(int i)
{
	int summary1 = 0;//剩余归还总天数
	struct tm* p;//用指针P来表示该结构体下的所有部分
	time_t timep;//将timep定义为time_t类型
	time(&timep);//获取time_t类型的当前时间,time_t 这种类型就是用来存储从1970年到现在经过的时间
	p = gmtime(&timep);//使用gmtime获取当前时间,获取为year_month_day_hour_minite等模式,没有时区转换
	/***判断是否少于三天***/
	summary1 = year_year_defference(1900 + p->tm_year, book[i].back.year) - p->tm_yday + returnday(i);
	//总天数等于从1900年到预定归还年数天数的差值,加上规定归还日期与今日日期的差值
	//tm_year表示从1900至今已经多少年
	
	if (summary1 >= 0&&summary1 <= 3)
	{
		return 1;//返还1则表示剩余小于三天,需要注意
	}
	if (summary1 > 3)
	{
		return 2;//返还2则表示剩余大于三天
	}
	else
	return 0;//返还0则表示归还日期已经过了
}
/********显示全部已借阅的图书**********/
void already_lent()
{
	int i, total = 0;//total用来判断借出几本书,i为循环变量
	if (book[0].number == 0 && book[0].t.year == 0 || N == 0)
		printf("\t数据不存在,请先录入数据!\n\t\t按任意键返回...");
	else
	{
		printf("\t 编号     图书名称       馆藏地址       价格    类别       入库日期            归还日期         归还状态      \n");
		for (i = 0; i < N; i++)
			if (book[i].back.year == 0 && book[i].back.month == 0 && book[i].back.day == 0)
			{
				;
			}
			else
			{
				
				printf("\t%3d%20s   %8s      %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[i].number, 
				book[i].name, book[i].address, book[i].price, book[i].type, book[i].t.year, book[i].t.month, 
				book[i].t.day, book[i].back.year, book[i].back.month, book[i].back.day);
				if (if_expire(i) == 1)
					{
						printf("    !!!需要在三天内归还\n");
					}
				if (if_expire(i) == 2)
					{
						printf("    未归还,时间充裕\n");
					}
				
				if (if_expire(i) == 0)
					{
					printf("    超过归还时间\n");
					}
				
				total += 1;//表示书已经借出,总借书+1
				
			}
		if (total == 0)
			printf("\n\t\t目前没有任何书借出。按任意键继续...");
		else
		{
			printf("\n\t\t目前共借出%d本书", total);
		}
	}
}
/********显示全部未借阅的图书********/
void not_lent()
{
	int i, totalnot = 0;//totalnot为未借出数目
	if (book[0].number == 0 && book[0].t.year == 0 || N == 0)//判断书是否存在
		printf("\t数据不存在,请先录入数据!\n\t\t按任意键返回...");
	else
	{
		for (i = 0; i < N; i++)
			if (book[i].lent == 0)
			{
				if (totalnot == 0)
					printf("\t 编号     图书名称       馆藏地址     价格    类别       入库日期         \n");
					//total_not刚开始一定等于0,因此只输入一次标题
				printf("\t%3d%20s   %8s    %4d   %10s     %4d年%2d月%2d日   \n",book[i].number, book[i].name, book[i].address,
					
					book[i].price, book[i].type, book[i].t.year, book[i].t.month, book[i].t.day);
				totalnot++;//如果lent=0即没有借出过书,则未借书+1
			}
		if (totalnot == 0)
			printf("\n\t很遗憾!目前所有的书都被借出了。按任意键继续...");
	}
}
/*****查看图书菜单******/
void show()
{
	char x;
	do
	{
		system("cls");
		printf("\n\n\n\n");
		printf("\t\t|-----------------------------------------|\n");
		printf("\t\t|                                         |\n");
		printf("\t\t|         =====================           |\n");
		printf("\t\t|              查看图书信息               |\n");
		printf("\t\t|         =====================           |\n");
		printf("\t\t|                                         |\n");
		printf("\t\t|           1.按书名查找                  |\n");
		printf("\t\t|           2.按书号查找                  |\n");
		printf("\t\t|           3.查看所有未借阅图书          |\n");
		printf("\t\t|           4.查看所有已借阅图书          |\n");
		printf("\t\t|           5.查看所有图书                |\n");
		printf("\t\t|           6.返回主菜单                  |\n");
		printf("\t\t|-----------------------------------------|\n");
		printf("\n\t\t请输入您的选择:");
		scanf("%s", &x);
		switch (x)
		{
		case '1':system("cls"); showbook_name(); system("pause"); break;/*按书名查看*/
		case '2':system("cls"); showbook_number(); system("pause"); break;/*按书号查看*/
		case '3':system("cls"); not_lent(); system("pause"); break;/*查看未借阅图书*/
		case '4':system("cls"); already_lent(); system("pause"); break;/*查看已借阅图书*/
		case '5':system("cls"); all_book(); system("pause"); break;/*查看所有图书*/
		}
	} while (x!='6');
}
/*******8学生老师查看图书窗口*********/
void visitor_show()
{
	char x;
	do
	{
		system("cls");
		printf("\n\n\n\n");
		printf("\t\t|-----------------------------------------|\n");
		printf("\t\t|                                         |\n");
		printf("\t\t|         =====================           |\n");
		printf("\t\t|              查看图书信息               |\n");
		printf("\t\t|         =====================           |\n");
		printf("\t\t|                                         |\n");
		printf("\t\t|           1.按书名查找                  |\n");
		printf("\t\t|           2.按书号查找                  |\n");
		printf("\t\t|           3.查看所有未借阅图书          |\n");
		printf("\t\t|           4.查看所有图书状态            |\n");
		printf("\t\t|           5.返回主菜单                  |\n");
		printf("\t\t|-----------------------------------------|\n");
		printf("\n\t\t请输入您的选择:");
		scanf("%s", &x);
		switch (x)
		{
		case '1':system("cls"); showbook_name(); system("pause"); break;/*按书名查看*/
		case '2':system("cls"); showbook_number(); system("pause"); break;/*按书号查看*/
		case '3':system("cls"); not_lent(); system("pause"); break;/*查看未借阅图书*/
		case '4':system("cls"); visitor_all_book(); system("pause"); break;
		}
	} while (x !='5');
}
/*********按书名借阅*******/
void lent_name()
{
	char borrow[2], name[20];//borrow用来表示是否确定借阅,name表示输入的书名
	int i, book_sign, k = 0;//k用来标记是否存在该书,book_sign表示记录下标
	printf("\t\t         ======================       \n");
	printf("\t\t                按书名借阅               \n");
	printf("\t\t         ======================       \n");
	while (1)
	{
		printf("\n\t\t请输入书名:");
		scanf("%s", name);
		for (i = 0; i < N; i++)
			if (strcmp(book[i].name, name) == 0 && book[i].lent != 1)/*确认到图书没有被借出,则记录图书下标*/
			{
				book_sign = i;
				k = 1;
			}
		if (k == 0)
		{
			printf("\t不存在该书,或该书已经借出!请正确输入图书名称!\n\t\t按任意键返回...");
			system("pause");
			break;
		}
		if (k == 1)
			printf("\t 编号     图书名称       馆藏地址      价格    类别       入库日期            归还日期         状态\n");
		printf("\t%3d%20s   %8s      %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[book_sign].number, 
		 book[book_sign].name, book[book_sign].address, book[book_sign].price, book[book_sign].address,
		 book[book_sign].t.year, book[book_sign].t.month, book[book_sign].t.day, book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day);
		if (book[book_sign].lent == 1)
			printf("    已被借阅\n");
		else
		{
			printf("    可以借阅\n\t是否借阅?(是:'y',否:'n'):");
			scanf("%s", borrow);
			if (strcmp(borrow, "n") == 0)//字符串判断是否可以借阅
			{
				printf("\t借阅取消,按任意键返回....");
				system("pause");
				break;
			}
			else if (strcmp(borrow, "y") == 0)
			{
				do
		{
			printf("\t请输入归还日期:(年月日以逗号分隔)");
			scanf("%d,%d,%d", &book[book_sign].back.year, &book[book_sign].back.month, &book[book_sign].back.day);
		}while(maintenance_time(book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day)==-1);
				
				
				printf("\t归还日期:%4d年%2d月%2d日\n", book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day);
				printf("\t借阅成功!按任意键返回...");
				book[book_sign].lent_number += 1;//借阅次数+1
				book[book_sign].lent = 1;//
				system("pause");
				break;
			}
			else
			{
				printf("\t输入有错!按任意键重新输入...");
				system("pause");
				break;
			}
		}
	}
}
/*********按书号借阅*******/
void lent_number()
{
	long i, k = 0, book_sign, book_number;
	//k用来标记是否存在该书,book_sign表示记录下标,book_number表示书号
	char borrow[2];/*borrow用来表示是否确定借阅*/
	printf("\t\t         ======================       \n");
	printf("\t\t                按书号借阅               \n");
	printf("\t\t         ======================       \n");
	while (1)
	{
		printf("\n\t\t请输入书号:");
		scanf("%d", &book_number);
		for (i = 0; i < N; i++)
			if (book[i].number == book_number && book[i].lent != 1)
			{
				book_sign = i;
				k++;
			}
		if (k == 0)//判断书籍是否存在
		{
			printf("\t不存在该书,或该书已经借出!请正确输入图书名称!\n\t\t按任意键返回...");
			system("pause");
			break;
		}
		printf("\t 编号     图书名称       馆藏地址      价格    类别       入库日期            归还日期         状态\n");
		printf("\t%3d%20s   %8s     %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[book_sign].number, 
		book[book_sign].name, book[book_sign].address, book[book_sign].price, book[book_sign].type, 
		book[book_sign].t.year, book[book_sign].t.month, book[book_sign].t.day, book[book_sign].back.year, book[book_sign].back.month,
		book[book_sign].back.day);
		if (book[book_sign].lent == 1)//判断是否被借阅
			printf("    已被借阅\n");
		else
		{
			printf("    可以借阅\n\t是否借阅?(是:'y',否:'n'):");
			scanf("%s", borrow);
			if (strcmp(borrow, "n") == 0)
			{
				printf("\t借阅取消,按任意键返回....");
				system("pause");
				break;
			}
			else if (strcmp(borrow, "y") == 0)//判断是否借阅
			{
				do
		{
			printf("\t请输入归还日期:(年月日以逗号分隔)");
			scanf("%d,%d,%d", &book[book_sign].back.year, &book[book_sign].back.month, &book[book_sign].back.day);
		}while(maintenance_time(book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day)==-1);
				printf("\t归还日期:%4d年%2d月%2d日\n",book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day);
				printf("\t借阅成功!按任意键返回...");
				book[book_sign].lent_number += 1;//总被借阅次数+1
				book[book_sign].lent = 1;//如果书被借完了,显示为全部借出
				system("pause");
				break;
			}
			else
			{
				printf("\t输入有错!按任意键重新输入...");
				system("pause");
				break;
			}
		}
	}
}
/*********借阅图书********/
void lent()
{
	char x;
	do
	{
		system("cls");
		printf("\n\n\n\n");
		printf("\t\t|---------------------------------------|\n");
		printf("\t\t|         =====================         |\n");
		printf("\t\t|                借阅图书               |\n");
		printf("\t\t|         =====================         |\n");
		printf("\t\t|                                       |\n");
		printf("\t\t|            1.按书名借阅               |\n");
		printf("\t\t|            2.按书号借阅               |\n");
		printf("\t\t|            3.查看所有图书             |\n");
		printf("\t\t|            4.返回主菜单               |\n");
		printf("\t\t|---------------------------------------|\n");
		printf("\t\t请输入您的选择:");
		scanf("%s", &x);
		switch (x)
		{
		case '1':system("CLS"); lent_name(); system("pause"); break;/*按书名借阅*/
		case '2':system("CLS"); lent_number(); system("pause"); break;/*按书索引号借阅*/
		case '3':system("cls"); visitor_all_book(); system("pause"); break;/*查看所有图书*/
		}
	} while (x !='4');
}
/***************按书名进行查找并修改信息*************/
void name_correction()
{
	int i, book_sign, k = 0;/*book_sign用来记录下标,k用来判断是否找到该书*/
	char temp[20];/*temp[20]用来存放用户输入的查找的书名*/
	while (1)
	{
		system("cls");
		printf("\n");
		printf("\t\t|         =====================        \n");
		printf("\t\t|             按书名进行修改              \n");
		printf("\t\t|         =====================        \n");
		printf("\t\t请输入您准备修改的图书的名称,输入'exit'退出:");
		scanf("%s", temp);
		if (strcmp(temp, "exit") == 0)//判断是否退出
			break;
		else
		{
			for (i = 0; i < N; i++)
				if (strcmp(temp, book[i].name) == 0)//判断该书所在位置以输出
				{
					book_sign = i;
					printf("\t该书的信息为:\n");
					printf("\t 编号     图书名称       馆藏地址     价格          类别       入库日期            归还日期          状态\n");
					printf("\t%3d%20s   %8s      %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日  ", book[book_sign].number, 
					book[book_sign].name, book[book_sign].address, book[book_sign].price, book[book_sign].type, 
					book[book_sign].t.year, book[book_sign].t.month, book[book_sign].t.day, book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day);
					if (book[book_sign].lent == 1)
						printf("    已被借阅\n");
					else
						printf("    可以借阅\n");
					k++;
					printf("\t\t现在请输入新信息:\n");
					printf("\t\t请输入本书的编号:");
					scanf("%d", &book[book_sign].number);
					printf("\t\t请输入本书的名称:");
					scanf("%s", book[book_sign].name);
					printf("\t\t请输入本书的馆藏地址:");
					scanf("%s", book[book_sign].address);
					printf("\t\t请输入本书的价格:", i + 1);
					scanf("%d", &book[book_sign].price);
					printf("\t\t请输入本书的类别:", i + 1);
					scanf("%s", book[book_sign].type);
					printf("\t\t请输入本书的入库日期(用逗号隔开):");
					scanf("%d,%d,%d", &book[book_sign].t.year, &book[book_sign].t.month, &book[book_sign].t.day);
					printf("\t\t请输入本书的归还日期(用逗号隔开):");
					scanf("%d,%d,%d", &book[book_sign].back.year, &book[book_sign].back.month, &book[book_sign].back.day);
				}
			if (k == 0)//判断是否存在
			{
				printf("\t您输入的书名不存在!按任意键继续...");
				system("pause");
				continue;
			}
			printf("\t恭喜!信息修改成功!任意键返回..."); system("pause"); break;
		}
	}
}
/***************按书号进行查找并修改信息*************/
void number_correction()
{
	int i, book_sign, k = 0;/*book_sign用来记录下标,k用来判断是否找到该书*/
	long temp;/*temp用来存放用户输入的查找的书号*/
	do
	{
		system("cls");
		printf("\n");
		printf("\t\t|         =====================        \n");
		printf("\t\t|             按书号进行修改              \n");
		printf("\t\t|         =====================        \n");
		printf("\t\t请输入您准备修改的图书的图书号,输入'0'退出:");
		scanf("%ld", &temp);
		if (temp == 0)	break;
		else
		{
			for (i = 0; i < N; i++)
				if (temp == book[i].number)//找到该书位置
				{
					book_sign = i;
					printf("\t该书的信息为:\n");
					printf("\t 编号     图书名称       馆藏地址      价格          类别       入库日期            归还日期        状态\n");
					printf("\t%3d%20s   %8s       %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[book_sign].number, book[book_sign].name, 
					book[book_sign].address,  book[book_sign].price, book[book_sign].type, book[book_sign].t.year,
					 book[book_sign].t.month, book[book_sign].t.day, book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day);
					k++;
					if (book[book_sign].lent == 1)
						printf("   已被借阅\n");
					else
						printf("    可以借阅\n");
					printf("现在请输入新信息:\n");
					printf("\t\t请输入本书的编号:");
					scanf("%d", &book[book_sign].number);
					printf("\t\t请输入本书的名称:");
					scanf("%s", book[book_sign].name);
					printf("\t\t请输入本书的馆藏地址:");
					scanf("%s", book[book_sign].address);
					printf("\t\t请输入本书的价格:", i + 1);
					scanf("%d", &book[book_sign].price);
					printf("\t\t请输入本书的类别:", i + 1);
					scanf("%s", book[book_sign].type);
					printf("\t\t请输入本书的入库日期(用逗号隔开):");
					scanf("%d,%d,%d", &book[book_sign].t.year, &book[book_sign].t.month, &book[book_sign].t.day);
					printf("\t\t请输入本书的归还日期(用逗号隔开):");
					scanf("%d,%d,%d", &book[book_sign].back.year, &book[book_sign].back.month, &book[book_sign].back.day);
				}
			if (k == 0)//判断是否存在
			{
				printf("\t您输入的书名不存在!按任意键继续...");
				system("pause"); continue;
			}
			printf("\t恭喜!信息修改成功!任意键返回..."); system("pause"); break;
		}
	} while (temp != 0);
}
/******************按书名删除************/
void logout_name()
{
	int i, book_sign, k = 0;/*book_sign用来存放图书下标,k用标记是否找到书*/
	char if_delete[4], temp_name[20];/*if_delete[2]用来存放'是否'确认删除,temp_name[20]用来存放查找时输入的图书名称*/
	printf("\t输入你要删除的书的名称,输入'0'退出:");
	scanf("%s", temp_name);
	if (strcmp(temp_name, "0") != 0)
	{
		for (i = 0; i < N; i++)
			if (strcmp(temp_name, book[i].name) == 0)//找到该书位置
			{
				book_sign = i;
				printf("\t该书的信息为:\n");
				printf("\t 编号     图书名称       馆藏地址     价格    类别       入库日期            归还日期         状态\n");
				printf("\t%3d%20s   %8s      %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[book_sign].number, book[book_sign].name,
				 book[book_sign].address, book[book_sign].price, book[book_sign].type, book[book_sign].t.year, 
				 book[book_sign].t.month, book[book_sign].t.day, book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day);
				if (book[i].lent == 0)//判断可否借阅
					printf("    可以借阅\n");
				else
					printf("    已借阅完\n");
				k++;
				printf("\t是否要删除该书?是'y',否'n'");
				scanf("%s", if_delete);
				if (strcmp(if_delete, "y") == 0)
				{
					if (book_sign == N - 1)
						N--;
					else
					{
						for (i = 0; i < N; i++)
							book[book_sign + i] = book[book_sign + i + 1];
						N--;
					}
					printf("\t删除成功!\n");
				}
				else
					printf("\t操作被用户取消!任意键返回...");
			}
		if (k == 0)
			printf("\t未找到该书,请核实以后再操作!按任意键返回...."); system("pause");
	}
}
/***************按书号查找并删除***********/
void logout_nubmer()
{
	int i, book_sign, k = 0, temp_number;/*book_sign用来存放图书下标,k用标记是否找到书,temp_number用来存放查找时输入的图书名称*/
	char if_delete[4];/*if_delete[2]用来存放'是否'确认删除*/
	while (1)
	{
		printf("\t输入你要删除的书的书号,输入'0'退出:");
		scanf("%d", &temp_number);
		if (temp_number == 0)
			break;
		else
		{
			for (i = 0; i < N; i++)
				if (temp_number == book[i].number)
				{
					book_sign = i;
					printf("该书的信息为:\n");
					printf("\t 编号     图书名称       馆藏地址     价格    类别       入库日期            归还日期         状态\n");
					printf("\t%3d%20s   %8s      %4d  %10s     %4d年%2d月%2d日   %4d年%2d月%2d日 ", book[book_sign].number, 
					book[book_sign].name, book[book_sign].address,book[book_sign].price, 
					book[book_sign].type, book[book_sign].t.year, book[book_sign].t.month, book[book_sign].t.day, book[book_sign].back.year, book[book_sign].back.month, book[book_sign].back.day);
					if (book[i].lent == 0)
						printf("    可以借阅\n");
					else
						printf("    已借阅完\n");
					k++;
					printf("\t是否要删除该书?是'y',否'n'");
					scanf("%s", if_delete);
					if (strcmp(if_delete, "y") == 0)
					{
						if (book_sign == N - 1)
							N--;
						else
						{
							for (i = 0; i < N; i++)
								book[book_sign + i] = book[book_sign + i + 1];
							N--;
						}
						printf("\t删除成功!\n");
					}
					else
						printf("\t操作被用户取消!任意键返回...");
				}
			if (k == 0)
				printf("\t未找到该书,请核实以后再操作!,按任意键返回...."); system("pause"); break;
		}
	}
}
/************删除图书菜单***************/
void logout_menu()
{
	char x;
	do
	{
		system("cls");
		printf("\t\t|----------------------------------------|\n");
		printf("\t\t|         =====================          |\n");
		printf("\t\t|              删除图书信息               |\n");
		printf("\t\t|         =====================          |\n");
		printf("\t\t|                                        |\n");
		printf("\t\t|            1.按书名删除                 |\n");
		printf("\t\t|            2.按书号删除                 |\n");
		printf("\t\t|            3.返回主菜单                 |\n");
		printf("\t\t|----------------------------------------|\n");
		printf("\t\t请输入您的选项:");
		scanf("%s", &x);
		switch (x)
		{
		case '1':system("cls"); logout_name(); break;
		case '2':system("cls"); logout_nubmer(); break;
		}
	} while (x !='3');
}
/***************修改图书菜单**************/
void correction_menu()
{
	char x;
	do
	{
		system("cls");
		printf("\n\n\n\n");
		printf("\t\t|----------------------------------------|\n");
		printf("\t\t|         =====================          |\n");
		printf("\t\t|               修改图书信息             |\n");
		printf("\t\t|         =====================          |\n");
		printf("\t\t|                                        |\n");
		printf("\t\t|            1.按书名查找                |\n");
		printf("\t\t|            2.按书号查找                |\n");
		printf("\t\t|            3.删除图书                  |\n");
		printf("\t\t|            4.返回主菜单                |\n");
		printf("\t\t|----------------------------------------|\n");
		printf("\t\t请输入您的选择:");
		scanf("%s", &x);
		switch (x)
		{
		case '1':system("CLS"); name_correction(); break;/*按书名查找名修改信息*/
		case '2':system("CLS"); number_correction(); break;/*按书号查找并修改信息*/
		case '3':system("cls"); logout_menu(); break;
		}
	} while (x !='4');
}
/******************游戏模式菜单********************/
int game_time()
{	char x;
	printf("\n\n\n\n");
	printf("\t\t|-----------------------------------------|\n");
	printf("\t\t|                                         |\n");
	printf("\t\t|  ===================================    |\n");
	printf("\t\t|            欢迎进入游戏模式             |\n");
	printf("\t\t|  ===================================    |\n");
	printf("\t\t|                                         |\n");
	printf("\t\t|            1.猜数字游戏                 |\n");
	printf("\t\t|            2.退出                       |\n");
	printf("\t\t|-----------------------------------------|\n");
	printf("\n\t\t请输入您的选择:");
	scanf("%s", &x);
	return x;
}
/**手动猜数字**/
void game_PERSON()
{
	//1.生成一个随机数。
	int random = 0;
	int guess = 0;//接受猜数字
	random = rand() % 100 + 1;//生成1-100之间随机数
	//2.猜数字
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess > random)//判断大小并给出提示
		{
			printf("猜大了\n");
		}
		else if (guess < random)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你猜对了\n");
			break;
		}

	}
}
/**AI猜数字**/
void game_AI()
{
	//1.生成一个随机数。
	int random;
	int i = 0;//最大值
	int j = 100;//最小值
	int guess = 0;//接受猜数字
	random = rand() % 100 + 1;//生成1-100之间随机数
	//2.猜数字
	while (1)
	{
		printf("请猜数字:");
		do
		{
			guess = rand() % 100 + 1;
		} while (guess<=i || guess>=j);
		printf("%d", guess);//输入猜的数字
		if (guess > random)
		{
			printf("猜大了\n");
			j = guess;
		}
		else if (guess < random)
		{
			printf("猜小了\n");
			i = guess;
		}
		else
		{
			printf("恭喜你猜对了\n");
			break;
		}
		;
		Sleep(2000);//休眠函数,模拟每次猜数的思考时间
	}
}
/***猜数字菜单***/
void game_timemenu()
{
	printf("\n\n\n\n");
	printf("        *****************************************************************\n");
	printf("                           猜一个1-100间的数\n");
    printf("                   请选择:0.退出游戏 1.AI自动猜数字 2.手动猜数字\n");
	printf("        *****************************************************************\n");
}
/***猜数字主体***/
int game_body()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	/*设置随机种子,这个种子会对应一个随机数,
	用在random()函数前面,以此可以防止出现"伪随机"现象,
	使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,
	然后将time_t型数据转化为(unsigned)型再传给srand函数*/
	do
	{
		system("cls");
		game_timemenu();//菜单函数
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)//根据选择决定接下来的功能
		{

		case 1:
			game_AI();//AI自动猜函数
			printf("按任意键继续...");
			system("pause");
			break;
		case 0:
			printf("退出游戏\n");
			printf("按任意键继续...");
			break;
		case 2:
			game_PERSON();//手动玩游戏函数
			printf("按任意键继续...");
			system("pause");
			break;
		default:
			printf("选择错误\n");
			printf("按任意键继续...");
			system("pause");
			break;
		}
	} while (input);
	return 0;
}
/**************主函数**************/
int main()
{
	int  s,k;//s用来判断密码验证的结果,k是循环变量
	char x,x2;//两个返回值用于整体运行
	N = 0;//此处N为全局变量图书书目
	/**打开调用文件**/
	FILE* fp;
	fp = fopen("C:\\Users\\86173\\Desktop\\t1.txt", "a+");//fp为文件指针,可通过fp来实现对文件的操作
	//打开方式为a+可以打开可读可写的文件,此处仅进行读取
	if (fp == NULL)//若打开文件失败,fopen会返回NULL
	{
		printf("Fail to open file!");
		system("pause");//防止闪退
		exit(1);
	}
	rewind(fp);//文件内指针回溯到文件最初,进行读取全文
	fscanf(fp, "%d", &N);
	for (k = 0; k < N; k++)
	{
		fscanf(fp, "%d", &book[k].number);
		fscanf(fp, "%s", book[k].name);
		fscanf(fp, "%s", book[k].address);
		fscanf(fp, "%d", &book[k].price);
		fscanf(fp, "%s", book[k].type);
		fscanf(fp, "%d", &book[k].t.year);
		fscanf(fp, "%d", &book[k].t.month);
		fscanf(fp, "%d", &book[k].t.day);
		fscanf(fp, "%d", &book[k].back.year);
		fscanf(fp, "%d", &book[k].back.month);
		fscanf(fp, "%d", &book[k].back.day);
	}
	fclose(fp);//关闭文件
	do
	{
		system("cls"); x = menu();
		switch (x)
		{
		case '1':/************调用管理员窗口函数***********/
			system("cls");
			s = identity_code();/*密码验证*/
			do
			{
				if (s == 1)
				{
					system("cls");
					x2 = administrator();//管理员窗口
					switch (x2)
					{
					case '1':system("cls"); information(); system("pause"); break;/*录入信息*/
					case '2':system("cls"); show(); break;/*查看信息*/
					case '3':system("cls"); correction_menu(); break;/*修改信息*/
					case '4':system("cls"); key_correction(); break;/*修改密码*/
					
					}
				}
				else
				{
					printf("\t错误!按任意键返回...");
					system("pause");
					break;
				}
			} while (x2!='5'); break;
		case '2':/*调用学生老师窗口函数*/
			do
			{
				system("cls");
				x2 = visitor();//访客窗口
				switch (x2)
				{
				case '1':system("cls"); visitor_show(); system("pause"); break;/*查看图书信息*/
				case '2':system("cls"); lent(); system("pause"); break;/*借阅图书*/
				}
			} while (x2 !='3'); break;
		case '3'://游戏窗口
			do
			{
				system("cls");
				x2 = game_time();
				switch (x2)
				{
				case '1':system("cls"); game_body(); system("pause"); break;/*猜数字游戏*/
				case '2':system("cls"); lent(); system("pause"); break;/*借阅图书*/
				}
			} while (x2 !='3');
		}
	} while (x != '4');
	system("cls");
	printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t谢谢使用!\n\t\t\t");
	/**保存文件**/
	fp = fopen("C:\\Users\\86173\\Desktop\\t1.txt", "w+");//fp为文件指针,可通过fp来实现对文件的操作
	//使用w+打开文件表示将源文件覆盖掉,将book[N]的内容重新全部写到文件中
	if (fp == NULL)//若打开文件失败,fopen会返回NULL
	{
		printf("Fail to open file!");
		system("pause");
		exit(1);
	}
	fprintf(fp, "%d\n", N);
	for (k = 0; k < N; k++)
	{
		fprintf(fp, "%d ", book[k].number);
		fprintf(fp, "%s ", &book[k].name);
		fprintf(fp, "%s ", &book[k].address);
		fprintf(fp, "%d ", book[k].price);
		fprintf(fp, "%s ", &book[k].type);
		fprintf(fp, "%d ", book[k].t.year);
		fprintf(fp, "%d ", book[k].t.month);
		fprintf(fp, "%d ", book[k].t.day);
		fprintf(fp, "%d ", book[k].back.year);
		fprintf(fp, "%d ", book[k].back.month);
		fprintf(fp, "%d\n", book[k].back.day);
	}
	fclose(fp);//关闭文件
	system("pause");
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值