图书管理系统
系统需求
一、 新书入库: 图书信息包括书名, 书号, 库存量, 现存量共4项. 首先输入3本书的信息, 并将其存入文件 ”book.dat” 中. 当有新书入库时, 先判断文件中是否有此书( 即比较书名 ), 若有则修改库存量, 现存量的信息; 若无此书, 则将该书的信息添加到文件中.
二、图书查询: 输入一个书号, 在文件中查找此书, 若找到则输出此书的全部信息; 若找不到则输出查找失败的信息.
三、借阅管理
(1) 每个读者的信息包括姓名, 编号, 1张借书卡( 限借一本书 ), 输入3个读者的信息存入文件 “reader . dat” 中.
(2) 借书登记: 输入读者的编号, 所借图书的书号, 先判断姓名是否在文件”reader.dat” 中, 若有则将书号存入一张借书卡上( 注: 初始时借书卡的信息都为零, 借书后借书卡的信息改为所借书的书号), 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量. 若”reader.dat”无此姓名, 则应提示错误
(3) 还书管理: 输入读者的编号, 所还图书的书号, 将借书卡的信息置为零, 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量.
四、输出全部图书信息和全部读者信息
五、退出系统.
一、 仔细阅读系统要求,首先将此系统化分为如下模块(即如下函数)
1、 新书入库模块:可用一个函数insert_new_book(char book_num[],char book_name[],int number)来实现。形参分别为:书名, 书号,以及有多少本书要入库,再根据要求将信息写入文件boot.dat中。又由于最开始要输入三本新书,故可以加一个初始化函数init_book(),但是初始化函数只执行一次,也就是在系统第一次运行的时候执行,此时可以根据判断是否存在boot.dat这个文件来决定是否执行初始化函数.
2、 查询模块:可用一个函数void find_book(char book_num[])来实现。找到就输出此书全部信息,找不到就输出查找失败信息。
3、 借阅管理模块:
(1) 三个读者的信息可以在系统初始化时完成.即可用初始化函数init_reader()来实现对读者的初始化。因为读者初始化函数也只是在系统第一次运行的时候执行一次,故也可以根据是否存在reader.dat文件来确定是否执行此函数。(到现在可以发现在系统初始化函数里,至少已经需要调用两个初始化函数了)
(2) 借书登记模块:可用一个函数borrow_book(char reader_num[],char book_num[])来实现。在函数中要分别判断
A 该读者的编号是否已经存在,如果不存在,则提示错误。
B 该读者的借阅书是否已满(即最多只能借1本书)如果是,则提醒该用户先去还书
C 输出的书号对应的书是否存在,如果不存在,则提醒读者不存在此书。
借书过程完成后,则对读者信息里的借书信息写上所借书号,并修改库存量。
(3) 还书管理模块:可用一个函数return_book(char reader_num[],
char book_num[])来实现。在实现此函数时要判断:
A 该读者的姓名是否已经存在,如果不存在,则提示错误。
B 该读者是否已经借阅此书。如果没有,则提示错误。
C 还书过程完成后,则对读者信息里的借书信息清零,并修改库存量。
4、 输出图书和读者信息:可分别用模块print_book()和print_reader()来实现
直接从book.dat文件和reader.dat文件中读取信息并输出。
5、 退出系统:可用一个函数exit()来实现。首先将信息保存到文件,释放动态创建的内存空间,再退出此程序。
详细设计
一、 界面设计
此系统界面采用图形和数字化菜单设计。
主界面设计如下:
图书管理系统
图书管理系统主菜单
请选择相应的数字执行相应的功能:
0:退出此系统
1:新书入库
2:图书查询
3:借书登记
4:还书管理
5:输出全部图书信息和读者信息
各子界面如下:
1、 新书入库界面:
请选择相应的数字执行相应的功能:
10:返回主菜单
11:新书入库
请输入新书名:
请输入新书号:
请输入新书数量:
(注:新书入库成功后,程序返回到子界面1)
2、 图书查询界面界面:
请选择相应的数字执行相应的功能:
20:返回主菜单
21:图书查询
请输入需要查询的书号:
(注:图书查询完成后,返回到子界面2)
` 3、借书登记界面:
请选择相应的数字执行相应的功能:
30:返回主菜单
31:借书登记
请输入读者编号:
请输入所借书号:
(注:借书过程完成后,返回到子界面3)
` ` 4、还书管理:
请选择相应的数字执行相应的功能:
40:返回主菜单
41:还书登记
请输入读者编号:
请输入所借书号:
(注:还书过程完成后,返回到子界面4)
5、输出全部图书和读者信息:
请选择相应的数字执行相应的功能:
50:返回主菜单
51:输出全部图书信息:
书号 书名: 库存量 现存量
52:输出全部读者信息:
读者编号 读者姓名 所借书号
(注:输出图书和读者信息后,返回到子界面5)
二、 数据结构设计
程序中考虑到图书信息和读者信息中都包含有不同类型的数据,故分别建立图书和读者两种类型的结构体;由于图书和读者的数量非固定,所以采用动态链式存储来实现。
图书类型:
typedef struct bk{
char book_num[11]; /* 书号采用10位编码最后1位为字符串结束标志(下同). */
char book_name[41]; /* 书名规定不超过40个字母(20 个汉字) */
unsigned book_kc,book_xc; /* book_kc 代表库存梁,book_xc代表现存量 */
struct bk *next;
}book;
读者类型:
typedef struct rd{
char reader_num[11]; /* 读者编号采用10位编码 */
char reader_name[11]; /* 读者姓名 */
char reader_book_num[11]; /*表示所借书号,初始值为“0”*/
struct bk *next;
}reader;
程序代码:
#include
#include
#include
#include
typedef struct bk {
char book_num[11];
char book_name[41];
int book_kc;
int book_xc;
struct bk * next;
}book; /* 图书信息*/
typedef struct rd {
char reader_num[11];
char reader_name[11];
char reader_book_num[11];
struct rd * next ;
}reader;/*读者信息*/
struct bk * h_book,* h_reader; /*全局变量,分别为指向图书信息链表和读者信息链表的头指针*/
void Form_Insert_New_Book(); /*新书入库菜单*/
void Form_Find_Book(); /*查询图书菜单 */
void Form_Borrow_Book(); /*借书菜单*/
void Form_Return_Book(); /*还书菜单*/
void Find_Book(char *); /*查询图书*/
void Insert_New_Book(char *,char * ,int ); /*新书入库,即在链表中插入一个新节点*/
void Borrow_Book(char *,char *);/*借书,修改读者借阅信息和图书的现存信息*/
void Return_Book(char *,char *);/*还书,修改读者借阅信息和图书的现存信息*/
void print_book(struct bk *);/*输出全部图书信息*/
void print_reader(struct rd *);/*输出全部读者信息*/
void load_data();/*从文件中读取数据,链表头指针指向第一个节点*/
void init_reader();/*第一次运行程序时对三个读者的初始化*/
void init_book();/*第一次运行程序时对三本图书的初始化*/
void save();/*将链表中的信息保存到文件中*/
void M_Form()/*主菜单*/
{ char ch;
printf("\n 图书管理系统主窗口");
printf("\n 0:退出系统");
printf("\n 1:新书入库");
printf("\n 2:图书查询");
printf("\n 3:借书登记");
printf("\n 4:还书管理");
printf("\n 5:输出全部信息");
do{ /*此循环用来保证选择正确的数字键执行相应的功能*/
printf("\n\n 请选择相应的功能代码:");
scanf("%c",&ch);
fflush(stdin); /*用于清除键盘缓冲区中的多余字符*/
}while(ch!='0'&&ch!='1'&&ch!='2'&&ch!='3'&&ch!='4'&&ch!='5');
switch(ch) /*根据输入的字符进行选择执行相应的模块*/
{ case '0':exit(0);
case '1':Form_Insert_New_Book();break;
case '2':Form_Find_Book();break;
case '3':Form_Borrow_Book();break;
case '4':Form_Return_Book();break;
case '5':load_data();print_book(h_book);print_reader(h_reader);M_Form();
default:printf("error\n");exit(0);
}
}
void Form_Find_Book()
{ char ch;
char book_num[11];
printf("\n 图书查询功能模块,请选择相应的功能代码:\n");
printf(" 0:返回到主菜单\n");
printf(" 1:图书查询");
do{
printf("\n\n 请选择相应的功能代码:");
scanf("%c",&ch);
fflush(stdin);
}while(ch!='0'&&ch!='1');
switch(ch)
{ case '0':M_Form();break; /*选择0,则返回到上一级目录,即主菜单*/
case '1':
{ printf(" \n请输入需要需要查询的书的编号:");
scanf("%s",book_num);
fflush(stdin);
Find_Book(book_num); /*执行查询*/
Form_Find_Book();/*查询完毕后继续返回到查询窗口,执行下一个查询*/
}
default:printf("error\n");exit(0);
}
}
void Find_Book(char book_num[]) /*查询图书模块,根据图书编号查询*/
{ struct bk *p;
p=h_book;
while(p!=NULL&&strcmp(p->book_num,book_num)!=0)
p=p->next; /*此循环用于查找,如果在中间找到,则p就不可能到末尾指向空*/
if(p==NULL) printf("\n\t此编号对应的图书不存在!\n");
else { printf("\n\t图书编号\t图书名\t库存量\t现存量 \n");
printf(" %10s\t %10s\t %d\t %d\t\n",p->book_num,p->book_name,p->book_kc,p->book_xc);
}
getch();
}
void init_book() /*初始化图书模块*/
{ book ba[3];
FILE *fp;
int i;
printf("\n 系统即将进行初始化,图书初始化模块:\n");
printf("\n 请分别输入三本书的书号,书名,数量(以空格隔开):\n ");
for(i=0;i<3;i++) /*输入3本图书进行初始化*/
scanf("%s%s%d",ba[i].book_num,ba[i].book_name,&ba[i].book_kc);
for(i=0;i<3;i++) {ba[i].book_xc=ba[i].book_kc;} /*开始时库存=现存*/
if((fp=fopen("book.dat","wb"))==NULL)/*建立新文件book.dat准备写入数据*/
{ printf("不能建立图书文件,初始化失败!请重新启动系统!\n"); return; }
for(i=0;i<3;i++)/*将初始化的3本图书写入文件book.dat中*/
{ if(fwrite(&ba[i],sizeof(struct bk),1,fp)!=1)
{ printf("\写数据错误!\n"); exit(0); }
}
fclose(fp);
}
void init() /*对图形函数、图书信息、读者信息进行初始化(本程序中暂且没有用图形函数)*/
{ int drive=DETECT,mode=0;
initgraph(&drive,&mode,"");
init_book();
init_reader();
}
void Insert_New_Book(char book_num[],char book_name[],int number)
/*增加1本新书,读入新书的名称、编号和数量*/
{ struct bk *book_fp;
struct bk *p,*q,*t;
q=p=h_book;
while(p!=NULL&&strcmp(p->book_num,book_num)!=0) { q=p;p=p->next; }
if(strcmp(p->book_num,book_num)==0)
{ printf("\n\t\t此编号已经存在,请重新输入!\n");
return;
}
t=(struct bk *)malloc(sizeof(struct bk));
strcpy(t->book_num,book_num);
strcpy(t->book_name,book_name);
t->book_kc=t->book_xc=number;
q->next=t;t->next=NULL;
if((book_fp=fopen("book.dat","ab"))==NULL)
{ printf("不能建立图书文件,初始化失败!请重新启动系统!\n"); return; }
/*将新书信息添加到文件中*/
fwrite(t,sizeof(struct bk),1,book_fp);
fclose(book_fp);
}
void print_book(struct bk *h)
/*输出图书信息*/
{ struct bk *p;
p=h;
printf("\n\t图书编号 \t图书名 \t库存量 \t现存量 \n");
while(p!=NULL)
{ printf(" %10s\t %10s %10d\t%10d\n",p->book_num,p->book_name,p->book_kc,p->book_xc);
p=p->next;
}
}
void print_reader(struct rd *h)
/*输出读者信息*/
{ struct rd *p;
p=h;
printf("\n\t读者编号 \t读者姓名 \t所借书号 \n");
while(p!=NULL)
{ printf(" %10s\t %10s %10s\n",p->reader_num,p->reader_name,p->reader_book_num);
p=p->next;
}
getch();
}
void Form_Borrow_Book()
/*借书菜单界面*/
{ char ch;
char book_num[11],reader_num[11];
printf("\n 图书借阅功能模块,请选择相应的功能代码:\n");
printf(" 0:返回到主菜单\n");
printf(" 1:图书借阅\n");
do{
printf("\n\n 请选择相应的功能代码:");
scanf("%c",&ch);
fflush(stdin);
}while(ch!='0'&&ch!='1');
switch(ch)
{ case '0':M_Form();break;
case '1':
{ printf(" \n请输入读者编号与所借书编号:(以空格分隔)");
scanf("%s%s",reader_num,book_num);
fflush(stdin);
Borrow_Book(reader_num,book_num);/*调用借书函数,执行借书功能*/
Form_Borrow_Book();/*借书完成后,程序返回到借书菜单*/
}
default:printf("error\n");exit(0);
}
}
void Borrow_Book(char reader_num[],char book_num[])
/*输入读者编号,和需要借阅的书的编号,执行借书功能*/
{ struct bk *book_p;
struct rd *reader_p;
book_p=h_book;
while(book_p!=NULL&&strcmp(book_p->book_num,book_num)!=0)
book_p=book_p->next;
if(book_p==NULL)
{ printf("\n\t此编号对应的图书不存在!\n");
Form_Borrow_Book();
}
reader_p=h_reader;
while(reader_p!=NULL&&(strcmp(reader_p->reader_num,reader_num)!=0))
reader_p=reader_p->next;
if(reader_p==NULL)
{ printf("\n\t此编号对应的读者不存在!\n");
Form_Borrow_Book();
}
else if(strcmp(reader_p->reader_book_num,"0")!=0)
{ printf("\n\t已达到最大借阅数,不能再借书!\n");
Form_Borrow_Book();
}
else {
book_p->book_xc=book_p->book_xc-1;/*借书完成后,修改现存量*/
strcpy(reader_p->reader_book_num,book_p->book_num);/*修改读者的借阅信息*/
save();/*将修改后的信息保存到文件中*/
load_data(); /*读入新文件中的数据*/}
Form_Borrow_Book();/*程序执行完毕后,返回到借书菜单界面*/
}
void Form_Return_Book()
/*还书菜单*/
{ char ch;
char book_num[11],reader_num[11];
printf("\n 归还图书功能模块,请选择相应的功能代码:\n");
printf(" 0:返回到主菜单\n");
printf(" 1:归还图书\n");
do{
printf("\n\n 请选择相应的功能代码:");
scanf("%c",&ch);
fflush(stdin);
}while(ch!='0'&&ch!='1');
switch(ch)
{ case '0':M_Form();break;
case '1':
{ printf(" \n请输入读者编号与所还书编号:(以空格分隔)");
scanf("%s%s",reader_num,book_num);
fflush(stdin);
Return_Book(reader_num,book_num);/*调用还书函数*/
Form_Return_Book();
}
default:printf("error\n");exit(0);
}
}
void Return_Book(char reader_num[],char book_num[])
/*输入读者编号和所还书编号执行还书*/
{ struct bk *book_p;
struct rd *reader_p;
book_p=h_book;
while(book_p!=NULL&&strcmp(book_p->book_num,book_num)!=0)
book_p=book_p->next;
if(book_p==NULL)
{ printf("\n\t此编号对应的图书不存在!\n");
Form_Return_Book();
}
reader_p=h_reader;
while(reader_p!=NULL&&(strcmp(reader_p->reader_num,reader_num)!=0))
reader_p=reader_p->next;
if(reader_p==NULL)
{ printf("\n\t此编号对应的读者不存在!\n");
Form_Return_Book();
}
else if(strcmp(reader_p->reader_book_num,book_num)!=0)
{ printf("\n\t读者没有借阅此书\n");
Form_Return_Book();
}
else {
book_p->book_xc=book_p->book_xc+1;/*还书后,修改图书库存量*/
strcpy(reader_p->reader_book_num,"0");/*还书后,修改读者借阅信息*/
save();/*保存到文件*/
load_data(); /*读入文件中的数据*/}
Form_Return_Book();
}
void init_reader()
/*系统第一次运行时,初始化3位读者信息,从键盘读入*/
{ FILE *fp;
reader ra[3];
int i;
printf("\n 系统即将进行读者初始化:\n");
printf("\n 请分别输入三位读者的编号和姓名(以空格隔开):\n ");
for(i=0;i<3;i++)
scanf("%s%s",ra[i].reader_num,ra[i].reader_name);
for(i=0;i<3;i++)
strcpy(ra[i].reader_book_num,"0");
if((fp=fopen("reader.dat","wb"))==NULL)
{ printf("不能建立读者文件,初始化失败!请重新启动系统!\n"); return; }
for(i=0;i<3;i++)/*将3位读者信息写入文件*/
{ if(fwrite(&ra[i],sizeof(struct rd),1,fp)!=1)
{ printf("\写数据错误!\n"); exit(0); }
}
}
void Form_Insert_New_Book()
/*添加新书菜单*/
{ char ch;
struct bk t;
printf("\n 新书入库功能模块,请选择相应的功能代码:\n");
printf(" 0:返回到主菜单\n");
printf(" 1:新书入库");
do{
printf("\n\n 请选择相应的功能代码:");
scanf("%c",&ch);
fflush(stdin);
}while(ch!='0'&&ch!='1'&&ch!='2'&&ch!='3'&&ch!='4'&&ch!='5');
switch(ch)
{ case '0':M_Form();break;
case '1':
{ printf(" \n请按顺序输入新书的编号、名称、数量(以空格隔开):");
scanf("%s%s%d",t.book_num,t.book_name,&t.book_kc);
fflush(stdin);
Insert_New_Book(t.book_num,t.book_name,t.book_kc);
Form_Insert_New_Book();
}
default:printf("error\n");exit(0);
}
}
void load_data()
/*从文件book.dat和文件reader.dat中读取数据到内存*/
/*将读取的数据存放到2个链表中*/
{ struct bk *book_p1,*book_p2,*book_p3;
struct rd *reader_p1,*reader_p2,*reader_p3;
FILE *fp_book,*fp_reader;
fp_book=fopen("book.dat","rb");
book_p1=(struct bk *)malloc(sizeof(struct bk));
fread(book_p1,sizeof(struct bk),1,fp_book);
h_book=book_p3=book_p2=book_p1;
while(! feof(fp_book))
{ book_p1=(struct bk *)malloc(sizeof(struct bk));
fread(book_p1,sizeof(struct bk),1,fp_book);
book_p2->next=book_p1;book_p3=book_p2;book_p2=book_p1;
}
book_p3->next=NULL;
free(book_p1);
fclose(fp_book);
fp_reader=fopen("reader.dat","rb");
reader_p1=(struct rd *)malloc(sizeof(struct rd));
fread(reader_p1,sizeof(struct rd),1,fp_reader);
h_reader=reader_p3=reader_p2=reader_p1;
while(! feof(fp_reader))
{ reader_p1=(struct rd *)malloc(sizeof(struct rd));
fread(reader_p1,sizeof(struct rd),1,fp_reader);
reader_p2->next=reader_p1;reader_p3=reader_p2;reader_p2=reader_p1;
}
reader_p3->next=NULL;
free(reader_p1);
fclose(fp_reader);
}
void save()
/*将链表中的数据保存到内存中*/
{ FILE *book_fp,*reader_fp;
struct bk *book_p;
struct rd *reader_p;
book_p=h_book; reader_p=h_reader;
if((book_fp=fopen("book.dat","wb"))==NULL)
{ printf("不能建立图书文件,初始化失败!请重新启动系统!\n"); return; }
while(book_p!=NULL)
{ if(fwrite(book_p,sizeof(struct bk),1,book_fp)!=1)
{ printf("\写数据错误!\n"); exit(0); }
book_p=book_p->next;
}
fclose(book_fp);
if((reader_fp=fopen("reader.dat","wb"))==NULL)
{ printf("不能建立图书文件,初始化失败!请重新启动系统!\n"); return; }
while(reader_p!=NULL)
{ if(fwrite(reader_p,sizeof(struct rd),1,reader_fp)!=1)
{ printf("\写数据错误!\n"); exit(0); }
reader_p=reader_p->next;
}
fclose(reader_fp);
}
main()
{ FILE * fp;
struct bk temp;
clrscr();
h_book=NULL;h_reader=NULL;
if((fp=fopen("book.dat","r"))==NULL)
init();/*第1次运行系统时的初始化*/
fclose(fp);
load_data();/*从文件中读入数据*/
M_Form();/*显示主菜单*/
save();/*保存内存中的数据(即链表中的数据)到文件*/
getch();
}
您好,从图上来看
这是一只翡翠手镯
我想知道右侧4点钟位置是什么
纹裂还是色线?
有没有自然光图提供
暂时目测
小四位数市场价
1-3000区间
有不明白的地方请继续追问
如果回答能帮到您的话,还望采纳回答,谢谢
是要帮你做??
很简单的 自己做吧
多动手没坏处