1、介绍
某末流高校的大一C语言程序设计大作业,自己主要啃的C语言教程写的这个系统,大约花了半个月时间完成,有许多不足之处,主要是自己水平不足,大家多多指正。
2、实现的功能
开发一个简单的图书信息管理系统, 服务于图书管理员和普通用户,方便管理员和普通用户使用图书馆内的图书资源,使图书资源到达最大化利用。
2.1 图书管理员功能性需求
2.1.1用户信息方面:
- 批量创建普通读者账号(用户名为学生学号,用户密码可统一初始化。 并将用户信息存储到指定文件“userinfo.dat”中)。
- 批量删除普通读者账号。
- 可重置单个用户密码。
- 查看馆内所有用户信息。(添加的新功能)
2.1.2图书信息方面:
- 新书入库。书籍信息可保存到指定文件“bookinfo.dat”中。
- 图书信息查询。支持以下几种查询方式:(a)按书名查询(精确查找)
(b)按作者名查询 ( c )按出版社查询 (d)按书名和作者名查询(多条件 查询)。 - 图书信息修改。
- 旧书下架。将指定图书删除,可(a)按书名删除(单种删除)(b) 按出版时间删除(批量删除)。
- 看出馆内所有图书信息。(添加的新功能)
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");
}