#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;
}
C语言写基础图书馆管理系统框架
最新推荐文章于 2023-02-24 22:54:45 发布