资源描述
沈航北方科技学院
课程设计说明书
课程名称 c语言课程设计
教 学 部 机械工程系
专 业 数控
班 级 B042111
学 号 B04211123
学生姓名 田文
指导老师 赵小磊 _
6月
链表实现图书信息操作
田文
目录
摘 要 1
1绪论 1
2系统分析 1
2.1 功效需求 1
2.2数据需求 2
2.3 性能需求 2
3总体设计 2
3.1功效模块设计 2
3.2系统设计方案 6
4具体设计 7
4.1登录模块 7
4.2借书管理模块 8
4.3还书管理模块 9
5调试和测试 10
5.1 调试 10
5.2 测试 11
6结论 12
结束语 12
参考文件 12
附录1-用户手册(另起一页) 13
附录2-源程序(另起一页) 15
摘 要
经过对程序设计题目标分析可知,整个程序设计实现大致分为五个模块,其中每一个模块对应一个函数,她们功效分别是:图书信息输入函数input(),借阅图书函数(borrow),增加删除图书函数(adddelet),图书查询函数(search),和归还图书信息函数(giveback)。在这些函数当中,这四个函数实现严格根据题目标要求。
1、 图书信息输入函数 关键功效是从键盘输入图书信息并将其写入文件中,作为图书馆书库,方便对下面函数进行运行,此函数是基础.
2、 图书借阅函数 关键借阅图书功效和录入学生应该还书时间;
3、 图书归还函数 关键实现借阅图书后,归还图书功效,并把应该还书时间和实际还书时间进行比较过期时输出学生信息,也是该程序一个关键
4、 增加删除图书函数 实现功效是实现对图书删除;
5、 图书查询函数 许可根据图书编号,书名,作者,出版社进行查询,并将查询信息输出;
6、 退出函数 该函数关键实现退出运行界面功效.
除上面介绍功效之外,程序还含有退出功效,能够在程序一次运行当中循环实施全部功效,并依据需要终止程序实施。
每一个图书统计全部包含:图书编号,名称,出版社,作者,现有数量和总量在程序当中,将图书统计类型定义为结构体类型,并把它写入d:\\liuyan.txt中,其它函数每次对图书统计访问,其数据起源全部是d:\\liuyan.txt文件,这么做不仅能够确保图书数据一致性,而且能够对图书数据进行永久保留,确保每次运行程序全部能够采取原来数据。
1绪论
整个程序设计实现大致分为五个模块,其中每一个模块对应一个函数,她们功效分别是:图书信息输入函数input(),借阅图书函数(borrow),增加删除图书函数(adddelet),图书查询函数(search),和归还图书信息函数(giveback)。在这些函数当中,这四个函数实现严格根据题目标要求。
2系统分析
2.1 功效需求
设计一个经过链表实现对图书信息进行管理程序,要求完成以下功效:
1. 建立一个链表,每个结点应包含以下信息:图书号、书名及出版社、价格、ISBN、作者、册数;
2. 将输入信息按图书号进行从小到大排序;
3. 实现查询功效——输入书名,查询输出相关信息;
4. 实现插入功效——输入图书信息并插入有序链表中;
5. 实现删除功效——输入书名或书号,可将其信息从链表中删除;
6. 统计链表中图书总价值,并在屏幕上输出;
7. 统计该链表中价值超出某一数目标图书总数,并在屏幕上输出。
8. 有界面友好易于使用菜单。
2.2数据需求
需要向系统输入图书号、书名及出版社、价格、ISBN、作者、册数
2.3 性能需求
在运行本程序时只要根据正确操作方法不会出现无法运行情况,系统稳定性好,安全,可靠。
3总体设计
3.1功效模块设计
依据分析整个系统关键划分为4个功效模块,分别实施要求中功效。该系统需要有添加,删除,查询,修改,累加,循环显示主菜单,保留信息功效,能将会员卡进行注销,利用显示函数将会员卡内全部信息显示。要求有循环显示菜单工能。功效模块图图1所表示。(1)输入读者
输入相关读者信息至内存中;
(2) 输入书籍
输入书籍号,对已存书籍信息进行查询;
(3) 书籍管理模块
输入对应代码,对相关信息进行查询;
(4) 退出管理模块
主菜单中输入0退出系统登录;
图1图书管理系统步骤图
图2 管理员版图书管理系统步骤图
图3 图书查询主界面步骤图
3.2系统设计方案
设计一个总菜单,1登录信息,2查询管理,3书籍管理系统,4退出系统。基础功效实现全部将表现在这多个菜单选项中。
struct reader *next;
}RD;
BK *h_book;
RD *h_reader;
void Login(); /*登陆*/
int Menu(); /*主菜单*/
void Menu_select(); /*主菜单选择函数*/
void Init(); /*初始化*/
void Init_reader(); /*初始化读者*/
void Init_book(); /*初始化图书*/
void Insert_New_Book(); /*新书入库*/
int Find(); /*查找菜单*/
void Find_Select(); /*查找菜单选择函数*/
void Find_Reader(); /*查找读者信息*/
void Find_Book(); /*查找图书信息*/
void Print_reader(); /*打印读者信息*/
void Print_book(); /*打印图书信息*/
void Borrow_Book(); /*借书函数*/
void Return_Book(); /*还书函数*/
void Save(); /*保留信息*/
void Save_Reader(); /*保留读者信息*/
void Save_Book(); /*保留图书信息*/
void Load(); /*加载信息*/
void Load_Reader(); /*加载读者信息*/
void Load_Book(); /*加载图书信息*/
void Login()/*登陆*/
{
system("cls");
printf("\n\n\n\t\t\t欢迎登陆本系统\n");
printf("\n\n\t\t 系统版权全部\n\n\n\n\n\n\n");
printf("\n\n\n\t\t 按 任 意 键 进 入 系 统 ...");
getchar(); system("cls");
}
int Menu() /*主菜单*/
{ int sn;
printf("\n\t\t图书管理系统主菜单\n");
printf("=================================================\n");
printf("*\t0----退出系统 *\n");
printf("*\t1----新书入库 *\n");
printf("*\t2---- 查询 *\n");
printf("*\t3----借书登记 *\n");
printf("*\t4----还书管理 *\n");
printf("=================================================\n");
printf("请选择对应代码:");
4具体设计
4.1登录模块
图4:输入读者信息
图5:输入书籍信息
4.2借书管理模块
主菜单中输入读者和书籍信息后,对已存书籍进行借阅,程序步骤图4所表示。
图6 借书模块步骤图
4.3还书管理模块
对于已还书籍进行管理,程序步骤图4所表示。
图7 还书模块步骤图
5调试和测试
5.1 调试
调试是软件开发过程中一个关键步骤,也是最复杂,对软件开发者者来说也是最艰巨任务。调试任务是立即更正测试过程中发觉软件错误。具体地说,调试过程由两个步骤组成,它从表示程序中存在错误某迹象开始,首先确定错误正确位置,也就是找出哪个模块或哪个语句引发错误。然后仔细研究推断代码以确定问题原因,并设法更正。
调试过程关键是运行编制好程序,然后碰到错误后依据系统提醒,找到相关问题所在。本系统调试过程中碰到问题、原因和处理方法以下面介绍。
(1) 程序只能在目前运行时才能实现自动生成书籍信息,而关闭系统再次打开添加新读者又从0开始和之前读者反复,造成借还信息程序管理混乱,无法正确运行。
原因:在实施后系统没有统计目前读者信息,因为读者信息自动按1、2、3、4依次递增生成系统;应该统计最终所生成读者信息,在下次运行程序时系统会接着上次统计读者信息自动依次生成。
(2) 运行完程序一次有错误提醒
原因:上次运行程序后没相关闭操作界面当点击编译时会有一个错误提醒,处理方法:将上一次运行时操作界面关闭。
(3)设计过程中想法和程序中不足
总来说这个程序大致实现了题目标要求,不过这套程序仍然存在着很多问题和不足。比如,程序中主函数写有点繁琐,有太多嵌套,不是那么井然有序,条理清楚,程序注释也不是很完善,对信息处理功效还有些不足之处,提醒信息不明确。还有就是没能做到模糊查询。
这个系统关键是参考书本手机通讯录模版编写,同时也得到了老师和同学部分帮助。我在做系统过程中也碰到了很多问题,有是知识不足,有是考虑不够周全。事实证实,只靠自己知识面还是很窄,独立处理问题能力不是很强,以后还要加强对c语言学习。
我认为对于C语言编写程序来说,使用方法大致全部是一样,所以假如要改善话,就是要改善部分算法,尽可能把界面编写清楚,提醒信息全方面,方便易用。
5.2 测试
软件测试是软件生存期中一个关键阶段,是软件质量确保关键步骤从用户角度来看,普遍期望经过软件测试暴露软件中隐藏错误和缺点,所以软件测试应该是“为了发觉错误而实施程序过程”。或说,软件测试应该依据软件开发各阶段规格说明和程序内部结构而精心设计一批测试用例(即输入数据及其预期输出结果),并利用这些测试用例去运行程序,以发觉程序错误或缺点。过分测试则会浪费很多宝贵资源。到测试后期,即使找到了错误,然而付出了过高代价。
测试数据过程以下。
(1) 登陆功效测试
输入数据1:读者编号:23,读者姓名:tianwen,书籍编号:01,书名:xyz作者:xxx,数量:10
预期结果:数据输入到系统中;
运行结果:出现图书管理系统主菜单
说明:登陆功效实现
(2) 借书功效测试
。。。
(3) 还书功效测试
。。。
6结论
计算机综合训练顺利完成,任务书中所提出要求全部实现,能够对会员信息进行添加、修改、删除和按多种信息查找,可将会员此次消费金额累加到会员卡上,能够自动生成会员卡号而且将多种信息保留到文本文件中。不过这个程序还有些不够完善,比如:在添加新会员时当会员信息全部输入以后系统中全部会员信息自动显示,这么很占用操作界面,使操作不是十分清楚;再一个就是系统无法正确识别身份证号和电话好码只能靠会员卡管理员认真细心才能降低犯错,改善方法:调用一个能够判定号码位数函数,假如输入位数不正当则提出警告重新输入。
结束语
在这一个星期实践中,经过编写这个图书管理系统,我体会到了c语言学习实用性。将理论和实践结合在一起,用优异计算机工具方便大家生活。C语言程序编写首先要从大局考虑,把自己编写整个程序思想全部写在初稿上,这么有利于自己编写程序,在编写时要完善注释,方便其它人了解程序。编写程序从理论上来说并没有错,但一上机就问题不停。甚至有些书本上知识照搬不变,也不能得到正确结果。有时一个程序改了一遍又一遍,但就是不能成功,编程显得枯燥乏味,看似简单程序题,在调试时却频频犯错。经反复修改后,结果正确了,这时全部乏味全部显得那么无力,一切全部是值得。
我认为,开发一套系统,最关键是细心,而且思索要全方面,结合实际,充足考虑到用户需求和现实意义。不管什么系统,只用利用到实际应用中,才含有现实意义。 所以c语言程序实用性很强,我们以后还要愈加努力认真地学习编程语言。
参考文件
附录1-用户手册
点击运行,首先出现是菜单界面,选择菜单选项进行操作,可进行图8所表示。
系统主界面(选择数字进入,退出系统)
图8 菜单界面
选择1进入系统,然后出现功效菜单 图9 登陆功效;
输入读者和书籍,然后出现功效菜单;
图10 图书管理系统主菜单
附录2-源程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 3
typedef struct book
{
char book_num[10];
char book_name[20];
char book_writer[10];
int book_kc;
int book_xy;
struct book *next;
}BK;
typedef struct borrow
{
char borrow_book_num[10];
char limit_date[8];
}BO;
typedef struct reader
{
char reader_num[10];
char reader_name[10];
int right;
BO borrow[Max];
struct reader *next;
}RD;
BK *h_book;
RD *h_reader;
void Login(); /*登陆*/
int Menu(); /*主菜单*/
void Menu_select(); /*主菜单选择函数*/
void Init(); /*初始化*/
void Init_reader(); /*初始化读者*/
void Init_book(); /*初始化图书*/
void Insert_New_Book(); /*新书入库*/
int Find(); /*查找菜单*/
void Find_Select(); /*查找菜单选择函数*/
void Find_Reader(); /*查找读者信息*/
void Find_Book(); /*查找图书信息*/
void Print_reader(); /*打印读者信息*/
void Print_book(); /*打印图书信息*/
void Borrow_Book(); /*借书函数*/
void Return_Book(); /*还书函数*/
void Save(); /*保留信息*/
void Save_Reader(); /*保留读者信息*/
void Save_Book(); /*保留图书信息*/
void Load(); /*加载信息*/
void Load_Reader(); /*加载读者信息*/
void Load_Book(); /*加载图书信息*/
void Login()/*登陆*/
{
system("cls");
printf("\n\n\n\t\t\t欢迎登陆本系统\n");
printf("\n\n\t\t 系统版权全部\n\n\n\n\n\n\n");
printf("\n\n\n\t\t 按 任 意 键 进 入 系 统 ...");
getchar(); system("cls");
}
int Menu() /*主菜单*/
{ int sn;
printf("\n\t\t图书管理系统主菜单\n");
printf("=================================================\n");
printf("*\t0----退出系统 *\n");
printf("*\t1----新书入库 *\n");
printf("*\t2---- 查询 *\n");
printf("*\t3----借书登记 *\n");
printf("*\t4----还书管理 *\n");
printf("=================================================\n");
printf("请选择对应代码:");
for(;;)
{ scanf("%d",&sn);
fflush(stdin);
if(sn<0||sn>4)
printf("\n错误!请重新输入:");
else break;
}
return sn;
}
void Menu_select()/*主菜单选择函数*/
{
for(;;) /*循环调用模式,确保能进行反复操作*/
{
switch(Menu()) /*功效选择*/
{ case 0:
system("cls");/*清楚屏幕先前显示内容*/
Save();
printf("\n\n\t文件保留成功!\n");
printf("\n\n\t欢迎下次使用本系统!\n");
getchar();
exit(0);
case 1:Insert_New_Book();break;
case 2:Find_Select();break;
case 3:Borrow_Book();break;
case 4:Return_Book();break;
default:printf("\n错误!");exit(0);
}
}
}
void Init() /*初始化*/
{
Init_reader();
Init_book();
}
void Init_reader() /*初始化读者信息*/
{
RD *p0;
int i;
printf("\n读者初始化开始,请输入读者信息..\n包含编号.姓名..\n");
p0=(RD*)malloc(sizeof(RD));
h_reader=p0;
printf("\n请输入读者信息:\n");
printf("ReaderNo.:"); /*输入读者编号(唯一)*/
scanf("%s",p0->reader_num);
printf("ReaderName:"); /*输入读者姓名(不唯一)*/
scanf("%s",p0->reader_name);
p0->right=0;
for(i=0;i<Max;i++)
{
strcpy(p0->borrow[i].borrow_book_num,"0"); /*所借图书直接置为0(即没有借书)*/
strcpy(p0->borrow[i].limit_date,"0");
}
p0->next=NULL;
printf("\n读者信息初始化完成!按任意键继续下一步操作..\n");
getchar();
system("cls");
}
void Init_book() /*初始化图书信息*/
{
BK *p0;
printf("\n图书初始化开始,请输入图书信息..\n包含编号.书名.数量..\n");
p0=(BK*)malloc(sizeof(BK));
h_book=p0;
printf("\n请输入图书信息:\n");
printf("BookNo.:"); /*输入图书编号(唯一)*/
scanf("%s",p0->book_num);
printf("BookName:"); /*输入图书名称*/
scanf("%s",p0->book_name);
printf("BookWriter:"); /*输入图书作者*/
scanf("%s",p0->book_writer);
printf("Number:"); /*输入图书数量*/
scanf("%d",&p0->book_kc);
p0->book_xy=p0->book_kc; /*开始时图书现有量和库存量相等*/
p0->next=NULL;
printf("\n图书信息初始化完成!按任意键继续下一步操作..\n");
getchar();
system("cls");
}
void Insert_New_Book()/*新书入库*/
{
BK *p,*p0,*p1;
p=p1=h_book;
printf("\n新书入库模块...\n");
printf("\n请输入新书信息..\n包含书号.书名.数量..\n");
p0=(BK *)malloc(sizeof(BK));
printf("BookNo.:");
scanf("%s",p0->book_num);
while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL)
p1=p1->next;
if(strcmp(p0->book_num,p1->book_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书数量*/
{
printf("\n此编号图书已存在!!直接入库!\n");
printf("Number:");
scanf("%d",&p0->book_kc);
p1->book_kc+=p0->book_kc;
p1->book_xy+=p0->book_kc;
}
else/*若不存在,则需要输入其它信息 ,然后在进行插入操作*/
{
printf("BookName:");
scanf("%s",p0->book_name);
printf("BookWriter:");
scanf("%s",p0->book_writer);
printf("Number:");
scanf("%d",&p0->book_kc);
while(p->next)
{
p=p->next;
}
if(h_book==NULL) h_book=p0; /*此处分两种情况,链表中没有数据,head直接指向p0处*/
else p->next=p0; /*此处分两种情况,链表中有数据,链表中最终元素next指向p0处*/
p0->next=NULL;
p0->book_xy=p0->book_kc;
}
printf("\n新书入库完成!按任意键继续下一步操作..\n");
getchar();
system("cls");
}
int Find() /*查找菜单*/
{
int sn;
printf("\n\t\t信息查询菜单\n");
printf("=================================================\n");
printf("*\t0----返回上级 \t*\n");
printf("*\t \t*\n");
printf("*\t1----查找图书 2----查找读者 \t*\n");
printf("*\t \t*\n");
printf("*\t3----打印图书 4----打印读者 \t*\n");
printf("=================================================\n");
printf("请选择对应代码:");
for(;;) /*循环调用模式,确保能进行反复操作*/
{
scanf("%d",&sn);
fflush(stdin);
if(sn<0||sn>4)
printf("\n错误!请重新输入:");
else break;
}
return sn;
}
void Find_Select() /*查找菜单选择函数*/
{
system("cls");
for(;;) /*循环调用模式,确保能进行反复操作*/
{
switch(Find()) /*功效选择*/
{
case 0:system("cls"); Menu_select(); break;
case 1:Find_Book();break;
case 2:Find_Reader();break;
case 3:Print_book();break;
case 4:Print_reader();break;
default:printf("\n错误!");exit(0);
}
}
}
void Find_Reader() /*查找读者信息*/
{
RD *p;
int i;
char find_reader[10];
p=h_reader;
printf("\n读者信息查询模块\n");
printf("\n请输入你要查询读者编号:");
scanf("%s",find_reader);
while(strcmp(p->reader_num,find_reader)!=0&&p->next)
p=p->next;
if(strcmp(p->reader_num,find_reader)==0)
{
printf("\n读者编号:%s信息为:\n",find_reader);
printf("ReaderNo.\tReaderName"); /*此处这么处理,是为了能实现一个读者能借多本书 Max 能够改*/
printf("\n");
printf("\t%s\t\t%s",p->reader_num,p->reader_name);
for(i=0;i<Max;i++)
{
printf("\n");
printf("BorrowBookNum%d",i+1);
printf("\tReturn%dLimitDate",i+1);
printf("\n");
printf("\t%s",p->borrow[i].borrow_book_num);
printf("\t\t%s",p->borrow[i].limit_date);
}
printf("\n");
}
else
printf("\n此读者编号不存在,请查对!按任意键返回...");
getchar();
system("cls");
}
void Find_Book() /*查找图书信息*/
{
BK *p;
char find_book[10]; /*功效很简单,读者编号唯一,查找只须一次遍历*/
p=h_book;
printf("\n图书信息查询模块\n");
printf("\n请输入你要查询图书编号:");
scanf("%s",find_book);
while(strcmp(p->book_num,find_book)!=0&&p->next)
p=p->next;
if(strcmp(p->book_num,find_book)==0)
/*找到了就打印,不然提醒不存在,或犯错*/
{
printf("\n图书编号:%s信息为:\n",find_book);
printf("\nBookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");
printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);
}
else
printf("\n此图书编号不存在,请查对!按任意键返回...");
getchar(); system("cls");
}
void Print_reader() /*打印读者信息*/
{
RD *p;
int i;
p=h_reader;
printf("\n读者信息以下:\n\n");
printf("ReaderNo.\tReaderName"); /*此处这么处理,是为了能实现一个读者能借多本书 Max 能够改*/
printf("\n");
while(p!=NULL) /*遍历链表一次就能够了*/
{
printf("\t%s\t\t%s",p->reader_num,p->reader_name);
for(i=0;i<Max;i++)
{
printf("\n");
printf("BorrowBookNum%d",i+1);
printf("\tReturn%dLimitDate",i+1);
printf("\n");
printf("\t%s",p->borrow[i].borrow_book_num);
printf("\t\t%s",p->borrow[i].limit_date);
}
printf("\n");
p=p->next;
}
printf("\n读者信息打印完成!按任意键继续下一步操作..");
getchar();
system("cls");
}
void Print_book() /*打印图书信息*/
{
BK *p;
p=h_book;
printf("\n图书信息以下:\n\n");
printf("BookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");
/*直接打印全部图书信息,遍历链表一次就可*/
while(p!=NULL)
{
printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);
p=p->next;
}
printf("\n图书信息打印完成!按任意键继续下一步操作..");
getchar();
system("cls");
}
void Borrow_Book() /*借书模块*/
{
BK *p0; RD *p1;
char bo_num[10],rea_num[10],lim_date[8];
int i;
p0=h_book; p1=h_reader;
printf("\n借书模块...\n");
printf("\n请输入借书读者编号:"); /*先输入借书读者信息*/
scanf("%s",rea_num);
while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0) /*遍历一次读者链表,判定读者是否存在*/
p1=p1->next;
if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0) /*假如存在,则继续,不存在就、则提醒错误!*/
{
printf("\n此读者编号不存在!按任意键返回..\n");
goto END;
}
printf("\n请输入你要借书编号:");
scanf("%s",bo_num);
while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL) /*遍历一次图书链表,判定此图书是否存在*/
p0=p0->next;
if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0) /*假如存在,则继续,不存在就、则提醒错误!*/
{
printf("\n此图书编号不存在!按任意键返回..\n");
}
else if(p0->book_xy<=0) /*判定此图书现在是否还有库存*/
{
printf("\n抱歉,此书已借完!请等候新书到来!!\n按任意键返回....");
}
else if(p1->right>=Max) /*判定此读者借书权限是否已达最大*/
{
printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回....");
}
else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0) /*此读者若已经借书,再判定此读者是否要借两本一样书*/
{
for(i=0;i<Max;i
展开阅读全文