西电程序设计之图书管理系统
现在明明深陷于acm双创周的恶魔编程作业(可能还是我太菜了
),但是我依然忽然想发一个博客…不管了,反正就是突发奇想。
这是西电程序设计第五题,一个至少对当时的我来说很大的作业,快上千行的代码(现在回过头来发现也不过尔尔,还是自己不行,呜呜呜)。这个程序我基本上没有借鉴博客上的,是我自己写的…当然过程中我思路凝固的时候有求助大佬指教一下是哪里可能出问题啦…
可能有点粗糙,这个程序是我熬夜干的。当时晚上我正上选修,好家伙,老师忽然通知明天验收程序,然后我们班很多人一起熬夜。我敲代码敲到了3点半,然后7点左右又爬起来继续敲…
This used to be my nightmare
下面切入正题
题目详情:
- 简单文件数据库-模拟图书馆管理系统
涉及知识点:文件读写、内存管理、结构体定义、基本数据结构、高级格式化输入输出
要求:
编写一个程序模拟图书管理系统。用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择。读者菜单包括借书、还书、查询等功能。管理员菜单包括图书和读者信息录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。
命令行参数如下:
Libsim –a(-u) xxxx
第一个参数为可执行程序名称;第二个参数为用户身份,-a 表示管理员,-u 表示读者;
第三个参数为用户名
题目分析
1. 设置格式
首先题目没有给我们一个准确的格式,所以我自己设置了一下关于书和读者的文件格式是 txt, 内容如下图。
书的格式。
第一行是书的编号 id,我用 char 数组储存。第二行是书名 name,用 char 数组储存。第三行是书的数量,用int类型储存。(按照题目要求可知,重名书用一个id和name,所以要记录数量)。第四行是 finish,用来表示书的信息结束。最后一行的 end 表示所有的书都读取了,然后结束。
但是后来我发现我写的还是不够好,因为我是用strcmp函数比较。比如
> if(strcmp(tmp,"end")==0) break;
这就导致一个后果,如果我"end"后面加了空格之类的,“end ”我strcmp(tmp,“end”)的结果就不是0了,达不到结束读取信息的要求。
读者的格式。
第一行是读者的编号id,我用char数组储存。第二行是读者的名字name,用char数组储存。第三行是读者借书的数量,用int类型储存。之后若干行,是该读者所借书的信息。读者所借书的信息,遵循一个规则——第一行是书的编号,第二行是书的名字。然后类似循坏,遇到finish则表示读者所借书的信息读取完毕,然后开始下一个读者信息的读取。最后一行的end表示所有的读者信息都读取了,然后结束。
2. 储存信息
书本和读者都有好多信息,所以定义结构体reader和book来对输入的文件的信息进行储存
书的结构体
typedef struct book
{
char bookname[100];//名字
char bookid[30];//编号
int amount;//数量
}book;
读者的结构体
typedef struct reader
{
char readerid[30];//编号
char readername[100];//名字
int bookborrowed;//被借书的数量
book borrow[20];//最多借20本书
}reader;
3.设置函数
管理员和读者的权限不一样,所以他们能进行的操作范围不相同。
管理员要进行图书和读者信息录入、修改和删除。我多加了一个图书和读者信息添加功能,不然没法获得原始数据。
读者要进行借书、还书、查询。
两者都能查询图书信息。
两者公用函数
- int getbook();//读取书本信息
用文件操作读取书的文件的信息,并储存到结构体数组allbook里面。
int getbook()//读取书本信息
{
char mulu[100];
printf("请输入关于书的文件的目录\n");
gets(mulu);
fpbook=fopen(mulu,"r+");
//FILE *fpbook=fopen("C:\\Users\\Administrator\\Desktop\\book.txt","r+");
if(fpbook==NULL)
{
printf("\nfpbook error\n");
return 0;
}
else printf("\nfpbook成功\n");
printf("\n输出书的信息\n\n");
char tmp[100];
int bookcount=0;
//printf("进入循环\n");
while (1)
{ // 第一个是书的编号
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allbook[bookcount].bookid,tmp);
//第二个是书的名字
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allbook[bookcount].bookname,tmp);
//第三个是书的数量
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
allbook[bookcount].amount=atoi(tmp);
bookcount++;
//第四个是finish
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
if(strcmp(tmp,"finish")==0) continue;
}
for(int i=0;i<bookcount;i++)
{
printf("bookid:%s",allbook[i].bookid);
printf("bookname:%s",allbook[i].bookname);
printf("bookamount:%d\n",allbook[i].amount);
}
return bookcount;
}
- int getreader();//读取读者信息
用文件操作读取书的文件的信息,并储存到结构体数组allreader里面。
int getreader()//读取读者信息
{
char mulu[100];
printf("请输入关于读者的文件的目录\n");
gets(mulu);
fpreader=fopen(mulu,"r+");
//FILE *fpreader=fopen("C:\\Users\\Administrator\\Desktop\\reader.txt","r+");
if(fpreader==NULL)
{
printf("\nfpreader error\n");
return 0;
}
else printf("\nfpreader成功\n");
//printf("\n");
printf("\n输出读者信息\n\n");
char tmp[100];
int readercount=0;
while (1)
{ // 第一个是读者的编号
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].readerid,tmp);
//第二个是读者的名字
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].readername,tmp);
//第三个是读者借的书的数量
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
allreader[readercount].bookborrowed=atoi(tmp);
//读入被借书本的信息
for(int i=0;i<allreader[readercount].bookborrowed;i++)
{
//书的id
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].borrow[i].bookid,tmp);
//书的名字
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].borrow[i].bookname,tmp);
allreader[readercount].borrow[i].amount=1;
}
readercount++;
//然后是finish
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
if(strcmp(tmp,"finish")==0) continue;
}
for(int i=0;i<readercount;i++)
{
printf("readerid:%s",allreader[i].readerid);
printf("readername:%s",allreader[i].readername);
printf("bookborrowed:%d\n",allreader[i].bookborrowed);
printf("借书详情\n");
for(int j=0;j<allreader[i].bookborrowed;j++)
{
printf("bookid:%s",allreader[i].borrow[j].bookid);
printf("bookname:%s",allreader[i].borrow[j].bookname);
printf("bookamount:%d\n",allreader[i].borrow[j].amount);
}
printf("\n");
}
return readercount;
}
- int findbook(char find[ ] );//能否在所有书里面找到输入的书
输入的书的相关信息(id或者name),判断此书是否在图书馆的所有图书里面。(这只是一个辅助函数)
int findbook(char find[])//能否在所有书里面找到输入的书
{
int flag=0;
for(int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,find)==0) ||
(strcmp(allbook[i].bookid,find)==0) )
{
flag=1;
break;
}
}
if (flag==0) return 0;// 找不到就是0
else if(flag==1) return 1;//找到就是1
}
- int inquirebook();//查询书的信息,输入id,name,输出被借出去的reader的id和name。
输入的书的相关信息(id或者name),遍历allbook数组查询是否此书在图书馆的所有图书里面,如果不在则返回0。如果在所有图书里面,那就看看这本书的总量是不是等于0。如果总量等于0,返回0。如果总量大于0 ,就去读者那里开始查找借出的情况,并输出借出情况。
int inquirebook()//查询书的信息,输出id,name,被借出去的reader的id和name
{
printf("请输入书相关信息,id或者name:\n");
char find[100];
gets(find);
strcat(find,"\n");
//开始找书,看一下书的总量有多少本,还要去读者那里找被借出去了多少本
if(findbook(find)==0)
{
printf("找不到这本书\n");
return 0;
}
printf("\n输出图书的数量信息\n");
int findamount=0;//查询图书的数量
int findborrow=0;//查询图书被借出的数量
for (int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,find)==0) ||
(strcmp(allbook[i].bookid,find)==0) )
{
if(allbook[i].amount==0)//可能图书被删除了,所以数量为0
{
printf("该图书的数量是0,可能已经被管理员删除了");
return 0;
}
else if(allbook[i].amount>0)//书的数量不为0,那让我们来获取一些有用的信息
{
findamount=allbook[i].amount;
printf("图书的数量findamount:%d\n",findamount) ;
}
break;
}
}
//去读者那里找被借出去了多少本
int symbol[readersum];//标记借了此书的读者在allreader里面的序号
int symbolborrow[readersum];//记录借了此书的读者借此书的数量
int symbolcount=0;
for(int i=0;i<readersum;i++)
{
int flag=0;
int count=0 ;//记录借了此书的读者借此书的数量
for(int j=0;j<allreader[i].bookborrowed;j++)
{
if( (strcmp(allreader[i].borrow[j].bookname,find)==0)||
(strcmp(allreader[i].borrow[j].bookid,find)==0) )
{
flag=1;//这个reader至少借了一本这个书本
count++;
findborrow++;
}
}
if(flag==1)//这个reader至少借了一本这个书本
{
symbol[symbolcount]=i;
// printf("借了此书的读者在allreader里面的序号 i:%d\n",i);
symbolborrow[symbolcount]=count;
symbolcount++;
}
}
printf("图书被借出的数量findborrow:%d\n",findborrow);
if(findborrow>0)
{
printf("\n输出借了此书的读者的信息\n");
for(int i=0;i<symbolcount;i++)
{
printf("readername:%s",allreader[ symbol[i] ].readername);
printf("readerid:%s",allreader[ symbol[i] ].readerid);
printf("借此书的数量:%d\n",symbolborrow[i]);
}
}
else
{
printf("\n此书暂时无人借阅\n");
}
if(findamount>findborrow) return (findamount-findborrow);
else return 0;
}
- int findreader(char find[ ] ); //能否在所有读者里面找到输入的读者
输入的读者的相关信息(id或者name),判断此读者是否在图书馆的所有读者里面。(辅助函数)
int findreader(char find[]) //能否在所有读者里面找到输入的读者
{
int flag=0;
for(int i=0;i<readersum;i++)
{
if( (strcmp(allreader[i].readerid,find)==0) ||
(strcmp(allreader[i].readername,find)==0) )
{
flag=1;
break;
}
}
if (flag==0) return 0;// 找不到就是0
else if(flag==1) return 1;//找到就是1
}
reader的特性函数
- void readerinterface();//读者界面
显示读者的功能,以及告知读者可进行的操作。
void readerinterface()//读者界面
{
printf("读者界面\t\n\n");
printf("若想终止操作,请按0\t\n");
printf("若想录入图书信息,请按1\t\n");
printf("若想录入读者信息,请按2\t\n");
printf("若想查询图书信息,请按3\t\n");
printf("若想借书,请按4\t\n");
printf("若想还书,请按5\t\n");
}
- void borrowbook();//借书
输入要接书的相关信息(id或者name),然后查询书,是否存在。若不存在,return;若存在,看看书能不能被借。若不能,就return。若能,输入读者的信息,查看读者到底能不能借书。若不能,则return。若能,则借书成功。
void borrowbook()//借书
{
printf("输入你想要借的书的相关信息,id或者name\n");
char jie[100];
gets(jie);
strcat(jie,"\n");
printf("借书前我们先查询一下,此书的相关情况\n");
int ab=inquirebook();
//大于0是可以借,0是不可以借
if(ab==0)
{
printf("此书无法借\n");
return ;
}
//书没用问题,现在看读者
printf("请输入你的相关信息id或者name\n");
char duzhe[100];
gets(duzhe);
strcat(duzhe,"\n");
int flag=0;
for(int i=0;i<readersum;i++)//找读者
{
if( (strcmp(duzhe,allreader[i].readername)==0 )||
(strcmp(duzhe,allreader[i].readerid)==0) ) //找到了读者
{
flag=1;
if (allreader[i].bookborrowed==20)//20本书借满了
{
printf("一个人最多借20本书,你已经借满,无法借这本书\n") ;
return;
}
// 没借满,可以继续借
allreader[i].bookborrowed++;//借的书的个数增加
//增加borrow(借的书)的信息
int place= allreader[i].bookborrowed-1;//在书的数组的位置
allreader[i].borrow[place].amount=1;
if(strcmp(duzhe,allreader[i].readername)==0 )
{
strcpy(allreader[i].borrow[place].bookname,jie);
for(int j=0;j<booksum;j++)
{
if( strcmp(jie,allbook[j].bookname)==0)//找到了
{
strcpy( allreader[i].borrow[place].bookid, allbook[j].bookid);
break;
}
}
}
else if (strcmp(duzhe,allreader[i].readerid)==0)
{
strcpy(allreader[i].borrow[place].bookid,jie);
for(int j=0;j<booksum;j++)
{
if( strcmp(jie,allbook[j].bookid)==0)//找到了
{
strcpy( allreader[i].borrow[place].bookname, allbook[j].bookname);
break;
}
}
}
printf("现在来输出一下,这个读者的信息 \n");
printf("readername:%s",allreader[i].readername) ;
printf("readerid:%s",allreader[i].readerid) ;
printf("bookborrowed:%d\n",allreader[i].bookborrowed);
for(int k=0;k<allreader[i].bookborrowed;k++)
{
printf("bookid:%s",allreader[i].borrow[k].bookid);
printf("bookname:%s",allreader[i].borrow[k].bookname);
}
printf("借书成功 \n");
break;
}
}
if(flag==0)
{
printf("该读者的名字没有录入系统\n");
return ;
}
}
- void returnbook();//还书
输入读者的相关信息(id或者name),看看读者的信息是否存在。若不存在,return;若存在,输入要还的书的相关信息。然后开始在此读者的信息里面查找是否存在该图书,若不存在,return;若存在,则还书成功。
void returnbook()//还书 考虑向前移位
{
//确定读者
printf("请输入你的相关信息,id或者name\n");
char duzhe[100];
gets(duzhe);
strcat(duzhe,"\n");
int flag=0;
for(int i=0;i<readersum;i++)
{
if( (strcmp(duzhe,allreader[i].readername)==0 )||
(strcmp(duzhe,allreader[i].readerid)==0) ) //找到了读者
{//在读者的信息里面找书的信息
flag=1;
printf("请输入你要还的书的相关信息,id或者name\n");
char huan[100];
gets(huan);
strcat (huan,"\n");
int symbol=0;
for(int j=0;j<allreader[i].bookborrowed;j++)
{
if( (strcmp(allreader[i].borrow[j].bookname,huan)==0)||
(strcmp(allreader[i].borrow[j].bookid,huan)==0) )
{//第j个位置就是要归还的图书,现在把后面图书位置前移
symbol=1;
for(int k=j;k<=allreader[i].bookborrowed-2;k++)
{
// book*tmp=(book*)malloc(sizeof(book));
// tmp=&allreader[i].borrow[k+1];//取后面一位的信息
// allreader[i].borrow[k]=*tmp;
allreader[i].borrow[k].amount=allreader[i].borrow[k+1].amount;
strcpy (allreader[i].borrow[k].bookid, allreader[i].borrow[k+1].bookid);
strcpy (allreader[i].borrow[k].bookname, allreader[i].borrow[k+1].bookname);
}
int place=allreader[i].bookborrowed-1;//最后那本书
allreader[i].bookborrowed=allreader[i].bookborrowed-1;//借的书少了1
allreader[i].borrow[place].amount=0;
strcpy(allreader[i].borrow[place].bookid,"\0");
strcpy(allreader[i].borrow[place].bookname,"\0");
printf("现在我们输出还书之后的读者信息 \n");
printf("readername:%s",allreader[i].readername) ;
printf("readerid:%s",allreader[i].readerid) ;
printf("bookborrowed:%d\n",allreader[i].bookborrowed);
for(int x=0;x<allreader[i].bookborrowed;x++)
{
printf("bookid:%s",allreader[i].borrow[x].bookid);
printf("bookname:%s",allreader[i].borrow[x].bookname);
}
printf("还书成功 \n");
break;
}
}
if(symbol==0)
{
printf("没有在此读者所借书中找到想要归还的图书\n");
return;
}
break;
}
}
if(flag==0)
{
printf("没有找到该读者\n");
return;
}
}
administrator的特性函数
- void adminterface();//管理员界面
显示管理员的功能,以及告知管理员可进行的操作
void adminterface()//管理员界面
{
printf("管理员界面\t\n\n");
printf("若想终止操作,请按0\t\n");
printf("若想录入图书信息,请按1\t\n");
printf("若想录入读者信息,请按2\t\n");
printf("若想查询图书信息,请按3\t\n");
printf("若想修改图书信息,请按4\t\n");
printf("若想修改读者信息,请按5\t\n");
printf("若想删除图书信息,请按6\t\n");
printf("若想删除读者信息,请按7\t\n");
printf("若想增加图书信息,请按8\t\n");
printf("若想增加读者信息,请按9\t\n");
}
- void modifybook();//修改图书信息
输入要修改图书的相关信息 (id或者name),看看此书是否存在,若不存在,return;若存在,检查这本书是否有人在借,如果有的话,那就无法修改了;若无,则继续输入新的图书id,新的图书name,新的图书amount。然后输出修改之后的所有图书信息。
void modifybook()//修改图书信息
{
printf("请输入要修改图书的相关信息,id或者name\n");
char modify[100];
gets(modify);
strcat(modify,"\n");
int flag=0;
//开始找书
for(int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,modify)==0) ||
(strcmp(allbook[i].bookid,modify)==0) )
{
//检查这本书是否有人在借,如果有的话,那就无法修改了
int symbol=0;
for(int j=0;j<readersum;j++)
{//每一个读者的借书信息
for(int k=0;k<allreader[j].bookborrowed;k++)
{
if( (strcmp(allreader[j].borrow[k].bookname,modify)==0) ||
(strcmp(allreader[j].borrow[k].bookid,modify)==0) )
{//发现了有读者在借此书 ,跳出循环
k=allreader[j].bookborrowed+1;
j=readersum+1;
symbol=1;//有人在借
break;
}
}
}
if(symbol==1)//有人在借,就无法修改了
{
printf("这本书有读者在借,无法修改此书的信息\n");
return ;
}
flag=1;//找到了要修改图书并且没有读者借
printf("请输入新的图书id\n");
gets(modify);
strcat(modify,"\n");
strcpy(allbook[i].bookid,modify);
printf("请输入新的图书name\n");
gets(modify);
strcat(modify,"\n");
strcpy(allbook[i].bookname,modify);
printf("请输入新的图书amount\n");
int newamount;
scanf("%d",&newamount);
allbook[i].amount=newamount;
printf("现在看看修改之后的图书信息\n");
for(int x=0;x<booksum;x++)
{
printf("bookid:%s",allbook[x].bookid);
printf("bookname:%s",allbook[x].bookname);
printf("bookamount:%d\n",allbook[x].amount);
}
break;
}
}
if(flag==0)
{
printf("没有找到要修改的图书\n");
return;
}
}
- void modifyreader(); //修改读者信息
输入要修改读者的相关信息(id或者name),查看此读者是否存在。若不存在,return;若存在,输入新的读者id,新的读者name,新的读者借书数量bookborrowed,新的被借图书的信息。然后输出修改之后的所有读者信息。
void modifyreader() //修改读者信息
{
printf("请输入要修改读者的相关信息,id或者name\n");
char modify[100];
gets(modify);
strcat(modify,"\n");
//开始找读者
int flag=0;
for(int i=0;i<readersum;i++)
{
if( (strcmp(allreader[i].readerid,modify)==0) ||
(strcmp(allreader[i].readername,modify)==0) )
{
flag=1;//找到了要修改读者
printf("请输入新的读者id\n");
gets(modify);
strcat(modify,"\n");
strcpy(allreader[i].readerid,modify);
printf("请输入新的读者name\n");
gets(modify);
strcat(modify,"\n");
strcpy(allreader[i].readername,modify);
printf("请输入新的读者借书数量bookborrowed\n");
int newamount;
scanf("%d",&newamount);
getchar();
allreader[i].bookborrowed=newamount;
for(int w=0;w<allreader[i].bookborrowed;w++)
{
printf("请输入借的书id\n");
gets(modify);
strcat(modify,"\n");
int re=findbook(modify);
while(1)
{
if(re==1)
{
strcpy(allreader[i].borrow[w].bookid,modify);
break;
}
else if(re==0)
{
printf("图书馆里没有此id的书,请重新输入书id\n");
gets(modify);
strcat(modify,"\n");
re=findbook(modify);
}
}
char modifyid[100];
strcpy(modifyid,modify);
printf("请输入此id对应的name\n");
gets(modify);
strcat(modify,"\n");
int pipei=1;
while(pipei)
{
for(int g=0;g<booksum;g++)
{
if(strcmp(allbook[g].bookid,modifyid)==0)
{//找到了id所在的位置g
if(strcmp(allbook[g].bookname,modify)==0)
{//判断这个id对应的name和输入的name是不是匹配的
strcpy(allreader[i].borrow[w].bookid,modify);
pipei=0;//可以匹配,跳出循环
break;
}
else
{
printf("输入书的id和name不对应,请重新输入name\n");
gets(modify);
strcat(modify,"\n");
break;
}
}
}
}
allreader[i].borrow[w].amount=1;
}
printf("现在看看修改之后的读者信息\n");
for(int x=0;x<readersum;x++)
{
printf("readerid:%s",allreader[x].readerid);
printf("readername:%s",allreader[x].readername);
printf("bookborrowed:%d\n",allreader[x].bookborrowed);
for(int y=0;y<allreader[x].bookborrowed;y++)
{
printf("bookid:%s",allreader[x].borrow[y].bookid);
printf("bookname:%s",allreader[x].borrow[y].bookname);
printf("bookamount:%d\n",allreader[x].borrow[y].amount);
}
}
break;
}
}
if(flag==0)
{
printf("没有找到要修改的读者\n");
return;
}
}
- void deletebook();//删除图书信息、
输入要删除图书的相关信息(id或者name),看看此书是否存在,若不存在,return;若存在,检查这本书是否有人在借,如果有的话,那就无法删除了,return;。如果没人在借,那删除成功。然后输出删除之后的所有图书信息。
void deletebook()//删除图书信息
{
printf("请输入要删除图书的相关信息,id或者name\n");
char shan[100];
gets(shan);
strcat (shan,"\n");
int flag=0;
//开始找书
for(int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,shan)==0) ||
(strcmp(allbook[i].bookid,shan)==0) )
{
//检查这本书是否有人在借,如果有的话,那就无法删除了
int symbol=0;
for(int j=0;j<readersum;j++)
{//每一个读者的借书信息
for(int k=0;k<allreader[j].bookborrowed;k++)
{
if( (strcmp(allreader[j].borrow[k].bookname,shan)==0) ||
(strcmp(allreader[j].borrow[k].bookid,shan)==0) )
{//发现了有读者在借此书 ,跳出循环
k=allreader[j].bookborrowed+1;
j=readersum+1;
symbol=1;//有人在借
break;
}
}
}
if(symbol==1)//有人在借,就无法删除了
{
printf("这本书有读者在借,无法删除此书的信息\n");
return ;
}
flag=1;//找到了要删除图书并且没人借这本书
//把之后的书向前移动
for(int j=i;j<=booksum-2;j++)
{
allbook[j].amount=allbook[j+1].amount;
strcpy(allbook[j].bookid,allbook[j+1].bookid);
strcpy(allbook[j].bookname,allbook[j+1].bookname);
}
int place=booksum-1;//最后那本书的位置
booksum=booksum-1;//所有的书少了1
allbook[place].amount=0;
strcpy(allbook[place].bookid,"\0");
strcpy(allbook[place].bookname,"\0");
printf("现在我们输出删除图书之后的图书信息\n");
printf("booksum:%d\n",booksum);
for(int x=0;x<booksum;x++)
{
printf("bookid:%s",allbook[x].bookid);
printf("bookname:%s",allbook[x].bookname);
printf("bookamount:%d\n",allbook[x].amount);
}
printf("删除图书成功 \n");
break;
}
}
if(flag==0)
{
printf("没有找到要删除的图书\n");
return;
}
}
- void deletereader();//删除读者信息
输入要删除读者的相关信息(id或者name),看看此读者是否存在,若不存在,return;若存在,那就删除,删除成功。然后输出删除之后的所有图书信息。
void deletereader()//删除读者信息
{
printf("请输入要删除读者的相关信息,id或者name\n");
char shan[100];
gets(shan);
strcat (shan,"\n");
int flag=0;
//开始找读者
for(int i=0;i<readersum;i++)
{
if( (strcmp(allreader[i].readerid,shan)==0) ||
(strcmp(allreader[i].readername,shan)==0) )
{//把之后的读者向前移动
flag=1;//找到了要删除读者
for(int j=i;j<=readersum-2;j++)
{
allreader[j].bookborrowed=allreader[j+1].bookborrowed;
strcpy(allreader[j].readerid,allreader[j+1].readerid);
strcpy(allreader[j].readername,allreader[j+1].readername);
//移位借书的信息
for(int k=0;k<allreader[j+1].bookborrowed;k++)
{
allreader[j].borrow[k].amount= allreader[j+1].borrow[k].amount;
strcpy(allreader[j].borrow[k].bookid,allreader[j+1].borrow[k].bookid);
strcpy(allreader[j].borrow[k].bookname,allreader[j+1].borrow[k].bookname);
}
}
int place=readersum-1;//最后读者的位置
readersum=readersum-1;//读者少了1
for(int w=0;w<allreader[place].bookborrowed;w++)
{
allreader[place].borrow[w].amount=0;
strcpy(allreader[place].borrow[w].bookid,"\0");
strcpy(allreader[place].borrow[w].bookname,"\0");
}
allreader[place].bookborrowed=0;
strcpy(allreader[place].readerid,"\0");
strcpy(allreader[place].readername,"\0");
printf("现在我们输出删除读者之后的读者信息\n");
printf("readersum:%d\n",readersum);
for(int x=0;x<readersum;x++)
{
printf("readerid:%s",allreader[x].readerid);
printf("readername:%s",allreader[x].readername);
printf("bookborrowed:%d\n",allreader[x].bookborrowed);
for(int y=0;y<allreader[x].bookborrowed;y++)
{
printf("bookid:%s",allreader[x].borrow[y].bookid);
printf("bookname:%s",allreader[x].borrow[y].bookname);
printf("bookamount:%d\n",allreader[x].borrow[y].amount);
}
}
printf("删除读者成功 \n");
break;
}
}
if(flag==0)
{
printf("没有找到要删除的读者\n");
return;
}
}
- void addbook();//增加图书信息
先判断是否图书的总量达到了最大,若已经达到最大,return;若没有达到最大,输入要增加图书的相关信息(id或者name),要输入增加图书的id,要输入增加图书的name,要输入增加图书的amount,储存起来。然后输出增加之后的所有图书信息。
void addbook()//增加图书信息
{
if (booksum>=maxbook)
{
printf("图书馆的书已经达到最大数量,无法再增加\n");
return;
}
printf("请输入要增加图书的id\n");
char add[100];
gets(add);
strcat (add,"\n");
strcpy(allbook[booksum].bookid,add);
printf("请输入要增加图书的name\n");
gets(add);
strcat (add,"\n");
strcpy(allbook[booksum].bookname,add);
printf("请输入要增加图书的amount\n");
int amount;
scanf("%d",&amount);
allbook[booksum].amount=amount;
booksum++;
printf("现在我们输出增加图书之后的图书信息\n");
printf("booksum:%d\n",booksum);
for(int x=0;x<booksum;x++)
{
printf("bookid:%s",allbook[x].bookid);
printf("bookname:%s",allbook[x].bookname);
printf("bookamount:%d\n",allbook[x].amount);
}
printf("增加图书成功 \n");
}
- void addreader();//增加读者信息
先判断是否读者的总量达到了最大,若已经达到最大,return;若没有达到最大,输入要增加读者的相关信息(id或者name),输入要增加的读者id,要增加的读者name,要增加的读者借书数量bookborrowed,要增加的被借图书的信息。然后输出增加之后的所以读者信息
void addreader()//增加读者信息
{
if (readersum>=maxreader)
{
printf("图书馆的读者已经达到最大数量,无法再增加\n");
return;
}
printf("请输入要增加读者的id\n");
char add[100];
gets(add);
strcat (add,"\n");
strcpy(allreader[readersum].readerid,add);
printf("请输入要增加读者的name\n");
gets(add);
strcat (add,"\n");
strcpy(allreader[readersum].readername,add);
printf("请输入要增加的读者的bookborrowed\n");
int amount;
scanf("%d",&amount);
getchar();
allreader[readersum].bookborrowed=amount;
for(int w=0;w<allreader[readersum].bookborrowed;w++)
{
char modify[100];
printf("请输入借的书id\n");
gets(modify);
strcat(modify,"\n");
int re=findbook(modify);
while(1)
{
if(re==1)
{
strcpy(allreader[readersum].borrow[w].bookid,modify);
break;
}
else if(re==0)
{
printf("图书馆里没有此id的书,请重新输入书id\n");
gets(modify);
strcat(modify,"\n");
re=findbook(modify);
}
}
char modifyid[100];
strcpy(modifyid,modify);
printf("请输入此id对应的书name\n");
gets(modify);
strcat(modify,"\n");
int pipei=1;
while(pipei)
{
for(int g=0;g<booksum;g++)
{
if(strcmp(allbook[g].bookid,modifyid)==0)
{//找到了id所在的位置g
if(strcmp(allbook[g].bookname,modify)==0)
{//判断这个id对应的name和输入的name是不是匹配的
strcpy(allreader[readersum].borrow[w].bookid,modify);
pipei=0;//可以匹配,跳出循环
break;
}
else
{
printf("输入书的id和name不对应,请重新输入name\n");
gets(modify);
strcat(modify,"\n");
break;
}
}
}
}
allreader[readersum].borrow[w].amount=1;
}
readersum++;
printf("现在我们输出增加读者之后的读者信息\n");
printf("readersum:%d\n",readersum);
for(int x=0;x<readersum;x++)
{
printf("readerid:%s",allreader[x].readerid);
printf("readername:%s",allreader[x].readername);
printf("bookborrowed:%d\n",allreader[x].bookborrowed);
for(int y=0;y<allreader[x].bookborrowed;y++)
{
printf("bookid:%s",allreader[x].borrow[y].bookid);
printf("bookname:%s",allreader[x].borrow[y].bookname);
printf("bookamount:%d\n",allreader[x].borrow[y].amount);
}
}
printf("增加读者成功 \n");
}
完整代码(900多行,反正我估计也不好看,o( ̄︶ ̄)o)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<bits/stdc++.h>
using namespace std;
#define maxreader 10000
#define maxbook 2000000
// 定义基本的结构体
typedef struct book
{
char bookname[100];//名字
char bookid[30];//编号
int amount;//数量
}book;
typedef struct reader
{
char readerid[30];//编号
char readername[100];//名字
int bookborrowed;//被借书的数量
book borrow[20];//最多20本书
}reader;
int getbook();//读取书本信息
int getreader();//读取读者信息
int inquirebook();//查询书的信息,输出id,name,被借出去的reader的id和name
int findbook(char find[]);//能否在所有书里面找到输入的书
int findreader(char find[]); //能否在所有读者里面找到输入的读者
void readerinterface();//读者界面
void borrowbook();//借书
void returnbook();//还书
void adminterface();//管理员界面
void modifybook();//修改图书信息
void modifyreader(); //修改读者信息
void deletebook();//删除图书信息
void deletereader();//删除读者信息
void addbook();//增加图书信息
void addreader();//增加读者信息
book allbook[maxbook];
reader allreader[maxreader];
int booksum,readersum;
FILE *fpbook;
FILE *fpreader;
int main(int argc,char **argv)
{
if(strcmp(argv[1],"-a")==0)//管理员
{
adminterface();//管理员界面
int choice;
printf("\n请输入选择以进行操作\n");
scanf("%d",&choice);
getchar();
while(choice!=0)//等于0时退出操作
{
if(choice==1)//若想录入图书信息,请按1
booksum=getbook();//读取书本信息
else if(choice==2)//若想录入读者信息,请按2
readersum=getreader();//读取读者信息
else if(choice==3)//若想查询图书信息,请按3
inquirebook();//查询书的信息
else if(choice==4)//若想修改图书信息,请按4
modifybook();//查询书的信息
else if(choice==5)//若想修改读者信息,请按5
modifyreader(); //修改读者信息
else if(choice==6)//若想删除图书信息,请按6
deletebook();//删除图书信息
else if(choice==7)//若想删除读者信息,请按7
deletereader();//删除读者信息
else if(choice==8)//若想增加图书信息,请按8
addbook();//增加图书信息
else if(choice==9)//若想增加读者信息,请按9
addreader();//增加读者信息
printf("\n请继续输入选择以进行操作\n");
scanf("%d",&choice);
getchar();
}
}
else if(strcmp(argv[1],"-u")==0)//读者
{
readerinterface();//读者界面
//booksum=getbook();//读取书本信息
//readersum=getreader();//读取读者信息
printf("\n请输入选择以进行操作\n");
int choice;
scanf("%d",&choice);
getchar();
while(choice!=0)//等于0时退出操作
{
if(choice==1)//若想录入图书信息,请按1
booksum=getbook();//读取书本信息
else if(choice==2)//若想录入读者信息,请按2
readersum=getreader();//读取读者信息
else if(choice==3)//若想修改图书信息,请按3
inquirebook();//查询书的信息
else if(choice==4)
borrowbook();//借书
else if(choice==5)
returnbook();//还书
printf("\n请继续输入选择以进行操作\n");
scanf("%d",&choice);
getchar();
}
}
return 0;
}
void readerinterface()//读者界面
{
printf("读者界面\t\n\n");
printf("若想终止操作,请按0\t\n");
printf("若想录入图书信息,请按1\t\n");
printf("若想录入读者信息,请按2\t\n");
printf("若想查询图书信息,请按3\t\n");
printf("若想借书,请按4\t\n");
printf("若想还书,请按5\t\n");
}
void adminterface()//管理员界面
{
printf("管理员界面\t\n\n");
printf("若想终止操作,请按0\t\n");
printf("若想录入图书信息,请按1\t\n");
printf("若想录入读者信息,请按2\t\n");
printf("若想查询图书信息,请按3\t\n");
printf("若想修改图书信息,请按4\t\n");
printf("若想修改读者信息,请按5\t\n");
printf("若想删除图书信息,请按6\t\n");
printf("若想删除读者信息,请按7\t\n");
printf("若想增加图书信息,请按8\t\n");
printf("若想增加读者信息,请按9\t\n");
}
int getbook()//读取书本信息
{
char mulu[100];
printf("请输入关于书的文件的目录\n");
gets(mulu);
fpbook=fopen(mulu,"r+");
//FILE *fpbook=fopen("C:\\Users\\Administrator\\Desktop\\book.txt","r+");
if(fpbook==NULL)
{
printf("\nfpbook error\n");
return 0;
}
else printf("\nfpbook成功\n");
printf("\n输出书的信息\n\n");
char tmp[100];
int bookcount=0;
//printf("进入循环\n");
while (1)
{ // 第一个是书的编号
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allbook[bookcount].bookid,tmp);
//第二个是书的名字
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allbook[bookcount].bookname,tmp);
//第三个是书的数量
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
allbook[bookcount].amount=atoi(tmp);
bookcount++;
//第四个是finish
fgets(tmp,100,fpbook);
if(strcmp(tmp,"end")==0) break;//读到最后了
if(strcmp(tmp,"finish")==0) continue;
}
for(int i=0;i<bookcount;i++)
{
printf("bookid:%s",allbook[i].bookid);
printf("bookname:%s",allbook[i].bookname);
printf("bookamount:%d\n",allbook[i].amount);
}
return bookcount;
}
int getreader()//读取读者信息
{
char mulu[100];
printf("请输入关于读者的文件的目录\n");
gets(mulu);
fpreader=fopen(mulu,"r+");
//FILE *fpreader=fopen("C:\\Users\\Administrator\\Desktop\\reader.txt","r+");
if(fpreader==NULL)
{
printf("\nfpreader error\n");
return 0;
}
else printf("\nfpreader成功\n");
//printf("\n");
printf("\n输出读者信息\n\n");
char tmp[100];
int readercount=0;
while (1)
{ // 第一个是读者的编号
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].readerid,tmp);
//第二个是读者的名字
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].readername,tmp);
//第三个是读者借的书的数量
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
allreader[readercount].bookborrowed=atoi(tmp);
//读入被借书本的信息
for(int i=0;i<allreader[readercount].bookborrowed;i++)
{
//书的id
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].borrow[i].bookid,tmp);
//书的名字
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
strcpy(allreader[readercount].borrow[i].bookname,tmp);
allreader[readercount].borrow[i].amount=1;
}
readercount++;
//然后是finish
fgets(tmp,100,fpreader);
if(strcmp(tmp,"end")==0) break;//读到最后了
if(strcmp(tmp,"finish")==0) continue;
}
for(int i=0;i<readercount;i++)
{
printf("readerid:%s",allreader[i].readerid);
printf("readername:%s",allreader[i].readername);
printf("bookborrowed:%d\n",allreader[i].bookborrowed);
printf("借书详情\n");
for(int j=0;j<allreader[i].bookborrowed;j++)
{
printf("bookid:%s",allreader[i].borrow[j].bookid);
printf("bookname:%s",allreader[i].borrow[j].bookname);
printf("bookamount:%d\n",allreader[i].borrow[j].amount);
}
printf("\n");
}
return readercount;
}
int findbook(char find[])//能否在所有书里面找到输入的书
{
int flag=0;
for(int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,find)==0) ||
(strcmp(allbook[i].bookid,find)==0) )
{
flag=1;
break;
}
}
if (flag==0) return 0;// 找不到就是0
else if(flag==1) return 1;//找到就是1
}
int findreader(char find[]) //能否在所有读者里面找到输入的读者
{
int flag=0;
for(int i=0;i<readersum;i++)
{
if( (strcmp(allreader[i].readerid,find)==0) ||
(strcmp(allreader[i].readername,find)==0) )
{
flag=1;
break;
}
}
if (flag==0) return 0;// 找不到就是0
else if(flag==1) return 1;//找到就是1
}
int inquirebook()//查询书的信息,输出id,name,被借出去的reader的id和name
{
printf("请输入书相关信息,id或者name:\n");
char find[100];
gets(find);
strcat(find,"\n");
//开始找书,看一下书的总量有多少本,还要去读者那里找被借出去了多少本
if(findbook(find)==0)
{
printf("找不到这本书\n");
return 0;
}
printf("\n输出图书的数量信息\n");
int findamount=0;//查询图书的数量
int findborrow=0;//查询图书被借出的数量
for (int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,find)==0) ||
(strcmp(allbook[i].bookid,find)==0) )
{
if(allbook[i].amount==0)//可能图书被删除了,所以数量为0
{
printf("该图书的数量是0,可能已经被管理员删除了");
return 0;
}
else if(allbook[i].amount>0)//书的数量不为0,那让我们来获取一些有用的信息
{
findamount=allbook[i].amount;
printf("图书的数量findamount:%d\n",findamount) ;
}
break;
}
}
//去读者那里找被借出去了多少本
int symbol[readersum];//标记借了此书的读者在allreader里面的序号
int symbolborrow[readersum];//记录借了此书的读者借此书的数量
int symbolcount=0;
for(int i=0;i<readersum;i++)
{
int flag=0;
int count=0 ;//记录借了此书的读者借此书的数量
for(int j=0;j<allreader[i].bookborrowed;j++)
{
if( (strcmp(allreader[i].borrow[j].bookname,find)==0)||
(strcmp(allreader[i].borrow[j].bookid,find)==0) )
{
flag=1;//这个reader至少借了一本这个书本
count++;
findborrow++;
}
}
if(flag==1)//这个reader至少借了一本这个书本
{
symbol[symbolcount]=i;
// printf("借了此书的读者在allreader里面的序号 i:%d\n",i);
symbolborrow[symbolcount]=count;
symbolcount++;
}
}
printf("图书被借出的数量findborrow:%d\n",findborrow);
if(findborrow>0)
{
printf("\n输出借了此书的读者的信息\n");
for(int i=0;i<symbolcount;i++)
{
printf("readername:%s",allreader[ symbol[i] ].readername);
printf("readerid:%s",allreader[ symbol[i] ].readerid);
printf("借此书的数量:%d\n",symbolborrow[i]);
}
}
else
{
printf("\n此书暂时无人借阅\n");
}
if(findamount>findborrow) return (findamount-findborrow);
else return 0;
}
void borrowbook()//借书
{
printf("输入你想要借的书的相关信息,id或者name\n");
char jie[100];
gets(jie);
strcat(jie,"\n");
printf("借书前我们先查询一下,此书的相关情况\n");
int ab=inquirebook();
//大于0是可以借,0是不可以借
if(ab==0)
{
printf("此书无法借\n");
return ;
}
//书没用问题,现在看读者
printf("请输入你的相关信息id或者name\n");
char duzhe[100];
gets(duzhe);
strcat(duzhe,"\n");
int flag=0;
for(int i=0;i<readersum;i++)//找读者
{
if( (strcmp(duzhe,allreader[i].readername)==0 )||
(strcmp(duzhe,allreader[i].readerid)==0) ) //找到了读者
{
flag=1;
if (allreader[i].bookborrowed==20)//20本书借满了
{
printf("一个人最多借20本书,你已经借满,无法借这本书\n") ;
return;
}
// 没借满,可以继续借
allreader[i].bookborrowed++;//借的书的个数增加
//增加borrow(借的书)的信息
int place= allreader[i].bookborrowed-1;//在书的数组的位置
allreader[i].borrow[place].amount=1;
if(strcmp(duzhe,allreader[i].readername)==0 )
{
strcpy(allreader[i].borrow[place].bookname,jie);
for(int j=0;j<booksum;j++)
{
if( strcmp(jie,allbook[j].bookname)==0)//找到了
{
strcpy( allreader[i].borrow[place].bookid, allbook[j].bookid);
break;
}
}
}
else if (strcmp(duzhe,allreader[i].readerid)==0)
{
strcpy(allreader[i].borrow[place].bookid,jie);
for(int j=0;j<booksum;j++)
{
if( strcmp(jie,allbook[j].bookid)==0)//找到了
{
strcpy( allreader[i].borrow[place].bookname, allbook[j].bookname);
break;
}
}
}
printf("现在来输出一下,这个读者的信息 \n");
printf("readername:%s",allreader[i].readername) ;
printf("readerid:%s",allreader[i].readerid) ;
printf("bookborrowed:%d\n",allreader[i].bookborrowed);
for(int k=0;k<allreader[i].bookborrowed;k++)
{
printf("bookid:%s",allreader[i].borrow[k].bookid);
printf("bookname:%s",allreader[i].borrow[k].bookname);
}
printf("借书成功 \n");
break;
}
}
if(flag==0)
{
printf("该读者的名字没有录入系统\n");
return ;
}
}
void returnbook()//还书 考虑向前移位
{
//确定读者
printf("请输入你的相关信息,id或者name\n");
char duzhe[100];
gets(duzhe);
strcat(duzhe,"\n");
int flag=0;
for(int i=0;i<readersum;i++)
{
if( (strcmp(duzhe,allreader[i].readername)==0 )||
(strcmp(duzhe,allreader[i].readerid)==0) ) //找到了读者
{//在读者的信息里面找书的信息
flag=1;
printf("请输入你要还的书的相关信息,id或者name\n");
char huan[100];
gets(huan);
strcat (huan,"\n");
int symbol=0;
for(int j=0;j<allreader[i].bookborrowed;j++)
{
if( (strcmp(allreader[i].borrow[j].bookname,huan)==0)||
(strcmp(allreader[i].borrow[j].bookid,huan)==0) )
{//第j个位置就是要归还的图书,现在把后面图书位置前移
symbol=1;
for(int k=j;k<=allreader[i].bookborrowed-2;k++)
{
// book*tmp=(book*)malloc(sizeof(book));
// tmp=&allreader[i].borrow[k+1];//取后面一位的信息
// allreader[i].borrow[k]=*tmp;
allreader[i].borrow[k].amount=allreader[i].borrow[k+1].amount;
strcpy (allreader[i].borrow[k].bookid, allreader[i].borrow[k+1].bookid);
strcpy (allreader[i].borrow[k].bookname, allreader[i].borrow[k+1].bookname);
}
int place=allreader[i].bookborrowed-1;//最后那本书
allreader[i].bookborrowed=allreader[i].bookborrowed-1;//借的书少了1
allreader[i].borrow[place].amount=0;
strcpy(allreader[i].borrow[place].bookid,"\0");
strcpy(allreader[i].borrow[place].bookname,"\0");
printf("现在我们输出还书之后的读者信息 \n");
printf("readername:%s",allreader[i].readername) ;
printf("readerid:%s",allreader[i].readerid) ;
printf("bookborrowed:%d\n",allreader[i].bookborrowed);
for(int x=0;x<allreader[i].bookborrowed;x++)
{
printf("bookid:%s",allreader[i].borrow[x].bookid);
printf("bookname:%s",allreader[i].borrow[x].bookname);
}
printf("还书成功 \n");
break;
}
}
if(symbol==0)
{
printf("没有在此读者所借书中找到想要归还的图书\n");
return;
}
break;
}
}
if(flag==0)
{
printf("没有找到该读者\n");
return;
}
}
void modifybook()//修改图书信息
{
printf("请输入要修改图书的相关信息,id或者name\n");
char modify[100];
gets(modify);
strcat(modify,"\n");
int flag=0;
//开始找书
for(int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,modify)==0) ||
(strcmp(allbook[i].bookid,modify)==0) )
{
//检查这本书是否有人在借,如果有的话,那就无法修改了
int symbol=0;
for(int j=0;j<readersum;j++)
{//每一个读者的借书信息
for(int k=0;k<allreader[j].bookborrowed;k++)
{
if( (strcmp(allreader[j].borrow[k].bookname,modify)==0) ||
(strcmp(allreader[j].borrow[k].bookid,modify)==0) )
{//发现了有读者在借此书 ,跳出循环
k=allreader[j].bookborrowed+1;
j=readersum+1;
symbol=1;//有人在借
break;
}
}
}
if(symbol==1)//有人在借,就无法修改了
{
printf("这本书有读者在借,无法修改此书的信息\n");
return ;
}
flag=1;//找到了要修改图书并且没有读者借
printf("请输入新的图书id\n");
gets(modify);
strcat(modify,"\n");
strcpy(allbook[i].bookid,modify);
printf("请输入新的图书name\n");
gets(modify);
strcat(modify,"\n");
strcpy(allbook[i].bookname,modify);
printf("请输入新的图书amount\n");
int newamount;
scanf("%d",&newamount);
allbook[i].amount=newamount;
printf("现在看看修改之后的图书信息\n");
for(int x=0;x<booksum;x++)
{
printf("bookid:%s",allbook[x].bookid);
printf("bookname:%s",allbook[x].bookname);
printf("bookamount:%d\n",allbook[x].amount);
}
break;
}
}
if(flag==0)
{
printf("没有找到要修改的图书\n");
return;
}
}
void modifyreader() //修改读者信息
{
printf("请输入要修改读者的相关信息,id或者name\n");
char modify[100];
gets(modify);
strcat(modify,"\n");
//开始找读者
int flag=0;
for(int i=0;i<readersum;i++)
{
if( (strcmp(allreader[i].readerid,modify)==0) ||
(strcmp(allreader[i].readername,modify)==0) )
{
flag=1;//找到了要修改读者
printf("请输入新的读者id\n");
gets(modify);
strcat(modify,"\n");
strcpy(allreader[i].readerid,modify);
printf("请输入新的读者name\n");
gets(modify);
strcat(modify,"\n");
strcpy(allreader[i].readername,modify);
printf("请输入新的读者借书数量bookborrowed\n");
int newamount;
scanf("%d",&newamount);
getchar();
allreader[i].bookborrowed=newamount;
for(int w=0;w<allreader[i].bookborrowed;w++)
{
printf("请输入借的书id\n");
gets(modify);
strcat(modify,"\n");
int re=findbook(modify);
while(1)
{
if(re==1)
{
strcpy(allreader[i].borrow[w].bookid,modify);
break;
}
else if(re==0)
{
printf("图书馆里没有此id的书,请重新输入书id\n");
gets(modify);
strcat(modify,"\n");
re=findbook(modify);
}
}
char modifyid[100];
strcpy(modifyid,modify);
printf("请输入此id对应的name\n");
gets(modify);
strcat(modify,"\n");
int pipei=1;
while(pipei)
{
for(int g=0;g<booksum;g++)
{
if(strcmp(allbook[g].bookid,modifyid)==0)
{//找到了id所在的位置g
if(strcmp(allbook[g].bookname,modify)==0)
{//判断这个id对应的name和输入的name是不是匹配的
strcpy(allreader[i].borrow[w].bookid,modify);
pipei=0;//可以匹配,跳出循环
break;
}
else
{
printf("输入书的id和name不对应,请重新输入name\n");
gets(modify);
strcat(modify,"\n");
break;
}
}
}
}
allreader[i].borrow[w].amount=1;
}
printf("现在看看修改之后的读者信息\n");
for(int x=0;x<readersum;x++)
{
printf("readerid:%s",allreader[x].readerid);
printf("readername:%s",allreader[x].readername);
printf("bookborrowed:%d\n",allreader[x].bookborrowed);
for(int y=0;y<allreader[x].bookborrowed;y++)
{
printf("bookid:%s",allreader[x].borrow[y].bookid);
printf("bookname:%s",allreader[x].borrow[y].bookname);
printf("bookamount:%d\n",allreader[x].borrow[y].amount);
}
}
break;
}
}
if(flag==0)
{
printf("没有找到要修改的读者\n");
return;
}
}
void deletebook()//删除图书信息
{
printf("请输入要删除图书的相关信息,id或者name\n");
char shan[100];
gets(shan);
strcat (shan,"\n");
int flag=0;
//开始找书
for(int i=0;i<booksum;i++)
{
if( (strcmp(allbook[i].bookname,shan)==0) ||
(strcmp(allbook[i].bookid,shan)==0) )
{
//检查这本书是否有人在借,如果有的话,那就无法删除了
int symbol=0;
for(int j=0;j<readersum;j++)
{//每一个读者的借书信息
for(int k=0;k<allreader[j].bookborrowed;k++)
{
if( (strcmp(allreader[j].borrow[k].bookname,shan)==0) ||
(strcmp(allreader[j].borrow[k].bookid,shan)==0) )
{//发现了有读者在借此书 ,跳出循环
k=allreader[j].bookborrowed+1;
j=readersum+1;
symbol=1;//有人在借
break;
}
}
}
if(symbol==1)//有人在借,就无法删除了
{
printf("这本书有读者在借,无法删除此书的信息\n");
return ;
}
flag=1;//找到了要删除图书并且没人借这本书
//把之后的书向前移动
for(int j=i;j<=booksum-2;j++)
{
allbook[j].amount=allbook[j+1].amount;
strcpy(allbook[j].bookid,allbook[j+1].bookid);
strcpy(allbook[j].bookname,allbook[j+1].bookname);
}
int place=booksum-1;//最后那本书的位置
booksum=booksum-1;//所有的书少了1
allbook[place].amount=0;
strcpy(allbook[place].bookid,"\0");
strcpy(allbook[place].bookname,"\0");
printf("现在我们输出删除图书之后的图书信息\n");
printf("booksum:%d\n",booksum);
for(int x=0;x<booksum;x++)
{
printf("bookid:%s",allbook[x].bookid);
printf("bookname:%s",allbook[x].bookname);
printf("bookamount:%d\n",allbook[x].amount);
}
printf("删除图书成功 \n");
break;
}
}
if(flag==0)
{
printf("没有找到要删除的图书\n");
return;
}
}
void deletereader()//删除读者信息
{
printf("请输入要删除读者的相关信息,id或者name\n");
char shan[100];
gets(shan);
strcat (shan,"\n");
int flag=0;
//开始找读者
for(int i=0;i<readersum;i++)
{
if( (strcmp(allreader[i].readerid,shan)==0) ||
(strcmp(allreader[i].readername,shan)==0) )
{//把之后的读者向前移动
flag=1;//找到了要删除读者
for(int j=i;j<=readersum-2;j++)
{
allreader[j].bookborrowed=allreader[j+1].bookborrowed;
strcpy(allreader[j].readerid,allreader[j+1].readerid);
strcpy(allreader[j].readername,allreader[j+1].readername);
//移位借书的信息
for(int k=0;k<allreader[j+1].bookborrowed;k++)
{
allreader[j].borrow[k].amount= allreader[j+1].borrow[k].amount;
strcpy(allreader[j].borrow[k].bookid,allreader[j+1].borrow[k].bookid);
strcpy(allreader[j].borrow[k].bookname,allreader[j+1].borrow[k].bookname);
}
}
int place=readersum-1;//最后读者的位置
readersum=readersum-1;//读者少了1
for(int w=0;w<allreader[place].bookborrowed;w++)
{
allreader[place].borrow[w].amount=0;
strcpy(allreader[place].borrow[w].bookid,"\0");
strcpy(allreader[place].borrow[w].bookname,"\0");
}
allreader[place].bookborrowed=0;
strcpy(allreader[place].readerid,"\0");
strcpy(allreader[place].readername,"\0");
printf("现在我们输出删除读者之后的读者信息\n");
printf("readersum:%d\n",readersum);
for(int x=0;x<readersum;x++)
{
printf("readerid:%s",allreader[x].readerid);
printf("readername:%s",allreader[x].readername);
printf("bookborrowed:%d\n",allreader[x].bookborrowed);
for(int y=0;y<allreader[x].bookborrowed;y++)
{
printf("bookid:%s",allreader[x].borrow[y].bookid);
printf("bookname:%s",allreader[x].borrow[y].bookname);
printf("bookamount:%d\n",allreader[x].borrow[y].amount);
}
}
printf("删除读者成功 \n");
break;
}
}
if(flag==0)
{
printf("没有找到要删除的读者\n");
return;
}
}
void addbook()//增加图书信息
{
if (booksum>=maxbook)
{
printf("图书馆的书已经达到最大数量,无法再增加\n");
return;
}
printf("请输入要增加图书的id\n");
char add[100];
gets(add);
strcat (add,"\n");
strcpy(allbook[booksum].bookid,add);
printf("请输入要增加图书的name\n");
gets(add);
strcat (add,"\n");
strcpy(allbook[booksum].bookname,add);
printf("请输入要增加图书的amount\n");
int amount;
scanf("%d",&amount);
allbook[booksum].amount=amount;
booksum++;
printf("现在我们输出增加图书之后的图书信息\n");
printf("booksum:%d\n",booksum);
for(int x=0;x<booksum;x++)
{
printf("bookid:%s",allbook[x].bookid);
printf("bookname:%s",allbook[x].bookname);
printf("bookamount:%d\n",allbook[x].amount);
}
printf("增加图书成功 \n");
}
void addreader()//增加读者信息
{
if (readersum>=maxreader)
{
printf("图书馆的读者已经达到最大数量,无法再增加\n");
return;
}
printf("请输入要增加读者的id\n");
char add[100];
gets(add);
strcat (add,"\n");
strcpy(allreader[readersum].readerid,add);
printf("请输入要增加读者的name\n");
gets(add);
strcat (add,"\n");
strcpy(allreader[readersum].readername,add);
printf("请输入要增加的读者的bookborrowed\n");
int amount;
scanf("%d",&amount);
getchar();
allreader[readersum].bookborrowed=amount;
for(int w=0;w<allreader[readersum].bookborrowed;w++)
{
char modify[100];
printf("请输入借的书id\n");
gets(modify);
strcat(modify,"\n");
int re=findbook(modify);
while(1)
{
if(re==1)
{
strcpy(allreader[readersum].borrow[w].bookid,modify);
break;
}
else if(re==0)
{
printf("图书馆里没有此id的书,请重新输入书id\n");
gets(modify);
strcat(modify,"\n");
re=findbook(modify);
}
}
char modifyid[100];
strcpy(modifyid,modify);
printf("请输入此id对应的书name\n");
gets(modify);
strcat(modify,"\n");
int pipei=1;
while(pipei)
{
for(int g=0;g<booksum;g++)
{
if(strcmp(allbook[g].bookid,modifyid)==0)
{//找到了id所在的位置g
if(strcmp(allbook[g].bookname,modify)==0)
{//判断这个id对应的name和输入的name是不是匹配的
strcpy(allreader[readersum].borrow[w].bookid,modify);
pipei=0;//可以匹配,跳出循环
break;
}
else
{
printf("输入书的id和name不对应,请重新输入name\n");
gets(modify);
strcat(modify,"\n");
break;
}
}
}
}
allreader[readersum].borrow[w].amount=1;
}
readersum++;
printf("现在我们输出增加读者之后的读者信息\n");
printf("readersum:%d\n",readersum);
for(int x=0;x<readersum;x++)
{
printf("readerid:%s",allreader[x].readerid);
printf("readername:%s",allreader[x].readername);
printf("bookborrowed:%d\n",allreader[x].bookborrowed);
for(int y=0;y<allreader[x].bookborrowed;y++)
{
printf("bookid:%s",allreader[x].borrow[y].bookid);
printf("bookname:%s",allreader[x].borrow[y].bookname);
printf("bookamount:%d\n",allreader[x].borrow[y].amount);
}
}
printf("增加读者成功 \n");
}
测试数据设计和测试结果及分析
管理员和读者共同的功能
- 录入图书信息
- 录入读者信息
(这两张图片是连接在一起的) - 查询图书信息
读者特性功能
-
显示读者界面
-
借书
-
还书
管理员特性功能
1.显示管理员界面
2. 修改图书信息
3. 修改读者信息
4. 删除图书信息
5.删除读者信息
6.增加图书信息
7.增加读者信息
(这两张图片是连续的)
不足之处
1.在前面读取信息的时候我就说了
因为我是用strcmp函数比较。比如
> if(strcmp(tmp,"end")==0) break;
这就导致一个后果,如果我"end"后面加了空格之类的,“end ”我strcmp(tmp,“end”)的结果就不是0了,达不到结束读取信息的要求。
2.关于保存借书记录
我是直接用结构体储存的,但是某位同学一直劝我说要把信息写入文档borrowed.txt,(新开一个)。这个吧,看各自的选择吧。我当时太赶了,没想太多。
3.关于管理员和读者
第一个参数为可执行程序名称;第二个参数为用户身份,-a 表示管理员,-u 表示读者; 第三个参数为用户名
在命令行参数直接输入Libsim -a(-u) xxxx
我没有考虑管理员和读者是有限制的。比如正常的逻辑本来应该输入Libsim -a John(管理员的名字叫John),但是我没有考虑要查找是否有John这个管理员。所以我本应该提前录入管理员和读者的信息的(文件操作用txt文档录入信息),在程序运行时我们需要考虑管理员和读者是否存在,不能乱输入一个名字然后开始应用系统,那样不就乱套了。