library.h
#define RMAX 40
typedef struct bookinfo
{
int bookId;
char name[20];
double price;
char borrowed;
char author[20];
int readerID;
struct bookinfo *next;
}Book;
typedef struct readerinfo
{
int id;
char name[20];
char sex;
int age;
char profess[80];
int borrowedNumb;
}Reader;
void linkInit();
void inputError();
void queryBookInfo();
void manageBookInfo();
void manageReaderInfo();
void borrowBooks();
void returnBooks();
void manageSystem();
main.c
#include
#include
#include"library.h"
Book *head;
Reader reader[RMAX];
int num=0;
void esc()
{
char choose;
system("cls");
printf("\n\n是否导出全部数据::");
getchar();
scanf("%c",&choose);
if(choose=='Y')exportAll();
}
int main()
{
linkInit();
while(1)
{
int choose;
system("cls");
printf("\n\n\t\t 图书借阅管理信息系统\n");
printf("\t----------------------------------------------\n");
printf("\t\t\t1.图书信息查询\n\n");
printf("\t\t\t2.图书信息管理\n\n");
printf("\t\t\t3.读者信息管理\n\n");
printf("\t\t\t4.借 书\n\n");
printf("\t\t\t5.还 书\n\n");
printf("\t\t\t6.系 统 管 理\n\n");
printf("\t\t\t0.退 出 系 统\n");
printf("\t----------------------------------------------\n");
printf("\n\n\t请选择您想使用的功能<0-6>:");
scanf("%d",&choose);
switch(choose)
{
case 1:queryBookInfo(head);break;
case 2:manageBookInfo();break;
case 3:manageReaderInfo();break;
case 4:borrowBooks();break;
case 5:returnBooks();break;
case 6:manageSystem();break;
case 0:esc();return 0;break;
default:inputError();break;
}
}
return 0;
}
void linkInit()
{
Book *body1,*body2,*body3;
head=(Book*)malloc(sizeof(Book));
head->next=NULL;
}
void inputError()
{
printf("\n\t您输入的不是正确的序号,");
system("PAUSE");
}
ManageBookInfo.c
extern struct bookinfo *head;
static void sort()
{
printf("\n\n\t\t任选功能暂不开发,");
system("pause");
}
static void deldate()
{
struct bookinfo *link,*body;
int numb;
char choose;
link=head;
system("cls");
printf("\n\n\t\t输入需要删除的图书编号:");
scanf("%d",&numb);
while(link->next!=0)
{
body=link;
link=link->next;
if(link->bookId==numb)
{
system("cls");
printf("\t\t 原书信息\n");
printf("\t\t****************\n");
printf("\t\t图书编号:%d\n",link->bookId);
printf("\t\t书 名:%s\n",link->name);
printf("\t\t单 价:%.2lf\n",link->price);
printf("\t\t作 者:%s\n",link->author);
printf("\t\t是否借出:%c\n",link->borrowed);
printf("\t\t读者编号:%d\n",link->readerID);
printf("\t\t****************\n\n");
printf("\t\t确认删除(输入Y确认删除,其他字符视为放弃):");
getchar();
scanf("%c",&choose);
if(choose=='Y')
{
body->next=0;
free(link);
printf("\n\n\t\t删除成功,");
system("pause");
return;
}
return;
}
}
printf("\n\t\t未找到该图书,");
system("pause");
}
static void update()
{
struct bookinfo *link,*body;
int numb,newid;
link=head;
system("cls");
printf("\n\n\t\t输入需要更改的图书编号:");
scanf("%d",&numb);
while(link->next!=0)
{
link=link->next;
if(link->bookId==numb)
{
system("cls");
printf("\t\t 原书信息\n");
printf("\t\t****************\n");
printf("\t\t图书编号:%d\n",link->bookId);
printf("\t\t书 名:%s\n",link->name);
printf("\t\t单 价:%.2lf\n",link->price);
printf("\t\t作 者:%s\n",link->author);
printf("\t\t是否借出:%c\n",link->borrowed);
printf("\t\t读者编号:%d\n",link->readerID);
printf("\t\t****************\n\n");
printf("\t\t图书编号(非正数视为放弃):");
scanf("%d",&newid);
if(newid<=0)
{
return;
}
link->bookId=newid;
printf("\t\t书 名:");
getchar();
gets(link->name);
printf("\t\t单 价:");
scanf("%lf",&link->price);
printf("\t\t作 者:");
getchar();
gets(link->author);
return;
}
}
printf("\n\t\t未找到该图书,");
system("pause");
}
static void add()
{
struct bookinfo *link,*body;
link=head;
while(link->next!=0)
{
link=link->next;
}
system("cls");
printf("\n\n\t\t输入图书信息(图书编号为非正数则结束)\n\n");
while(1)
{
body=(Book*)malloc(sizeof(Book));
printf("\t\t图书编号:");
scanf("%d",&body->bookId);
if(body->bookId<=0)
{
free(body);
break;
}
printf("\t\t书 名:");
getchar();
gets(body->name);
printf("\t\t单 价:");
scanf("%lf",&body->price);
printf("\t\t作 者:");
getchar();
gets(body->author);
body->next=0;
body->borrowed='N';
body->readerID=0;
link->next=body;
link=body;
printf("\n\n\t\t****************************\n\n");
}
}
static void show()
{
struct bookinfo *link;
system("cls");
printf("------------------------------图 书 信 息--------------------------------------\n\n");
printf("图书编号\t书名\t\t单价\t作者\t\t是否借出\t读者编号\n\n");
link=head;
while(link->next!=0)
{
link=link->next;
printf("%d\t\t%s\t\t%.2lf\t%s\t\t%c\t\t%d\n\n",link->bookId,link->name,link->price,link->author,link->borrowed,link->readerID);
}
system("pause");
}
void manageBookInfo()
{
while(1)
{
int choose;
//绘制菜单
system("cls");
printf("\n\n\t\t 图 书 信 息 管 理\n");
printf("\t----------------------------------------------\n");
printf("\t\t\t1.浏览所有图书信息\n\n");
printf("\t\t\t2.新 增 图 书\n\n");
printf("\t\t\t3.修 改 图 书 信息\n\n");
printf("\t\t\t4.删 除 图 书 信息\n\n");
printf("\t\t\t5.排 序\n\n");
printf("\t\t\t0.返回 上一级 菜单\n");
printf("\t----------------------------------------------\n");
printf("\n\n\t请选择您想使用的功能<0-5>:");
//选择功能
scanf("%d",&choose);
switch(choose)
{
case 1:show();break;
case 2:add();break;
case 3:update();break;
case 4:deldate();break;
case 5:break;
case 0:return;break;
default:inputError();break;
}
}
}
ManageReaderInfo.c
#include"library.h"
extern Reader reader[RMAX];
extern int num;
static void sort()
{
printf("\n\n\t\t任选功能暂不开发,");
system("pause");
}
static void deldate()
{
int i,j,temp;
Reader newReader;
char choose;
system("cls");
printf("\n\n\t\t输入需要删除的读者编号:");
scanf("%D",&temp);
for(i=0;iif(reader[i].id==temp)
{
printf("\n\t\t读者编号:%d",reader[i].id);
printf("\n\t\t读 者 名:%s",reader[i].name);
printf("\n\t\t年 龄:%d",reader[i].age);
printf("\n\t\t性别:%c",reader[i].sex);
printf("\n\t\t所 在 系:%s",reader[i].profess);
getchar();
printf("\n\n\t\t确认删除(输入Y确认,其他字符视为放弃):");
scanf("%c",&choose);
if(choose=='Y')
{
for(j=i;j1;j++);
{
reader[j]=reader[j+1];
}
num--;
}
break;
}
}
if(i==num)
{
printf("\n\t\t错误:该读者不存在!\n");
printf("\t\t");
system("pause");
}
}
static void update()
{
int i,temp;
Reader newReader;
char choose;
system("cls");
printf("\n\n\t\t输入需要更改的读者编号:");
scanf("%D",&temp);
for(i=0;iif(reader[i].id==temp)
{
printf("\n\t\t读者编号:%d",reader[i].id);
printf("\n\t\t读 者 名:%s",reader[i].name);
printf("\n\t\t年 龄:%d",reader[i].age);
printf("\n\t\t性别:%c",reader[i].sex);
printf("\n\t\t所 在 系:%s",reader[i].profess);
printf("\n\n\t**************(新读者编号为非正数视为放弃)*************");
printf("\n\n\t\t读者编号:");
scanf("%d",&newReader.id);
if(newReader.id<=0)
{
return;
}
printf("\t\t读 者 名:");
getchar();
gets(newReader.name);
printf("\t\t年 龄:");
scanf("%d",&newReader.age);
printf("\t\t性别:");
getchar();
scanf("%c",&newReader.sex);
printf("\t\t所 在 系:");
getchar();
gets(newReader.profess);
newReader.borrowedNumb=0;
printf("\n\t\t确认更改(输入Y确认,其他字符视为放弃):");
scanf("%c",&choose);
if(choose=='Y')
{
reader[i]=newReader;
}
break;
}
}
if(i==num)
{
printf("\n\t\t错误:该读者不存在!\n");
printf("\t\t");system("pause");
}
}
static void add()
{
Reader newReader;
system("cls");
printf("\n\n\t\t输入读者信息(读者编号为非正数则结束)\n");
while(1)
{
printf("\n\t\t----------------------------------------\n");
printf("\t\t读者编号:");
scanf("%d",&newReader.id);
if(newReader.id<=0)
{
break;
}
printf("\t\t读 者 名:");
getchar();
gets(newReader.name);
printf("\t\t年 龄:");
scanf("%d",&newReader.age);
printf("\t\t性别:");
getchar();
scanf("%c",&newReader.sex);
printf("\t\t所 在 系:");
getchar();
gets(newReader.profess);
newReader.borrowedNumb=0;
reader[num++]=newReader;
}
}
static void show()
{
int i=0;
system("cls");
printf("------------------------------读 者 信 息--------------------------------------\n\n");
printf("读者编号\t姓名\t性别\t年龄\t所在系\t\t借书数\n");
for(i=0;iprintf("%d\t\t%s\t%c\t%d\t%s\t\t%d\n",reader[i].id,reader[i].name,reader[i].sex,reader[i].age,reader[i].profess,reader[i].borrowedNumb);
}
system("pause");
}
void manageReaderInfo()
{
while(1)
{
int choose;
system("cls");
printf("\n\n\t\t 读 者 信 息 管 理\n");
printf("\t----------------------------------------------\n");
printf("\t\t\t1.浏览所有读者信息\n\n");
printf("\t\t\t2.新 增 读 者\n\n");
printf("\t\t\t3.修 改 读 者 信息\n\n");
printf("\t\t\t4.删 除 读 者 信息\n\n");
printf("\t\t\t5.排 序\n\n");
printf("\t\t\t0.返回 上一级 菜单\n");
printf("\t----------------------------------------------\n");
printf("\n\n\t请选择您想使用的功能<0-5>:");
scanf("%d",&choose);
switch(choose)
{
case 1:show();break;
case 2:add();break;
case 3:update();break;
case 4:deldate();break;
case 5:break;
case 0:return;break;
default:inputError();break;
}
}
}
ManageSystem.c
#include"library.h"
#include
extern Reader reader[RMAX];
extern int num;
extern struct bookinfo *head;
static void exportBook()
{
FILE *fp;
Book *link,*last;
char choose;
link=head;
fp=fopen("book.dat","wb");
while(link->next!=0)
{
last=link;
link=link->next;
fwrite(link,sizeof(Book),1,fp);
last->next=link->next;
free(link);
link=last;
}
fclose(fp);
num=0;
system("cls");
printf("\n\n\t\t图书信息导出成功!\n\n\t\t");
system("pause");
}
static void exportReader()
{
FILE *fp;
int i;
char choose;
fp=fopen("reader.dat","wb");
for(i=0;isizeof(Reader),1,fp);
}
fclose(fp);
system("cls");
printf("\n\n\t\t读者信息导出成功!\n\n\t\t");
system("pause");
}
void exportAll()
{
exportReader();
exportBook();
}
static void importBook()
{
FILE *fp;
Book *link,*body;
link=head;
fp=fopen("book.dat","rb");
while(1)
{
body=(Book*)malloc(sizeof(Book));
fread(body,sizeof(Book),1,fp);
if(feof(fp))
{
free(body);
break;
}
body->next=0;
link->next=body;
link=body;
}
fclose(fp);
system("cls");
printf("\n\n\t\t图书信息导入成功!\n\n\t\t");
system("pause");
}
static void importReader()
{
FILE *fp;
int i;
char choose;
fp=fopen("reader.dat","rb");
num=0;
for(i=0;isizeof(Reader),1,fp);
if(feof(fp))break;
num++;
}
system("cls");
printf("\n\n\t\t读者信息导入成功!\n\n\t\t");
system("pause");
}
static void importAll()
{
importReader();
importBook();
}
static void export()
{
while(1)
{
int choose;
system("cls");
printf("\n\n\t\t 导 出 到 文 件\n");
printf("\t----------------------------------------------\n");
printf("\t\t\t1.导 出 图 书 信 息\n\n");
printf("\t\t\t2.导 出 读 者 信 息\n\n");
printf("\t\t\t3.导 出 全 部 信 息\n\n");
printf("\t\t\t0.返 回 上 级 菜 单\n");
printf("\t----------------------------------------------\n");
printf("\n\n\t请选择您想使用的功能<0-5>:");
scanf("%d",&choose);
switch(choose)
{
case 1:exportBook();break;
case 2:exportReader();break;
case 3:exportAll();break;
case 0:return;break;
default:inputError();break;
}
}
}
static void import()
{
while(1)
{
int choose;
system("cls");
printf("\n\n\t\t 导 入 到 系 统\n");
printf("\t----------------------------------------------\n");
printf("\t\t\t1.导 入 图 书 信 息\n\n");
printf("\t\t\t2.导 入 读 者 信 息\n\n");
printf("\t\t\t3.导 入 全 部 信 息\n\n");
printf("\t\t\t0.返 回 上 级 菜 单\n");
printf("\t----------------------------------------------\n");
printf("\n\n\t请选择您想使用的功能<0-5>:");
scanf("%d",&choose);
switch(choose)
{
case 1:importBook();break;
case 2:importReader();break;
case 3:importAll();break;
case 0:return;break;
default:inputError();break;
}
}
}
void manageSystem()
{
while(1)
{
int choose;
system("cls");
printf("\n\n\t\t 系 统 管 理\n");
printf("\t----------------------------------------------\n");
printf("\t\t\t1.导 出 到 文 件\n\n");
printf("\t\t\t2.从 文 件 导 入 \n\n");
printf("\t\t\t0.返回 上一级 菜单\n");
printf("\t----------------------------------------------\n");
printf("\n\n\t请选择您想使用的功能<0-5>:");
scanf("%d",&choose);
switch(choose)
{
case 1:export();break;
case 2:import();break;
case 0:return;break;
default:inputError();break;
}
}
}
QueryBookInfo.c
extern struct bookinfo *head;
static int findstring(char s1[],char s2[])
{
int i=0,j=0;
while(s1[i]!='\0')
{
if(s2[j]=='\0') return i;
if(s1[i+j]==s2[j])
{
j++;
}else{
i++;
j=0;
}
}
return -1;
}
static void byId()
{
struct bookinfo *link,*body;
int numb,count=0,choose;
link=head;
system("cls");
printf("\n\n\t\t输入要查找的图书编号:");
scanf("%d",&numb);
while(link->next!=0)
{
body=link;
link=link->next;
if(link->bookId==numb)
{
count++;
//system("cls");
printf("\n\n\t\t 查询结果\n");
printf("\t\t****************\n");
printf("\t\t图书编号:%d\n",link->bookId);
printf("\t\t书 名:%s\n",link->name);
printf("\t\t单 价:%.2lf\n",link->price);
printf("\t\t作 者:%s\n",link->author);
printf("\t\t是否借出:%c\n",link->borrowed);
printf("\t\t读者编号:%d\n",link->readerID);
printf("\t\t****************\n\n");
}
}
if(count==0)
{
printf("\n\t\t未找到符合要求的图书,");
}else{
printf("\n\t\t共找到%d条结果,",count);
}
printf("输入Y继续查找,其他字符视为放弃:");
getchar();
scanf("%c",&choose);
if(choose=='Y') byId();
}
static void byName()
{
struct bookinfo *link,*body;
int count=0;
char name[20],choose;
link=head;
system("cls");
//fflush(stdin);
printf("\n\n\t\t输入要查找的书名关键字:");
getchar();
gets(name);
while(link->next!=0)
{
body=link;
link=link->next;
if(findstring(link->name,name)!=-1)
{
count++;
//system("cls");
printf("\n\n\t\t 查询结果\n");
printf("\t\t****************\n");
printf("\t\t图书编号:%d\n",link->bookId);
printf("\t\t书 名:%s\n",link->name);
printf("\t\t单 价:%.2lf\n",link->price);
printf("\t\t作 者:%s\n",link->author);
printf("\t\t是否借出:%c\n",link->borrowed);
printf("\t\t读者编号:%d\n",link->readerID);
printf("\t\t****************\n\n");
}
}
if(count==0)
{
printf("\n\t\t未找到符合要求的图书,");
}else{
printf("\n\t\t共找到%d条结果,",count);
}
printf("输入Y继续查找,其他字符视为放弃:");
scanf("%c",&choose);
if(choose=='Y') byName();
}
static void byAuthor()
{
struct bookinfo *link,*body;
int count=0;
char author[20],choose;
link=head;
system("cls");
printf("\n\n\t\t输入要查找的图书作者关键字:");
getchar();
gets(author);
while(link->next!=0)
{
body=link;
link=link->next;
if(findstring(link->author,author)!=-1)
{
count++;
//system("cls");
printf("\n\n\t\t 查询结果\n");
printf("\t\t****************\n");
printf("\t\t图书编号:%d\n",link->bookId);
printf("\t\t书 名:%s\n",link->name);
printf("\t\t单 价:%.2lf\n",link->price);
printf("\t\t作 者:%s\n",link->author);
printf("\t\t是否借出:%c\n",link->borrowed);
printf("\t\t读者编号:%d\n",link->readerID);
printf("\t\t****************\n\n");
}
}
if(count==0)
{
printf("\n\t\t未找到符合要求的图书,");
}else{
printf("\n\t\t共找到%d条结果,",count);
}
printf("输入Y继续查找,其他字符视为放弃:");
scanf("%c",&choose);
if(choose=='Y') byAuthor();
}
void queryBookInfo()
{
while(1)
{
int choose;
//绘制菜单
system("cls");
printf("\n\n\t\t 图书查询\n");
printf("\t----------------------------------------------\n");
printf("\t\t\t1.按图书编号查询\n\n");
printf("\t\t\t2.按 书 名 查 询\n\n");
printf("\t\t\t3.按 作 者 查 询\n\n");
printf("\t\t\t0.返回上一级菜单\n");
printf("\t----------------------------------------------\n");
printf("\n\n\t请选择您想使用的功能<0-3>:");
//选择功能
scanf("%d",&choose);
switch(choose)
{
case 1:byId();break;
case 2:byName();break;
case 3:byAuthor();break;
case 0:return;break;
default:inputError();break;
}
}
}
ReturnBooks.c
extern Reader reader[RMAX];
extern int num;
extern struct bookinfo *head;
static Book* getBookById(int numb)
{
struct bookinfo *link,*body;
link=head;
while(link->next!=0)
{
body=link;
link=link->next;
if(link->bookId==numb)
{
if(link->borrowed=='N')
{
printf("\n错误:该图书尚未外借");
return 0;
}else{
return link;
}
}
}
printf("\n错误:未找到符合要求的图书");
return 0;
}
void returnBooks()
{
int bookid,readerid,i;
Book *node;
char choose;
system("cls");
printf("\n\n\t\t 归还图书");
printf("\n--------------------------------------\n");
printf("\n图书编号:");
scanf("%d",&bookid);
node=getBookById(bookid);
if(node!=0)
{
printf("\n读者编号:");
scanf("%d",&readerid);
for(i=0;iif(reader[i].id==readerid)
{
if(node->readerID!=reader[i].id)
{
printf("\n\n错误:该读者没有借此书");
break;
}
node->borrowed='N';
node->readerID=0;
reader[i].borrowedNumb--;
printf("\n\n归还完成!");
break;
}
}
if(i==num)
{
printf("\n\n错误:未找到该读者");
}
}
printf("\n\n是否继续借书::");
getchar();
scanf("%c",&choose);
if(choose=='Y')returnBooks();
}