图书管理系统详细设计说明书
图书管理系统详细设计说明书
1. 引言
1.1 编写目的
详细设计说明书的目的是说明一个软件系统各个层次中的每一个程序(模块)的设计考虑,便于图书馆管理系统软件的详细设计和开发途径及开发方法。
1.2 背景
近年来,随着图书馆管理规模的不断扩大,图书数量也相应的增加,有关图书的各种信息量也成倍增加,面对着庞大的信息量,传统的人工方式管理会导致图书管理上的混乱,人力与物力过多浪费,图书馆管理费用的增加,从而使图书馆的负担过重,影响整个图书馆的运作和控制管理,因此,必须制定一套合理,有效,规范和实用的图书馆管理系统,对图书资料进行集中统一的管理。
另一方面,IT产业和INTERNET获得了飞速发展,计算机应用已渗透到了各个领域,引起信息管理的革命,实现了信息的自动化处理,提高了处理的及时性和正确性。
图书管理工作面对大量的可模块化处理信息,是当今信息革命的一个重要阵地。我们小组开发图书馆管理系统就是采用现代化的信息管理方式代替手工管理方式,提高了图书管理工作效率,做到了信息的规范化,科学统计和快速查询,让图书馆更好的为学校,社会服务。
1.3定义
详细设计说明书:详细设计说明书又称为程序设计说明,详细说明一个软件系统各个层次中的每一个程序(模块)的设计考虑。
C语言程序设计:以C语言字词为结构,最大限度的利用C语言本身的特点是一种基于计算机基础的高级程序设计语言。
图书馆管理系统:能对图书信息及读者信息进行记录和管理的软件。
1.4参考资料
【1】C语言程序设计(第三版)谭浩强主编 清华大学出版社
【2】 C语言程序设计教程 汤承林 姜仲秋 全编 天津大学出版社
【3】 《软件工程导论》 张海著 清华大学出版社
2 程序系统的组织结构
如下图:
图书管理系统详细设计说明书
3.程序1(结构符)设计说明
3.1 程序描述
通过本系统软件,能帮助人员利用计算机,快速方便的对图书的管理,输入,输出,查找以及借还书管理等所需操作。在软件开发过程中,主要应用的关键知识点集中在选择结构,循环结构,函数,预处理,结构体和文件的综合应用上。
3.2 功能
1.准备和提供统一格式的信息,使各种统计工作简化,使信息成本最低;
2.及时全面地提供不同要求的,不同细度的信息以及分析解释现象最快,及时产生正确的控制;
3.全面系统的保存大量的信息,并能很快的查询和综合,为组织的决策提出信息支持;
4.提供了系统维护, 读者管理,图书管理,图书利通以及返回主菜单;
3.3 性能
这是一个在微型计算机上开发的系统,在响应时间上无特殊的要求,但要求系统能处理大容量的各种信息。
3.4 输入输出项
3.4.1主模块
1.输入项目:操作系统传递至各种消息以及用户的输入数据。
2.输出项目:用户dos窗口显示
3.4.2 读者管理模块
1.输入项目:与读者管理操作子对话框有关的用户输入及系统消息。
2.输出项目:操作结果显示。
3.4.3图书管理模块
1.输入项目:图书信息。
图书管理系统详细设计说明书
2.输出项目:相应的dos窗口
3.4.4图书利通模块
3.4.4.1借出图书模块
1.输入项目:读者号,图书编号。
2.输出项目:读者信息,相关借书信息。
3.4.5归还管理模块
1.输入项目:读者号 ,书号。
2.输出项目:相关读者信息。
3.5 输入输出总项
输入项包括:读者名,读者号,图书名,图书号,图书作者,图书出版社,图书出版时间;
输出项包括:相关读者信息,相关图书信息,默认还书期限,借书时间,读者姓名,读者号,图书名,图书号,图书作者,图书出版社;
3.6 算法
使用算法:实现图书登记的程序设计的流程图;
3.8.1.用户接口
本产品的用户一般需要通过终端进行操作,进入主界面后点击相应的窗口,分别进入相对应的界面。用户对程序的维护,最好有备份。
3.8.2 软件接口
WIN 2000/XP/NT/7操作系统,C语言编程系统。
3.8.3 外部接口
系统同外界的所有接口的安排包括软件与硬件之间的接口,本系统与各支持软件之间的接口。
3.9 存储分配
硬盘主要存储借还记录,图书信息和读者信息。
64M以上内存,10G以上硬盘,软盘驱动器一只,CD-ROM驱动器一只和SVGA兼容模式显示器。
3.10 注释设计
说明准备在本程序中安排的注释
a.加载模块首部的注释
b.加在各分支处的注释
c.对各变量的功能,范围,缺省条件等所加注释
d.对使用的逻辑所加注释
3.11测试设计
本软件测试方便,简洁易懂,不容易出现大的错误。
3.12 限制条件
本系统的名称是图书馆管理系统,本系统使用VC来实现,图书管理员可以添加,查看,图书信息,可以完成读者查询,借书,还书的操作,无特别的条件要求和限制。
3.13 尚未解决的问题
图书管理系统详细设计说明书
登入系统比较慢,读取读者信息慢,借还记录自动保存期限不是很长。
4. 程序2(标志符)设计说明书
4.1程序描述
图书管理查询,读者借书还书管理程序,安排设计此程序可以方便完善图书馆管理员以及用户操作,并且使操作更加简便,本程序分为1个小模块,4个子程序,为常驻内存,可重入,无覆盖要求,并发处理。
4.2功能
本系统具有图书查询,读者借书,读者信息查询,入库管理,读者借书,读者还书等基本功能。
4.3性能
精度:Vchar();
4.4输入项
图书入库,图书查询,读者信息
4.5输出项
读者借书,读者还书,图书查询
4.6限制条件
无限制
4.7尚未解决的问题
市场调研需要充分。
5. 详细代码
每个模块我们小组都设有相应的代码,有的模块代码虽然很长,但是比较容易可读,有的模块代码虽然很短但是很难看懂。总的来说,代码设计其实也是软件不可缺少的一部分。
Main代码
int main()
{
BookDbFile bdf;
BnoIdxFile bif;
BnameIdxFile bnif;
BauthorIdxFile baif;
BpressIdxFile bpif;
ReaderFile rf;
BborrowFile bbf;
ReadFile(&bdf, &bif, &bnif, &baif, &bpif, &rf, &bbf); //读入数据文件
while(1)
{
switch(MainMenu())
{
case '1':
Xtwh(&bdf, &bif, &bnif, &baif, &bpif, &bbf);
break;
case '2':
Dzgl(&rf);
图书管理系统详细设计说明书
break;
case '3':
Tsgl(&bdf, &bif, &bnif, &baif, &bpif);
break;
case '4':
Tslt(&bdf, &bif ,&rf, &bbf);
break;
case '0':
WriteFile(&bdf, &bif, &bnif, &baif, &bpif, &rf, &bbf);
system("cls");
printf("再见...\n");
system("pause");
exit(0);
break;
}
}
}
Borrow代码
#include "TypeDef.h"
#include "Function.h"
#include <string.h>
#include <stdio.h>
//*****借书处理************************************
void BorrowBook(BookDbFile *bf, BnoIdxFile *bif, ReaderFile *rf, BborrowFile *bbf) {
char rno[5];
char bno[5];
char choice;
int bookno;
printf("请输入读者号:");
scanf("%s", rno);
while(strlen(rno) != 4)
{
printf("输入读者号位数不正确,请重新输入:");
scanf("%s", rno);
}
if(ReaderFind(rf, rno) == -1)
{
printf("您输入的读者号不存在,不能借阅图书!\n");
printf("\n按任意键返回...");
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
图书管理系统详细设计说明书
{
choice = getchar();
}
return;
}
printf("请输入书号:");
scanf("%s", bno);
while(strlen(bno) != 4)
{
printf("输入书号位数不正确,请重新输入:");
scanf("%s", bno);
}
if((bookno = BinSearch(bif, bno)) <= 0)
{
printf("无此书籍!\n");
printf("\n按任意键返回...");
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
return;
}
if(bf->BookDbase[bookno].storenum - bf->BookDbase[bookno].borrownum < 0)
{
printf("该书已全部借出,暂时无法借阅!\n");
printf("\n按任意键返回...");
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
return;
}
if(rf->ReadRec[ReaderFind(rf, rno)].bn2 >= rf->ReadRec[ReaderFind(rf, rno)].bn1) //当已借书数大于等于可借书数时
{
printf("您已超过借书上限,暂时无法借阅!\n");
printf("\n按任意键返回...");
图书管理系统详细设计说明书
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
return;
}
printf("请输入借阅时间(YYYYMMDD):");
scanf("%s", bbf->Bbook[bbf->len].date1);
printf("借阅成功!");
bf->BookDbase[bookno].borrownum++;
strcpy(bbf->Bbook[bbf->len].bno, bno);
strcpy(bbf->Bbook[bbf->len].rno, rno);
strcpy( bbf->Bbook[bbf->len].date2, "#");
bbf->len ++;
rf->ReadRec[ReaderFind(rf, rno)].bn2++; //读者已借书数加1
printf("\n按任意键返回...");
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
return;
}
//*************************************************
//*****还书处理************************************
void BackBook(BookDbFile *bf, BnoIdxFile *bif, ReaderFile *rf, BborrowFile *bbf) {
char rno[5];
char bno[5];
char choice;
int i;
printf("请输入 读者号 和 书号 (用空格分开):");
scanf("%s%s", rno, bno);
for(i = 0; i < bbf->len; ++i)
{
if(strcmp(rno, bbf->Bbook[i].rno) == 0 && strcmp(bno, bbf->Bbook[i].bno) == 0) {
图书管理系统详细设计说明书
printf("请输入还书日期(YYYYMMDD):");
scanf("%s", bbf->Bbook[i].date2);
bf->BookDbase[BinSearch(bif, bno)].borrownum--;
rf->ReadRec[ReaderFind(rf, rno)].bn2--; //读者已借书数减1
printf("还书成功!\n");
printf("\n按任意键返回...");
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
return;
}
}
printf("没有相关借阅信息,还书请求被拒绝!\n");
printf("\n按任意键返回...");
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
}
//*************************************************
CreateFile代码
#include "TypeDef.h"
#include "Function.h"
#include <stdio.h>
#include <string.h>
//*****添加图书主数据库记录************************
void AddDbRec(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile *bpif)
{
char choice;
int flag = 0; //是否继续输入
BookRecType newBook;
while(flag == 0)
{
system("cls");
printf("请输入书号(4位):");
scanf("%s", newBook.bno);
图书管理系统详细设计说明书
while(strlen(newBook.bno) != 4) { printf("输入书号位数不正确,请重新输入:"); scanf("%s", newBook.bno); } while(BinSearch(bif, newBook.bno) != 0) { printf("您输入的书号已存在,主键不能重复,请重新输入:"); scanf("%s", newBook.bno); while(strlen(newBook.bno) != 4) { printf("输入书号位数不正确,请重新输入:"); scanf("%s", newBook.bno); } } printf("请输入书名:"); scanf("%s", newBook.bname); printf("请输入作者:"); scanf("%s", newBook.author); printf("请输入出版社:"); scanf("%s", newBook.press); printf("请输入分类(3位):"); scanf("%s", newBook.sortno); while(strlen(newBook.sortno) != 3) { printf("输入分类号位数不正确,请重新输入:"); scanf("%s", newBook.sortno); } printf("请输入藏书量:"); scanf("%d", &newBook.storenum); newBook.borrownum = 0; ChangeBnoIdx(&newBook, bif, bf->len + 1); ChangeBnameIdx(&newBook, bnif, bf->len + 1); ChangeBauthorIdx(&newBook, baif, bf->len + 1); ChangeBpressIdx(&newBook, bpif, bf->len + 1); bf->BookDbase[bf->len + 1] = newBook; bf->len ++; while(1) { printf("是否继续添加书目?(Y/N)"); choice = getchar();
图书管理系统详细设计说明书
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
if(choice == 'Y' || choice == 'y')
{
break;
}
else if(choice == 'N' || choice == 'n')
{
flag = 1;
break;
}
}
}
}
//*************************************************
//*****修改书号索引表******************************
void ChangeBnoIdx(BookRecType *newbook, BnoIdxFile *bif, int storeno)
{
strcpy(bif->BnoIdx[bif->len].bno, newbook->bno);
bif->BnoIdx[bif->len].RecNo = storeno;
bif->len++;
}
//*************************************************
//*****修改书名索引以及书名链头索引表**************
void ChangeBnameIdx(BookRecType *newbook, BnameIdxFile *bnif, int storeno)
{
int i = 0;
if(BnameFind(bnif, newbook->bname) > 0) //已存在同名的书
{
for(i = 0; i < bnif->len; ++i)
{
if(strcmp(newbook->bname, bnif->BnameIdx[i].bname))
{
newbook->namenext = bnif->BnameIdx[i].head;
bnif->BnameIdx[i].head = storeno;
bnif->BnameIdx[i].RecNum++;
break;
}
}
图书管理系统详细设计说明书
}
else //不存在同名的书
{
strcpy(bnif->BnameIdx[bnif->len].bname, newbook->bname);
bnif->BnameIdx[bnif->len].RecNum = 1;
bnif->BnameIdx[bnif->len].head = storeno;
newbook->namenext = 0;
bnif->len++;
}
}
//*************************************************
//*****修改作者索引以及作者链头索引表**************
void ChangeBauthorIdx(BookRecType *newbook, BauthorIdxFile *baif, int storeno)
{
int i = 0;
if(BauthorFind(baif, newbook->author) > 0) //已存在同作者的书
{
for(i = 0; i < baif->len; ++i)
{
if(strcmp(newbook->author, baif->BauthorIdx[i].author) == 0)
{
newbook->authnext = baif->BauthorIdx[i].head;
baif->BauthorIdx[i].head = storeno;
baif->BauthorIdx[i].RecNum++;
break;
}
}
}
else //不存在同作者的书
{
strcpy(baif->BauthorIdx[baif->len].author, newbook->author);
baif->BauthorIdx[baif->len].RecNum = 1;
baif->BauthorIdx[baif->len].head = storeno;
newbook->authnext = 0;
baif->len++;
}
}
//*************************************************
//*****修改出版社索引以及出版社链头索引表**********
void ChangeBpressIdx(BookRecType *newbook, BpressIdxFile *bpif, int storeno)
{
图书管理系统详细设计说明书
int i = 0;
if(BpressFind(bpif, newbook->press) > 0) //已存在同出版社的书
{
for(i = 0; i < bpif->len; ++i)
{
if(strcmp(newbook->press, bpif->BpressIdx[i].press) == 0)
{
newbook->prenext = bpif->BpressIdx[i].head;
bpif->BpressIdx[i].head = storeno;
bpif->BpressIdx[i].RecNum++;
break;
}
}
}
else //不存在同出版社的书
{
strcpy(bpif->BpressIdx[bpif->len].press, newbook->press);
bpif->BpressIdx[bpif->len].RecNum = 1;
bpif->BpressIdx[bpif->len].head = storeno;
newbook->prenext = 0;
bpif->len++;
}
}
//*************************************************
Reader代码
#include "TypeDef.h"
#include "Function.h"
#include <stdio.h>
#include <stdlib.h>
void AddReader(ReaderFile *rf)
{
int flag = 0;
char choice;
while(flag == 0)
{
ReaderRecType rr;
system("cls");
printf("请输入读者号(4位):");
scanf("%s", rr.rno);
while(strlen(rr.rno) != 4)
{
图书管理系统详细设计说明书
printf("输入读者号位数不正确,请重新输入:");
scanf("%s", rr.rno);
}
while(ReaderFind(rf, rr.rno) != -1)
{
printf("您输入的读者号已存在,主键不能重复,请重新输入:");
scanf("%s", rr.rno);
while(strlen(rr.rno) != 4)
{
printf("输入读者号位数不正确,请重新输入:");
scanf("%s", rr.rno);
}
}
printf("请输入读者姓名:");
scanf("%s", http://);
printf("请输入可借书数:");
scanf("%d", &rr.bn1);
rr.bn2 = 0;
rf->ReadRec[rf->len] = rr;
rf->len++;
while(1)
{
printf("是否继续添加读者?(Y/N)");
choice = getchar();
if(choice == 10) //判断接收的是否为回车符
{
choice = getchar();
}
if(choice == 'Y' || choice == 'y')
{
break;
}
else if(choice == 'N' || choice == 'n')
{
flag = 1;
break;
}
}
}
}
ReadFile代码
#include "TypeDef.h"
图书管理系统详细设计说明书
#include <stdio.h>
void ReadFile(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile* bpif, ReaderFile *rf, BborrowFile *bbf)
{
//读图书主文件,书号索引链头文件,书名索引链表文件,作者索引链表文件,出版社索引链表文件,读者文件,读借还书文件
FILE *fp = NULL;
int idx = 1, i = 0;
//*****读入图书主文件*************************
fp = fopen("BookDbFile.yangq", "r");
if(fp == NULL)
{
printf("Error : The BookDbFile.yangq is not exsit.\n");
return;
}
while(!feof(fp))
{
fscanf(fp, "%d", &idx);
fscanf(fp, "%s%s%d%s%d%s%d%s%d%d",
bf->BookDbase[idx].bno,
bf->BookDbase[idx].bname,
&bf->BookDbase[idx].namenext,
bf->BookDbase[idx].author,
&bf->BookDbase[idx].authnext,
bf->BookDbase[idx].press,
&bf->BookDbase[idx].prenext,
bf->BookDbase[idx].sortno,
&bf->BookDbase[idx].storenum,
&bf->BookDbase[idx].borrownum);
i++;
}
bf->len = i;
fclose(fp);
//*******************************************
//*****读入书名索引文件***********************
i = 0;
fp = NULL;
fp = fopen("BnameIdxFile.yangq", "r");
if(fp == NULL)
{
printf("Error : The BnameIdxFile.yangq is not exsit.\n");
图书管理系统详细设计说明书
return;
}
while(!feof(fp))
{
fscanf(fp, "%s%d%d", bnif->BnameIdx[i].bname,
&bnif->BnameIdx[i].RecNum);
i++;
}
bnif->len = i;
fclose(fp);
//*******************************************
//*****读入作者索引文件**********************
i = 0;
fp = NULL;
fp = fopen("BauthorIdxFile.yangq", "r");
if(fp == NULL)
{
printf("Error : The BauthorIdxFile.yangq is not exsit.\n");
return;
}
while(!feof(fp))
{
fscanf(fp, "%s%d%d", baif->BauthorIdx[i].author,
&baif->BauthorIdx[i].RecNum);
i++;
}
baif->len = i;
fclose(fp);
//*******************************************
//*****读入出版社索引文件********************
i = 0;
fp = NULL;
fp = fopen("BpressIdxFile.yangq", "r");
if(fp == NULL)
{
printf("Error : The BpressIdxFile.yangq is not exsit.\n");
return;
}
while(!feof(fp))
{
fscanf(fp, "%s%d%d", bpif->BpressIdx[i].press,
&bpif->BpressIdx[i].RecNum); &bnif->BnameIdx[i].head, &baif->BauthorIdx[i].head, &bpif->BpressIdx[i].head,
图书管理系统详细设计说明书
i++;
}
bpif->len = i;
fclose(fp);
//*******************************************
//*****读入读者文件**************************
i = 0;
fp = NULL;
fp = fopen("ReaderFile.yangq", "r");
if(fp == NULL)
{
printf("Error : The ReaderFile.yangq is not exsit.\n");
return;
}
while(!feof(fp))
{
fscanf(fp, "%s%s%d%d", rf->ReadRec[i].rno, rf->ReadRec[i].name, &rf->ReadRec[i].bn1, &rf->ReadRec[i].bn2);
i++;
}
rf->len = i;
fclose(fp);
//********************************************
//*****读入书号索引文件***********************
i = 0;
fp = NULL;
fp = fopen("BnoIdxFile.yangq", "r");
if(fp == NULL)
{
printf("Error : The BnoIdxFile.yangq is not exsit.\n");
return;
}
while(!feof(fp))
{
fscanf(fp, "%d%s", &bif->BnoIdx[i].RecNo, bif->BnoIdx[i].bno);
i++;
}
bif->len = i;
fclose(fp);
//*******************************************
//*****读入借还书文件************************