
——图书馆管理系统
一、可行性研究报告
1、引言
背景资料
图书馆是为我们的学习工作提供服务的地方。图书馆里存放着大量的书籍资料,对这些书籍信息的有效的归类整理与管理将大大提高图书馆的运作效率,降低图书馆工作人员的劳动强度,同时可以对图书馆的整个运作过程做到明细化,透明化,为各项工作有条不紊的进行提供保障。
报告目的
本报告旨在研究分析图书馆管理系统开发的可行性,为此软件的开发人员提供可行性的验证与编写方法的指导。
软件信息
软件名称:图书馆管理系统
开发平台:Turbo C 2.0
用户: 图书馆工作人员
2、可行性研究的前提
主要功能:通过计算机完成图书馆在库书籍的管理,用计算机高效、安全的完成对图书的信息处理,将工作人员从繁琐的数据处理中。
性能要求: a、书籍信息的录入,将图书名,库存数量输入系统,建立系统数据库。
b、书籍信息的查询,输入书名,显示此图书的有关信息,包括库存总量、借出数目、剩余数目。
c、书籍借出与归还,输入借出或归还图书的书名与数量后,对库存信息进行相应修改。
d、书籍信息的插入与删除,新书到库时或清除库存时,在数据库内增加或删减相应信息。
e、书籍信息的备份,将现有数据库信息存档,以备不时之需。
f、书籍信息的读入,输入文件名,从相应文件中把信息读入数据库。
g、权限问题,进入系统之前输入密码,密码不正确则退出系统。
开发目标:要求系统具有良好的可操作性,数据稳定性以及安全性,可以长期使用。
3、对现有系统的分析
现用的管理系统在安全性,数据的读入功能方面存在不同程度的
缺陷,有必要进行改进
4、所建议的系统
使用基本方法:该系统具有简单易用的特点,只需按照菜单功能行操作。
系统流程图:
6、投资及效益分析
该系统投资成本小,使用方法简单易懂。该系统有效地提高图书馆工
作人员的工作效率,节约人力物力。同时可以根据用户的特殊需要,
增添功能。具有成本低,功能强大,使用灵活的特点。
7、社会因素方的可行性
法律方面: 本系统的开发不会侵犯他人、集体或国家的利益,不违背当地法律法规。
使用方面: 本系统可以满足图书馆管理的要求,而且对使用本软件人员的计算机水平要求不高,只需了解软件操作流程就可以使用本软件,无需培训。
8、结论
该系统在各个方面的均具有可行性,可以立即开始进行。
二、需求规格说明书
1、引言
编写目的: 为软件开发者提供开发依据,在软件的开发过程中起指向性功能。本说明书的读者为此软件的开发者。
项目背景: 该软件由学生自行编写,由个人全权负责。本软件于其它管理软件。
参考资料: 施玉霞 等著《软件技术基础教程》09年7月
2、任务概述
目标: 本软件旨在为学校的图书馆管理人员提供一个可以方便管理库存图书的系统。可以对库存图书进行录入、借还、查询、修改功能。减少操作时间,提高工作效率。
该软件适用于一般规模的图书馆管理操作。
用户特点: 本系统的操作对象为图书馆管理人员。对管理人员的计算机水平不需要很高的要求。
条件与:本次开发工作无经费投入,开发期限为40小时。
3、数据描述:
静态数据: 系统密码,书籍名称,库存总数,剩余数,借出数。
动态数据: 使用者输入的信息,包括添加的书籍信息,查询关键字。
数据库描述:系统数据库采用TXT文档。
数据流图:
数据字典:
| 数据流名:图书 |
| 别 名:图书馆库存图书 |
| 组 成:书名+库存总数+剩余数+借出数 |
| 备 注:无 |
功能划分 录入功能
浏览功能
信息查询功能
借出归还功能
插入与删除功能
信息的备份与读入功能
设置访问权限功能
功能描述
录入功能: 输入相关数据
浏览功能: 以列表方式列出所有记录信息
信息查询功能: 根据书名匹配查询,并将查询结果列出
借出归还功能: 根据借出与归还的书籍信息修改相应数据
插入与删除功能: 插入一条新的图书信息,删除某图书的信息
信息的备份与读入功能:将输入文件进行备份和从指定文件读入数据
设置访问权限功能:只有输入正确密码才可以进行操作
否则无权操作
5、性能要求
数据精确度: 查询时要确保查全率与查准率
时间特性: 系统运行时间应该在用户能够接受的范围内
适应性: 本软件属于小型软件,对不同的运行环境适应性很强,可以能够满足使用需求。
6、运行需求
用户界面:在Turbo C 2.0界面运行
硬件接口:普通PC机
软件接口:运行于装有Turbo C 2.0的操作系统
故障处理:如果在使用过程中出现程序出错,重新运行即可恢复
三、概要设计说明书
1、引言
编写目的:设计一图书馆管理系统以代替现有的管理管理系统。本说明书读者为软件设计者。
项目背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件于其它软件系统。
参考资料: 施玉霞 等著《软件技术基础教程》09年7月
谭浩强 著《C语言程序设计 第三版》
张志航 王珊珊等著《程序设计语言—C》 07年9月
2、概要设计:
需求规定:本软件提供一个既可以存储信息,同时又具有浏览、插入、查询、修改、删除功能,供使用者轻松管理图书馆的库存图书。数据库信息由使用者进行输入。
运行环境: 硬件 普通PC机
支持环境 WINDOWS操作系统,Turbo C 2.0软件
基本设计概念:本系统由主单函数调用各个子函数(功能函数)来实现各项操作。
功能函数包括插入函数,删除函数,显示函数,文件读入函数,文件读出函数,借出函数,归还函数,退出函数
函数调用关系图如下图所示:
系统结构
模块划分与功能需求关系
| 模块编号 | 模块名称 | 功能 |
| M1 | 身份验证模块 | 输入验证信息 |
| M2 | 主菜单模块 | 输入选择的功能 |
| M3 | 插入模块 | 插入相关信息 |
| M4 | 删除模块 | 删除指定信息 |
| M5 | 查询模块 | 查询指定信息 |
| M6 | 显示模块 | 以列表方式显示所有信息 |
| M7 | 借出模块 | 实现书籍借出 |
| M8 | 归还模块 | 实现书籍归还 |
| M9 | 读入模块 | 从外部文件读入信息 |
| M10 | 备份模块 | 备份文件信息 |
| M11 | 退出模块 | 退出程序 保存文件 |
3、接口设计
用户接口:用户输入信息按 “书名”(空格)“库存数量” 的格式输入。TXT文件也按上述格式保存。
外部接口:用户界面:DOS界面
软件接口:运行于Win95以上版本,且要求安装Turbo C 2.0
4、运行设计
运行控制:系统运行后先进行身份验证,验证通过后,登录,并调用M2,进入服务选择模块,由用户选择的信息选择激活M3—M10等模块,最后根据用户输入的接受信息退出程序,关闭系统。
运行时间:各模块运行时间控制在1秒内。
5系统数据结构设计
书名char name[] 剩余数量 int sum
6、系统出错处理设计
出错信息
| 出错类型 | 处理方法 |
| 用户输入无效字符 | 提示出错,重新输入 |
| 借出数量过大 | 提示出错,重新输入 |
本软件必须按照软件产品设计规范的步骤进行开发,充分考虑软件的可维护性,以便于未来版本开发及移植等二次开发。
在编写过程中如果发现有的模块没有必要,或者实现比较困难,可以由开发者提出修改意见,决定是否修改。
四、详细设计说明书
1、引言
编写目的:设计一图书馆管理系统以代替现有的管理管理系统。本说明书读者为软件设计者。
项目背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件于其它软件系统。
参考资料: 施玉霞等著《软件技术基础教程》 09年7月
谭浩强 著《C语言程序设计 第三版》
张志航 王珊珊等著《程序设计语言—C》 07年9月
2、总体设计
需求概述
录入功能: 输入相关数据
浏览功能: 以列表方式列出所有记录信息
信息查询功能: 根据书名匹配查询,并将查询结果列出
借出归还功能: 根据借出与归还的书籍信息修改相应数据
插入与删除功能:插入一条新的图书信息,删除某图书的信息
信息的备份与读入功能:将输入文件进行备份和从指定文件读入数据
设置访问权限功能:只有输入正确密码才可以进行操作
否则无权操作
系统结构图
3、程序描述
M1身份验证
·功能:验证身份
·性能:
·输入项:预设密码
·输出项:欢迎语句
·算法: int keyword=111,a;
printf("Please input keyword:");
scanf("%d",&a);
if(a!=keyword) exit(0);
else printf("Welcome!");
·测试要求:运行正常。
M2主菜单模块
·功能:选择功能
·性能:
·输入项:数字0-9
·输出项:对应功能项
·算法: int Display_MainMenu() /*显示菜单的函数*/
{char x;
do{
system("cls");
printf("************************\\n");
printf("1.Create BookList\\n");
printf("2.Display All Books\\n");
printf("3.Insert a BookInformation\\n");
printf("4.Delete a Book\\n");
printf("5.Borrow a Book\\n");
printf("6.Return a Book\\n");
printf("7.Query\\n");
printf("8.Add Records From a File\\n");
printf("9.Write to a File\\n");
printf("0.Goodbye\\n");
printf("************************\\n");
printf("Please choose from 0-9:");
printf("\\n");
x=getchar();
}while(x<'0'||x>'9');
return(x-'0');
}
·测试要求:运行正常。
M3插入模块
·功能:插入新信息
·性能:
·输入项:书名 数量
·输出项:成功提示
·算法: Book *Insert(Book *head,Book *s) /*插入结点的函数*/
{ Book *p0,*p1,*p2;
p1=head;p0=s; /*使p1指向第一个结点,p0指向要插入的结点*/
if(head==NULL) /*原来的链表是空表*/
{head=p0;p0->next=NULL;} /*使p0作为首结点*/
while(strcmp(p0->Name,p1->Name)>0&&(p1->next!=NULL))
{p2=p1; p1=p1->next;
}
if(strcmp(p0->Name,p1->Name)<=0)
{p0->next=p1;
if(head==p1) head=p0;
else p2->next=p0;
}
else
{p1->next=p0;
p0->next=NULL;
}
return(head);
}
Book *Insert_a_record(Book *head)
{ Book *newrecord;
newrecord=(Book *)malloc(LEN); /*动态分配存储空间*/
scanf("%s%d",newrecord->Name,&newrecord->all);
newrecord->borrow=0;
newrecord->left=newrecord->all;
head=Insert(head,newrecord);
printf("Insert successfully\\n"); /*输出插入成功的信息*/
return(head);
}
·测试要求:运行正常。
删除模块
·功能:删除信息
·性能:
·输入项:所删书名
·输出项:成功提示
·算法: Book *Delete(Book *head,char *name)
{ Book *p1,*p2;
if(head==NULL)
printf("Sorry No record!\\n");
p1=head;
while(strcmp(p1->Name,name)!=0&&p1->next!=NULL) /*p1不是要找的结点,且后面还有结点*/
{p2=p1;p1=p1->next;} /*p1后移一个结点*/
if(strcmp(p1->Name,name)==0) /*找到了*/
{if(p1==head)head=p1->next; /*若p1为首指针,使下一结点为首指针*/
else {p2->next=p1->next; /*否则将下一结点地址赋给前一结点地址*/
printf("delete %s successfully\\n",name);} /*输出删除成功的信息*/
}
return(head);
}
Book *Delete_a_record(Book *head)
{ char name[20],ch;
Book *p;
scanf("%s",name);
getchar(); /*接收回车*/
p=Query(head,name);
if(p==NULL) printf("Cannot Find %s\\n",name); /*找不到结点*/
else {printf("Delete %s, Y/N?\\n",name);
ch=getchar();
system("pause");
if(ch=='y'||ch=='Y')
while(p!=NULL)
{head=Delete(head,name); /*删除所有与输入相同的记录*/
p=Query(head,name);
}
}
return(head);
}
·测试要求:运行正常。
M5查询模块
·功能: 查询功能
·性能:
·输入项:查询书名
·输出项:相应书籍信息
·算法: Book *Query(Book *head,char *name)
{ Book *p;
p=head;
while(strcmp(name,p->Name)!=0&&p->next!=NULL)
p=p->next;
if(strcmp(name,p->Name)==0) /*找到了,返回结点地址*/
return(p);
else /*找不到返回空指针*/
return(NULL);
}
void Query_a_record(Book *head)
{ char name[20];
Book *p;
scanf("%s",name);
p=Query(head,name);
if(p!=NULL) /*找到了*/
{ printf("Find successfully\\n%s total:%d left:%d borrow:%d\\n
p->Name,p->all,p->left,p->borrow);
}
else
printf("Can't find the records of %s\\n",name); /*找不到*/
}
·测试要求:运行正常。
M6显示功能
·功能: 显示所有信息
·性能:
·输入项:相应的菜单序号
·输出项:所有书籍信息
·算法: void Display(Book *head)
{ Book *p;
int i;
p=head;
printf("Num BookName Total Left Borrow\\n");
for(i=1;p!=NULL;i++)
{
printf("%-5d%-14s%-10d%-10d%-5d\\n
i,p->Name,p->all,p->left,p->borrow);
p=p->next;
if(i%10==0)
{system("pause"); /*按回车翻页显示*/
printf("Num BookName total left borrow\\n");
}
}
·测试要求:运行正常。
M7借出模块
·功能:借出书籍
·性能:
·输入项:所借书名 数量
·输出项:成功信息
·算法: Book *Borrow_a_Book(Book *head)
{ char name[20],ch;
int n;
Book *p;
scanf("%s%d",name,&n);
getchar(); /*接收回车*/
p=Query(head,name);
if(p==NULL) printf("Cannot Find %s\\n",name); /*找不到结点*/
else printf("Are you sure to borrow? %s, Y/N?\\n",name);
ch=getchar();
system("pause");
if(ch=='y'||ch=='Y')
head=Borrow(head,name,n);
return(head);
}
·测试要求:运行正常。
M8归还模块
·功能:归还书籍
·性能:
·输入项:所换书名 数量
·输出项:成功提示
·算法: Book *Return_a_Book(Book *head)
{ char name[20],ch;
int n;
Book *p;
scanf("%s%d",name,&n);
getchar(); /*接收回车*/
p=Query(head,name);
if(p==NULL) printf("Cannot Find %s\\n",name); /*找不到结点*/
else printf("Are you sure to return? %s, Y/N?\\n",name);
ch=getchar();
system("pause");
if(ch=='y'||ch=='Y')
head=Return(head,name,n);
return(head);
}
Book *Return(Book *head,char *name,int sum)
{ Book *p1;
p1=head;
while(strcmp(p1->Name,name)!=0&&p1->next!=NULL) /*p1不是要找的结点,且后面还有结点*/
{p1=p1->next;} /*p1后移一个结点*/
if(strcmp(p1->Name,name)==0) /*找到了*/
p1->borrow=p1->borrow-sum;
p1->left=p1->left+sum;
return(head);
}
·测试要求:运行正常。
M9读入模块
·功能:从文件读入信息
·性能:
·输入项:文件名
·输出项:成功提示
·算法: Book *AddfromText(Book *head,char *filename)
{ FILE *fp;
int n,i;
if((fp=fopen(filename,"r"))==NULL)
{printf("Cannot find file:%s\\n",filename); /*打不开所指定文件*/
return(head);}
fscanf(fp,"%d",&n); /*待插入记录个数*/
for(i=0;i p=(Book *)malloc(LEN); fgetc(fp); /*读取换行符*/ fscanf(fp,"%s%d%d%d",p->Name,&p->all,&p->left,&p->borrow); head=Insert(head,p); /*插入结点*/ } printf("Add from %s successfully\\n",filename); fclose(fp); return(head); } 测试要求:运行正常。 M10备份模块 ·功能:数据备份 ·性能: ·输入项:所建文档名 ·输出项:成功提示 ·算法: Book *WritetoText(Book *head,char *filename) {FILE *fp;Book *p; if(head==NULL) {printf("No Record!\\n"); return(head);} fp=fopen(filename,"w"); /*打开文件*/ p=head; while(p!=NULL) { fprintf(fp,"%-14s%-10d%-10d%-10d\\n\\n",p->Name,p->all,p->left,p->borrow); /*文件输出*/ p=p->next;} printf("Write to %s successfully\\n",filename); /*输出写到文件完毕的信息*/ fclose(fp); return(head); } ·测试要求:运行正常。 M11退出模块 ·功能:退出程序 ·性能: ·输入项:数字0 ·输出项:再见语句 ·算法: void Quit(Book *head) {Book *p,*p1,*p2;FILE *fp; char filename[]="last"; p2=p1=head; if(head!=NULL) {fp=fopen(filename,"w"); /*打开文件*/ p=head; while(p!=NULL) { fprintf(fp,"%s %d %d %d\\n",p->Name,p->all,p->left,p->borrow); /*文件输出*/ p=p->next;} printf("Write to %s successfully\\n",filename); /*输出写到文件完毕的信息*/ fclose(fp);} while(p1!=NULL) /*p1指向的结点不是空指针*/ {p2=p1->next; free(p1); /*释放存储空间*/ p1=p2; /*p1后移一个结点*/ } } ·测试要求:运行正常。 五、测试报告 1、引言 编写目的:测试图书馆管理系统软件的各项功能是否符合预期要求。本报告读者为软件设计者。 项目背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件于其它软件系统。 参考资料: 施玉霞 等著《软件技术基础教程》09年7月 谭浩强 著《C语言程序设计 第三版》 张志航 王珊珊等 著《程序设计语言—C》 07年9月 2、测试计划执行情况 权限功能 ·测试数据:输入正确密111 ·测试结果:成功进入主界面,说明本模块功能正常 插入功能 ·测试数据:无 ·测试结果:菜单显示正常。 本模块功能正常。 插入功能 ·测试数据:history 100 ·测试结果:调用显示函数显示结果。本模块功能正常。 删除操作 ·测试数据:history ·测试结果 调用显示函数显示结果: 输出结果正确,说明本模块功能正常。 查询模块 ·测试数据:预输入数据 history 100 physics 200 查询history ·测试结果:显示结果 history 100 0 0 说明本模块运行正常。 显示模块 ·上述过程已经对本功能进行了测试。 ·结果:显示模块运行正常。 借出模块 ·测试数据:预输入数据 history 100 physics 200 调用借出函数借 history 50 maths 100 ·测试结果 调用显示函数显示结果: 归还模块 ·测试数据:预输入数据 history 100 physics 200 调用归还函数还 history 50 ·测试结果: 文件读入模块 ·测试数据:文本文档 a.txt ·测试结果:调用显示函数显示结果 测试结果正确。 文件备份模块 ·测试数据: 测试数据采用上一步写入的数据 ·测试结果 退出模块 ·测试数据: 无 ·测试结果 成功退出程序 并生自动成备份文件 last.txt 退出模块运行正常。 3、评价结果 软件能力: 软件各项功能复合预期,各子程序运行正常 缺陷和:每次登陆后必须手工调入上一次的备份文件以恢复系统数据,给操作者带来不便 建议: 完善系统的数据库功能,提供安全可靠的数据保存功能。 测试结论: 本软件测试通过。 附源程序代码: #include #include #include #include #define NULL 0 #define LEN sizeof(Book) struct A {char Name[20]; int all,left,borrow; struct A *next; }; typedef struct A Book; int Display_Main_Menu(); /*主菜单显示*/ Book *Create(); /*功能函数声明*/ void Display(Book *head); Book *Insert(Book *head,Book *s); Book *Insert_a_record(Book *head); Book *Delete(Book *head,char *name); Book *Delete_a_record(Book *head); Book *Borrow(Book *head,char *name,int sum); Book *Borrow_a_Book(Book *head); Book *Return(Book *head,char *name,int sum); Book *Return_a_Book(Book *head); Book *Query(Book *head,char *name); void Query_a_record(Book *head); Book *AddfromText(Book *head,char *filename); Book *WritetoText(Book *head,char *filename); void Quit(Book *head); void main() /*主函数部分*/ {Book *head; /*定义变量*/ char filename[20]; int keyword=111,a; printf("Please input keyword:"); scanf("%d",&a); if(a!=keyword) exit(0); else printf("Welcome!"); head=NULL; /*置首指针为空*/ for(;;) { switch(Display_MainMenu()) { case 1:printf("1.Create BookList\\n"); /*调用Create函数创建链表*/ head=Create(); system("pause"); break; case 2:printf("Display All Books\\n"); Display(head); /*调用Display函数显示所有*/ system("pause");break; case 3:printf("Insert a Record\\n"); head=Insert_a_record(head);/*调用Insert_a_record函数插入*/ system("pause");break; case 4:printf("Delete a Book\\n"); head=Delete_a_record(head);/*调用Delete_a_record函数删除*/ system("pause");break; case 5:printf("Borrow a Book\\nInput BookName and sum you borrow:"); head=Borrow_a_Book(head); system("pause");break; case 6:printf("Return a Book\\nInput BookName and sum you return:"); head=Return_a_Book(head); system("pause");break; case 7:printf("Query\\nInput the BookName you want:"); Query_a_record(head);/*调用查询函数*/ system("pause");break; case 8:printf("Input the name of Text File\\n"); scanf("%s",filename);/*输入文件名*/ head=AddfromText(head,filename); system("pause");break; case 9:printf("Input the name of the NewText File\\n"); scanf("%s",filename);/*输入要写入的文件名*/ head=WritetoText(head,filename); system("pause");break; case 0:printf("Goodbye\\n"); Quit(head); exit(0); } } } int Display_MainMenu() /*显示菜单的函数*/ {char x; do{ system("cls"); printf("************************\\n"); printf("1.Create BookList\\n"); printf("2.Display All Books\\n"); printf("3.Insert a BookInformation\\n"); printf("4.Delete a Book\\n"); printf("5.Borrow a Book\\n"); printf("6.Return a Book\\n"); printf("7.Query\\n"); printf("8.Add Records From a File\\n"); printf("9.Write to a File\\n"); printf("0.Goodbye\\n"); printf("************************\\n"); printf("Please choose from 0-9:"); printf("\\n"); x=getchar(); }while(x<'0'||x>'9'); return(x-'0'); } Book *Create() /*创建链表的函数,返回首指针*/ {Book *head,*newrecord; char ch; printf("Input a Book\\n"); head=NULL;/*首指针置空*/ do {newrecord=(Book *)malloc(LEN); /*动态分配存储空间*/ scanf("%s%d",newrecord->Name,&newrecord->all); newrecord->left=newrecord->all; newrecord->borrow=0; head=Insert(head,newrecord); /*调用Insert函数判断位置插入*/ getchar(); / *接收最后输入的回车符*/ printf("Add another Book Y/N?\\n"); ch=getchar(); getchar(); /*接收回车符*/ }while(ch!='n'&&ch!='N'); /*判断是否继续*/ return(head); } Book *Insert(Book *head,Book *s)/*插入结点的函数*/ { Book *p0,*p1,*p2; p1=head;p0=s; if(head==NULL) {head=p0;p0->next=NULL;} while(strcmp(p0->Name,p1->Name)>0&&(p1->next!=NULL)) {p2=p p1=p1->next; } if(strcmp(p0->Name,p1->Name)<=0) {p0->next=p1; if(head==p1) head=p0; else p2->next=p0; } else {p1->next=p0; p0->next=NULL; } return(head); } Book *Insert_a_record(Book *head) { Book *newrecord; newrecord=(Book *)malloc(LEN); /*动态分配存储空间*/ scanf("%s%d",newrecord->Name,&newrecord->all); newrecord->borrow=0; newrecord->left=newrecord->all; head=Insert(head,newrecord); printf("Insert successfully\\n");/*输出插入成功的信息*/ return(head); } Book *Delete(Book *head,char *name) /*删除功能函数*/ { Book *p1,*p2; if(head==NULL) printf("Sorry No record!\\n"); p1=head; while(strcmp(p1->Name,name)!=0&&p1->next!=NULL) / {p2=p1;p1=p1->next;} if(strcmp(p1->Name,name)==0) {if(p1==head)head=p1->next; else {p2->next=p1->next; printf("delete %s successfully\\n",name);} } return(head); } Book *Delete_a_record(Book *head) { char name[20],ch; Book *p; scanf("%s",name); getchar(); p=Query(head,name); if(p==NULL) printf("Cannot Find %s\\n",name); else {printf("Delete %s, Y/N?\\n",name); ch=getchar(); system("pause"); if(ch=='y'||ch=='Y') while(p!=NULL) {head=Delete(head,name); p=Query(head,name); } } return(head); } Book *Borrow_a_Book(Book *head) { char name[20],ch; int n; Book *p; scanf("%s%d",name,&n); getchar(); / p=Query(head,name); if(p==NULL) printf("Cannot Find %s\\n",name); else printf("Are you sure to borrow? %s, Y/N?\\n",name); ch=getchar(); system("pause"); if(ch=='y'||ch=='Y') head=Borrow(head,name,n); return(head); } Book *Borrow(Book *head,char *name,int sum) { Book *p1; p1=head; while(strcmp(p1->Name,name)!=0&&p1->next!=NULL) {p1=p1->next;} if(strcmp(p1->Name,name)==0) p1->borrow=sum; p1->left=p1->all-sum; return(head); } Book *Return_a_Book(Book *head) { char name[20],ch; int n; Book *p; scanf("%s%d",name,&n); getchar(); /*接收回车*/ p=Query(head,name); if(p==NULL) printf("Cannot Find %s\\n",name); /*找不到结点*/ else printf("Are you sure to return? %s, Y/N?\\n",name); ch=getchar(); system("pause"); if(ch=='y'||ch=='Y') head=Return(head,name,n); return(head); } Book *Return(Book *head,char *name,int sum) { Book *p1; p1=head; while(strcmp(p1->Name,name)!=0&&p1->next!=NULL) /*p1不是要找的结点,且后面还有结点*/ {p1=p1->next;} /*p1后移一个结点*/ if(strcmp(p1->Name,name)==0) /*找到了*/ p1->borrow=p1->borrow-sum; p1->left=p1->left+sum; return(head); } void Display(Book *head) { Book *p; int i; p=head; printf("Num BookName Total Left Borrow\\n"); for(i=1;p!=NULL;i++) { printf("%-5d%-14s%-10d%-10d%-5d\\n i,p->Name,p->all,p->left,p->borrow); p=p->next; if(i%10==0) {system("pause"); /*按回车继续显示*/ printf("Num BookName total left borrow\\n"); } } } Book *Query(Book *head,char *name) { Book *p; p=head; while(strcmp(name,p->Name)!=0&&p->next!=NULL) p=p->next; if(strcmp(name,p->Name)==0) /*找到了,返回结点地址*/ return(p); else /*找不到返回空指针*/ return(NULL); } void Query_a_record(Book *head) { char name[20]; Book *p; scanf("%s",name); p=Query(head,name); if(p!=NULL) /*找到了*/ { printf("Find successfully\\n%s total:%d left:%d borrow:%d\\n p->Name,p->all,p->left,p->borrow); } else printf("Can't find the records of %s\\n",name); /*找不到*/ } Book *AddfromText(Book *head,char *filename) { FILE *fp; int n,i; if((fp=fopen(filename,"r"))==NULL) {printf("Cannot find file:%s\\n",filename); /*打不开所指定文件*/ return(head);} fscanf(fp,"%d",&n); /*待插入记录个数*/ for(i=0;i p=(Book *)malloc(LEN); fgetc(fp); /*读取换行符*/ fscanf(fp,"%s%d%d%d",p->Name,&p->all,&p->left,&p->borrow); head=Insert(head,p); /*插入结点*/ } printf("Add from %s successfully\\n",filename); fclose(fp); return(head); } Book *WritetoText(Book *head,char *filename) {FILE *fp;Book *p; if(head==NULL) {printf("No Record!\\n"); return(head);} fp=fopen(filename,"w"); /*打开文件*/ p=head; while(p!=NULL) { fprintf(fp,"%-14s%-10d%-10d%-10d\\n\\n",p->Name,p->all,p->left,p->borrow); /*文件输出*/ p=p->next;} printf("Write to %s successfully\\n",filename); /*输出写到文件完毕的信息*/ fclose(fp); return(head); } void Quit(Book *head) {Book *p,*p1,*p2;FILE *fp; char filename[]="last"; p2=p1=head; if(head!=NULL) {fp=fopen(filename,"w"); /*打开文件*/ p=head; while(p!=NULL) { fprintf(fp,"%s %d %d %d\\n",p->Name,p->all,p->left,p->borrow); /*文件输出*/ p=p->next;} printf("Write to %s successfully\\n",filename); /*输出写到文件完毕的信息*/ fclose(fp);} while(p1!=NULL) /*p1指向的结点不是空指针*/ {p2=p1->next; free(p1); /*释放存储空间*/ p1=p2; /*p1后移一个结点*/ }}
