实现了一个简易的图书管理系统,可进行管理员和读者的登陆。能完成对管理员,读者和图书数据的增删改查,按页显示数据,批量导入导出数据,借书还书功能。
用三个结构体记录管理员,读者和图书三种数据。
typedef struct Book{
char idOfBook[10]; //图书id
char nameOfBook[40]; //书名
char artistOfBook[40]; //作者
char timeOfBook[20]; //出版时间
char clubOfBook[40]; //出版社
int moneyOfBook; //售价
float scoreOfBook; //评分
int beReadTime; //借阅次数
int stateOfBook; //图书状态
long readBookTime; //借阅时间
}Book;
typedef struct Gm{
char idOfGm[10]; //管理员id
char passwordOfGm[20]; //管理员密码
char nameOfGm[40]; //管理员姓名
char workOfGm[40]; //管理员岗位
}Gm;
typedef struct Reader{
char idOfReader[10]; //读者id
char passwordOfReader[20]; //读者密码
char nameOfReader[40]; //读者姓名
char birthOfReader[20]; //读者生日
char phoneOfReader[20]; //读者电话
int moneyOfReader; //余额
char haveReadBook[10][40]; //已借图书
char haveForwardBook[5][40]; //已预约图书
}Reader;
初始化定义数据,其中超级管理员的账号和密码需要先保存在数据库中。
//超级管理员账号
Gm superGm={};
//定义初始的id
char idGm[10]="10000001";
char idReader[10]="20000001";
char idBook[10]="30000001";
//定义结构体的长度
int sizeofGm=sizeof(Gm);
int sizeofReader=sizeof(Reader);
int sizeofBook=sizeof(Book);
//定义管理员结构体数组
int capGm=10;
int sizeGm=0;
Gm *pGm=NULL;
//定义读者结构体数组
int capReader=10;
int sizeReader=0;
Reader *pReader=NULL;
//定义图书结构体数组
int capBook=10;
int sizeBook=0;
Book *pBook=NULL;
程序开始先读取数据,这里以读取管理员为例。
int load_gm(){
int num=0;
FILE *pfGm=fopen("./data/gm.txt","r");
if(pfGm==NULL){
perror("fopen");
exit(-1);
}
fread(&idGm,10,1,pfGm);
Gm g1={};
fread(&g1,sizeofGm,1,pfGm);
superGm=g1;
while(fread(&g1,sizeofGm,1,pfGm)>0){
int res=add_gm_file(g1);
if(res==0){
num++;
}
}
fclose(pfGm);
return num;
}
然后是显示界面,并跳转至功能函数
#include "data.h"
#include "show.h"
#include "gm.h"
#include "book.h"
#include "reader.h"
/*
函数功能:显示主界面
没有返回数据
*/
void main_menu(void){
system("clear");
printf("--------图书管理系统--------\n");
printf("1.检索图书\n");
printf("2.管理员登录\n");
printf("3.读者登录\n");
printf("0.退出系统\n");
printf("operater:");
}
/*
函数功能:显示图书管理员的工作界面
没有返回数据
*/
void gm_book_menu(){
system("clear");
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("0.返回主菜单\n");
}
/*
函数功能:实现图书管理员的各项功能
形参:char *id 登录的管理员的id
*/
void welcome_gm_book(char *id){
while(1){
gm_book_menu();
int opt;
printf("operater:");
scanf("%d",&opt);
switch(opt){
case 1:{
change_gm(id);
stop();
break;
}
case 2:{
add_book();
stop();
break;
}
case 3:{
del_book();
stop();
break;
}
case 4:{
change_book();
stop();
break;
}
case 5:{
search_books();
stop();
break;
}
case 6:{
list_book();
stop();
break;
}
case 7:{
add_books();
stop();
break;
}
case 8:{
dump_books();
stop();
break;
}
case 0:return;
}
}
}
void gm_reader_menu(){
system("clear");
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("0.返回主菜单\n");
}
/*
函数功能:显示读者管理员的工作界面
没有返回数据
形参:char *id 登录的管理员id
*/
void welcome_gm_reader(char *id){
while(1){
gm_reader_menu();
int opt;
printf("operater:");
scanf("%d",&opt);
switch(opt){
case 1:{
change_gm(id);
stop();
break;
}
case 2:{
add_reader();
stop();
break;
}
case 3:{
del_reader();
stop();
break;
}
case 4:{
find_reader();
stop();
break;
}
case 5:{
list_reader();
stop();
break;
}
case 6:{
add_money();
stop();
break;
}
case 7:{
add_readers();
stop();
break;
}
case 8:{
dump_readers();
stop();
break;
}
case 0:return;
}
}
}
void super_menu(){
system("clear");
printf("超级管理员界面:\n");
printf("1.修改用户名密码\n");
printf("2.添加管理员\n");
printf("3.删除管理员\n");
printf("4.批量导入管理员\n");
printf("5.批量导出管理员\n");
printf("6.列出管理员名单\n");
printf("0.返回主菜单\n");
}
/*
函数功能:显示超级管理员的工作界面
没有返回数据
*/
void welcome_supergm(){
while(1){
super_menu();
int opt;
printf("operater:");
scanf("%d",&opt);
switch(opt){
case 1:{
change_supergm();
stop();
break;
}
case 2:{
add_gm();
stop();
break;
}
case 3:{
del_gm();
stop();
break;
}
case 4:{
add_gms();
stop();
break;
}
case 5:{
dump_gms();
stop();
break;
}
case 6:{
list_gm();
stop();
break;
}
case 0:return;
default:break;
}
}
}
void reader_menu(){
system("clear");
printf("读者界面:\n");
pingfen_top();
redu_top();
printf("1.修改密码\n");
printf("2.搜索图书\n");
printf("3.列出所有图书\n");
printf("4.借书\n");
printf("5.预约\n");
printf("6.还书\n");
printf("0.返回主菜单\n");
}
/*
函数功能:显示读者的工作界面
没有返回数据
形参: char *id 登录的读者id
*/
void welcome_reader(char *id){
while(1){
reader_menu();
note(id);
int opt;
printf("operater:");
scanf("%d",&opt);
switch(opt){
case 1:{
change_reader(id);
stop();
break;
}
case 2:{
search_books();
stop();
break;
}
case 3:{
list_book();
stop();
break;
}
case 4:{
takebook(id);
stop();
break;
}
case 5:{
forwardbook(id);
stop();
break;
}
case 6:{
backbook(id);
stop();
break;
}
case 0:return;
}
}
}
/*
函数功能:管理员登录界面 读取id和密码
没有返回数据
*/
void log_gm(){
system("clear");
printf("输入0返回主菜单。\n");
printf("输入您的管理员ID(1000xxxx):");
char id[10];
scanf("%s",id);
if(strcmp(id,"0")==0){
return;
}
printf("输入您的密码:");
char password[20];
scanf("%s",password);
if(strcmp(password,"0")==0){
return;
}
test_gm(id,password);
}
/*
函数功能:读者登录界面 读取id和密码
没有返回数据
*/
void log_reader(){
system("clear");
printf("输入0返回主菜单。\n");
printf("输入您的读者ID(2000xxxx):");
char id[10];
scanf("%s",id);
if(strcmp(id,"0")==0){
return;
}
printf("输入您的密码:");
char password[20];
scanf("%s",password);
if(strcmp(password,"0")==0){
return;
}
test_reader(id,password);
}
/*
函数功能:检查管理员登录结果
没有返回数据
形参:
char *id 输入的id
char *password 输入的密码
*/
void test_gm(char *id,char *password){
int right=0;
right=check(id,password);
if(right==3){
welcome_supergm();
}
if(right==2){
welcome_gm_reader(id);
}
if(right==1){
welcome_gm_book(id);
}
if(right==0){
printf("输入0返回主菜单\n");
printf("输入1重试\n");
int opt;
printf("operater:");
scanf("%d",&opt);
switch(opt){
case 0:return;
case 1:{
log_gm();
break;
}
}
}
}
/*
函数功能:检查读者的登录结果
没有返回数据
形参:
char *id 输入的id
char *password 输入的密码
*/
void test_reader(char *id,char *password){
int right=0;
right=check(id,password);
if(right==4){
welcome_reader(id);
}else{
printf("输入0返回主菜单\n");
printf("输入1重试\n");
int opt;
printf("operater:");
scanf("%d",&opt);
switch(opt){
case 0:return;
case 1:{
log_reader();
break;
}
}
}
}
void run(void){
printf("按回车键进入系统\n");
getchar();
while(1){
main_menu();
int opt=0;
scanf("%d",&opt);
switch(opt){
case 1: {
search_books();
stop();
break;
}
case 2:{
log_gm();
break;
}
case 3:{
log_reader();
break;
}
case 0:{
printf("感谢您的使用\n");
return;
}
default:break;
}
}
}
这里以图书功能函数为例
#include "book.h"
/*
函数功能:查找图书
返回查找图书在数组中的下标 没找到则不返回数据
*/
int find_book(){
printf("输入图书ID:");
char id[40];
scanf("%s",id);
int index=search_book(id);
if(index==-1){
printf("查无此书。\n");
return;
}
show_book(pBook[index]);
return index;
}
/*
函数功能:显示修改图书信息的页面
没有返回数据
*/
void change_book(){
int index=find_book();
while(1){
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("0.返回上一级菜单\n");
int opt;
printf("operater:");
scanf("%d",&opt);
if(opt==0){
return;
}else{
change_book_data(index,opt);
}
show_book(pBook[index]);
}
}
/*
函数功能:显示一个图书结构体内的成员信息
没有返回数据
形参: Book b 图书结构体变量
*/
void show_book(Book b){
printf("图书ID:%s ",b.idOfBook);
printf("书名:%s ",b.nameOfBook);
printf("作者:%s ",b.artistOfBook);
printf("\n");
printf("出版时间:%s ",b.timeOfBook);
printf("出版社:%s ",b.clubOfBook);
printf("售价:%d ",b.moneyOfBook);
printf("\n");
printf("评分:%g ",b.scoreOfBook);
printf("借阅次数:%d ",b.beReadTime);
printf("状态:");
switch(b.stateOfBook){
case 1:{
printf("可借阅");
break;
}
case 0:{
printf("已被借阅可预约");
break;
}
case -1:{
printf("已被预约");
break;
}
case -2:{
printf("已被借阅且预约");
break;
}
}
printf("\n");
}
/*
函数功能:添加图书信息到结构体数组中
返回int数据 -1表示添加失败 0表示添加成功
形参:Book b 图书结构体变量
*/
int add_book_file(Book b){
if(pBook==NULL){
pBook=calloc(capBook,sizeofBook);
if(pBook==NULL){
return -1;
}
}
if(sizeBook>=capBook){
pBook=realloc(pBook,2*capBook*sizeofBook);
capBook=2*capBook;
if(pBook==NULL){
return -2;
}
}
pBook[sizeBook]=b;
++sizeBook;
return 0;
}
/*
函数功能:添加图书,读取图书信息
没有返回数据
*/
void add_book(){
Book b={};
strcpy(b.idOfBook,idBook);
add_id(idBook);
printf("输入书名:");
scanf("%s",b.nameOfBook);
printf("输入作者:");
scanf("%s",b.artistOfBook);
printf("输入出版时间:");
scanf("%s",b.timeOfBook);
printf("输入出版社:");
scanf("%s",b.clubOfBook);
printf("输入售价:");
scanf("%d",&b.moneyOfBook);
b.scoreOfBook=0;
b.beReadTime=0;
b.stateOfBook=1;
b.readBookTime=0;
show_book(b);
int res=add_book_file(b);
if(res==0){
printf("添加成功\n");
}else{
perror("add_book_file");
exit(-1);
}
}
void search_books(){
printf("请输入查找关键字:");
char key[40];
scanf("%s",key);
int i,j,f;
int len=strlen(key);
for(i=0;i<sizeBook;i++){
f=0;
char *pb=pBook[i].nameOfBook;
j=0;
while(*(pb+j)!='\0'){
if(strncmp(pb+j,key,len)==0){
show_book(pBook[i]);
f=1;
break;
}
++j;
}
if(f==1){
continue;
}
char *pa=pBook[i].artistOfBook;
j=0;
while(*(pa+j)!='\0'){
if(strncmp(pa+j,key,len)==0){
show_book(pBook[i]);
break;
}
++j;
}
}
}
/*
函数功能:搜索图书
返回int数据 第一个符合要求的id -1表示没有找到
形参: char *id 读取的搜索内容
*/
int search_book(char *id){
int i;
int n=-1;
for(i=0;i<sizeBook;i++){
if(strcmp(pBook[i].idOfBook,id)==0 || strcmp(pBook[i].nameOfBook,id)==0){
return i;
}
if(strcmp(pBook[i].artistOfBook,id)==0){
printf("该作者著有:");
n=i;
break;
}
}
if(n!=-1){
for(i=n;i<sizeBook;i++){
if(strcmp(pBook[i].artistOfBook,id)==0){
printf("%s ",pBook[i].nameOfBook);
}
}
printf("\n");
return n;
}
return -1;
}
/*
函数功能:删除图书
没有返回数据
*/
void del_book(){
if(sizeBook==0){
printf("无数据\n");
return;
}
printf("输入要删除的图书id:");
char id[40];
scanf("%s",id);
int index=search_book(id);
if(index==-1){
printf("没有找到该图书\n");
return ;
}
show_book(pBook[index]);
int ret=sure();
if(ret==1){
pBook[index]=pBook[sizeBook-1];
--sizeBook;
printf("删除成功\n");
}else{
printf("操作已取消\n");
}
}
/*
函数功能:更改图书信息
没有返回数据
形参:
index 该图书在数组中的下标
n 要更改的项目选项
*/
void change_book_data(int index,int n){
switch(n){
case 1:{
char newname[40];
printf("输入新书名:");
scanf("%s",newname);
strcpy(pBook[index].nameOfBook,newname);
break;
}
case 2:{
char newartist[40];
printf("输入新作者:");
scanf("%s",newartist);
strcpy(pBook[index].artistOfBook,newartist);
break;
}
case 3:{
char newtime[40];
printf("输入新出版时间:");
scanf("%s",newtime);
strcpy(pBook[index].timeOfBook,newtime);
break;
}
case 4:{
char newclub[40];
printf("输入新出版社:");
scanf("%s",newclub);
strcpy(pBook[index].clubOfBook,newclub);
break;
}
case 5:{
int newmoney;
printf("输入新售价:");
scanf("%d",&newmoney);
pBook[index].moneyOfBook=newmoney;
break;
}
case 6:{
float newscore;
printf("输入新评分:");
scanf("%f",&newscore);
pBook[index].scoreOfBook=newscore;
break;
}
case 7:{
int newreadtime;
printf("输入借阅次数:");
scanf("%d",&newreadtime);
pBook[index].beReadTime=newreadtime;
break;
}
case 8:{
int newstate;
printf("输入新状态:");
scanf("%d",&newstate);
pBook[index].stateOfBook=newstate;
break;
}
}
}
/*
函数功能:列出评分最高的十本图书
没有返回数据
*/
void pingfen_top(){
sort(pBook,sizeBook,sizeofBook,scoredown);
int i;
printf("评分榜TOP10:\n");
for(i=0;i<sizeBook && i<10;i++){
printf("%d.%s ",i+1,pBook[i].nameOfBook);
}
printf("\n");
}
/*
函数功能:列出阅读次数最多的十本图书
没有返回数据
*/
void redu_top(){
sort(pBook,sizeBook,sizeofBook,redudown);
int i;
printf("热度榜TOP10:\n");
for(i=0;i<sizeBook && i<10;i++){
printf("%d.%s ",i+1,pBook[i].nameOfBook);
}
printf("\n");
}
/*
函数功能:列出所有图书的信息,按页显示,每页十本
没有返回数据
*/
void list_book(){
sort(pBook,sizeBook,sizeofBook,idup);
int i;
int page=1;
int sum=sizeBook/5+1;
while(1){
system("clear");
for(i=5*page-5;i<sizeBook && i<5*page;i++){
show_book(pBook[i]);
printf("------------------------\n");
}
printf("第%d页,共%d页\n",page,sum);
printf("(1)向前翻页(2)向后翻页(0)返回上一级菜单\n");
int opt;
printf("opterater:");
scanf("%d",&opt);
switch(opt){
case 1:{
--page;
if(page==0){
page=1;
}
break;
}
case 2:{
++page;
if(page>sum){
page=sum;
}
break;
}
case 0:return;
}
}
}