最终版图书管理系统实训报告
目录
第一章 需求分析………………………………………………………………3 第二章 概要设计………………………………………………………………5
2.1 安装手册………………………………………………………………5 2.2 使用手册………………………………………………………………5
第三章 详细设计………………………………………………………………6
3.1 程序结构说明………………………………………………………. …….6
第四章 调试分析………………………………………………………………11 第五章 用户使用说明………………………………………………………….16 第六章 测试结果………………………………………………………………22 第七章 参考文献………………………………………………………………25
附录一:分工说明 附录二:程序代码
一、需求分析
1. 编写目的及功能
随着社会的发展,计算机的普及,以往书面记载进行图书管理的
方法已经不能适应实际的需要,且容易出错和浪费大量时间。因此,很有必要来开发一个图书管理系统来管理图书,这样可以节省人力物力且准确率高。本系统的开发正是适应这一需求,本系统可以提高图书管理的工作效率,减少工作人员的工作量,使图书管理工作真正的达到科学合理、准确高效。
2. 该程序输入的形式主要以数字形式(有的输入中文,有的输入英文字母,如是否退出时选择
y
或者
n ),
在功能选择的时候一键输入数字实现功能选择,在功能选择界面的输入值范围为1~5.在分支功能选择中你会输入中文或数字等。输出的形式主要以数字与英文单词为主。如图:
二、概要设计
2.1安装手册——该图书管理系统使用的是vc++软件
2.2 使用手册
该程序使用了整形、字符型、浮点型、指针型四种数据类型。整个程序中通过在主函数中对五个子函数(input 、look 、search 、del 、change )进行定义,并用判断函数if 进而调用各个子函数,实现不同功能,用do …while 、while 函数反复调用子函数。各个子函数的调用:
input :调用循环函数for ,录入图书的详细信息,并把各个图书存在状态输入全局数组t[ ]。
look :调用循环函数for ,对录入的图书进行浏览。
Search :通过判断函数if ,选择输入书名或作者名,分别查阅该图书的详细信息,并定义指针p ,把图书存在状态数组t[ ]的首地址赋给p 。
Del :调用子函数search ,运用指针p ,调用if 函数对指针p 进行判断是否能够借阅图书:1、可借阅该图书,输入学生姓名,性别,学生号,并用全局数组g[ ]、h[ ]分别记录登陆号、学生号。修改指针p ,进而修改该图书存在状态。2、图书已借阅、则通过while 函数判断是否继续借阅,并循环该子函数功能。
Change :通过if 函数,输入的登录号与学生号一一对全局数组g[ ]和h[ ]进行判断:1、符合条件,修改指针p ,进而修改该图书存在状态。2、不符合,提示错误。调用while 函数循环子函数功能。
三、详细分析
3.1 程序主要说明
启动后,根据程序的画面作出选择,1~5让你选择。
录入图书的子函数的for 循环;
当你使用录入新图书的功能,你输入要录入的图书的数量之和,你就要继续输入关于图书的所有信息,然后最后就选择退出。
浏览图书的子函数的for 循环;
查阅图书的子函数的for 循环; 通过判断函数
if ,选择输入书名或作者名,
分别查阅该图书的详细
信息,最后返回主函数。
借阅图书的子函数:
如图上、调用子函数search ,运用指针p ,调用if 函数对指针p 进行判断是否能够借阅图书:1、可借阅该图书,输入学生姓名,性别,学生号,并用全局数组g[ ]、h[ ]分别记录登陆号、学生号。修改指针p ,进而修改该图书存在状态。2、图书已借阅、则通过while 函数判断是否继续借阅,并循环该子函数功能
归还图书的子函数:
通过if 函数,输入的登录号与学生号一一对全局数组g[ ]和h[ ]进行判断:1、符合条件,修改指针p ,进而修改该图书存在状态。2、不符合,提示错误,无此借阅信息,再提示是否归还,否的话就跑回主函数。
四、调试分析
1调试过程中遇到的问题是如何解决的以及设计与实现的回顾讨论○
和分析(因遇问题众多,只列举相对重要两个进行分析): 问题一:主函数int main()无法终止循环调用子函数。错误代码效果图如下:
错误运行效果图:
解决:在do …while 函数中添加while 对输入的数进行判断,代码如下图:
正确运行效果图:
问题二:(1)子函数input 数据存储问题。在主函数中第一次调用子函数input ,储存两本图书的数据,结束调用子函数input 之后,通过do …while 函数再次调用input ,储存另两本图书数据,然后通过调用子函数look 进行图书数据查看,发现后两本图书的数据覆盖前两本图书的数据。(2)第一次调用子函数input ,录入图书数量超过3本,数据显示错误。错误代码如下:
错误运行效果图如下: (1)第一次输入:
第二次输入:
错误运行显示:
(2) 输入:
显示:
解决:定义一个全局变量x ,把输入i 值的累加在x 中,调用look 函数查看图书数据,输出b[x]数组。正确代码如下:
正确运行效果图:
2分析及结论: ○
在整个图书馆管理系统代码运行中,主函数和各个子函数之间相互调用、整个数据的修改、指针储存数据的修改、循环等操作,我们往往忽略了全局变量、全局数组的功能,循环函数的循环逻辑与操作过程,各函数之间调用的牵制,最终导致花费大量时间进行修改。熟悉掌握课本知识,了解各个函数的功能作用,分析其功能中的逻辑使用,才能掌握C 语言基础,为以后学习C++,JAV A 等语言做铺垫。
五、用户使用说明
首先,我们打开图书馆信息管理系统这个程序。
然后,选择我们需要使用的功能并输入相对应的序号按回车键确定。 1. 我们使用图书馆信息管理系统的第一个功能:录入图书
依次按照提示进行操作
我们可以使用此功能多次录入图书。
弹出 是否退出系统:(y/n)的提示时,输入n 继续操作。 2. 选择本程序的第二个功能:浏览图书信息。
就可以看到,我们在第一步时,已经录入的图书信息。
3. 本程序的第三个功能是查询图书。我们可以根据书名或者作者名查找到我们需要的图书。如图,
按书名查询图书
按作者名查询图书:
4. 本程序的第四个功能:借阅图书。
选择后,我们也一样可以按照书名或者作者名来查询图书然后选择是否借阅。
按照提示,依次输入自己的姓名,性别,学号就可以成功借阅。 如有需要,还可以继续借阅图书。
5. 本程序的第五个功能就是:归还图书。
凭借图书的登录号和本人的学号可以将已借阅的图书归还。
还可以选择是否继续归还图书。
最后,就可以选择是否退出图书信息管理系统了。
六、测试结果
开始运行:
输入:1(录入图书信息)
输入:2(浏览图书信息)
输入3:查阅图书的信息(有两种)
输入4:借阅图书
输入5:归还图书
七、参考文献
[1]肖宪华,从零开始学C 语言[实战]案例版. 中国铁道出版社.2013
[2]谭浩强,C 语言设计(第四版). 清河大学出版社.2010
[3]百度文库
[4]百度文献
[5]百度知道
附录二:
程序:#include
#include
#include
#define N 100
int sum,t[100],*p,k,g[100],h[100];
int x=0; //定义全局变量
char *p2;
int del(); //借阅图书
void change(); //归还图书
void input(); //录入新图书
void look(); //浏览图书
void search(); //查询图书
struct books
{
int num1; //登录号
char book[30]; //书名
char writer[30]; //作者名
int num2; //分类号
char danwei[10]; //出版单位
int time; //出版时间
float price; //价格
int status; //图书存在状态
char name[30]; //借书人姓名
char sex[10]; //借书人性别
long int num3; //借书人学号
}b[N];
int main()
{int i;
char a;
printf("\n");
printf("\n");
printf(" * ******************************* *\n"); printf(" * 欢迎进入图书馆信息管理系统 *\n"); printf(" * ******************************* *\n"); printf("\n");
printf("####################################################################\n");
printf(" 请选择需要使用的功能\n");
printf("\n");
do
{
printf(" 1.录入新图书\n");
printf(" 2.浏览图书信息\n");
printf(" 3.查询图书\n");
printf(" 4.借阅图书\n");
printf(" 5.归还图书\n");
printf("输入对应序号并确认回车:\n");
scanf("%d",&i);
if(i==1)
input();
if(i==2)
look();
if(i==3)
search();
if(i==4)
del();
if(i==5)
change();
printf("是否退出系统:(y/n)?\n");
scanf("%s",&a);
while(!(a=='y'||a=='Y'||a=='n'||a=='N'))
{printf("输入错误,请重新确认是否退出系统:(y/n)?\n");
scanf("%s",&a);}
}
while(a=='n'||a=='N');
return 0;
}
void input()
{int i,n;
printf("请输入本次录入图书的数量(n
scanf("%d",&n);
while(!(n
{
printf("输入错误,请重新确认输入本次录入图书的数量(n
}
sum=sum+n;
printf("请输入图书的登录号、书名、作者名、分类号、出版单位、出版时间、价格、存在状态:\n");
for(i=0;i
{
x=x+i;
printf("请输入登录号:\n");
scanf("%d",&b[x].num1);
printf("请输入书名:\n");
scanf("%s",b[x].book);
printf("请输入作者名:\n");
scanf("%s",b[x].writer);
printf("请输入分类号:\n");
scanf("%d",&b[x].num2);
printf("请输入出版单位:\n");
scanf("%s",b[x].danwei);
printf("请输入出版时间:\n");
scanf("%d",&b[x].time);
printf("请输入价格:\n");
scanf("%f",&b[x].price);
printf("请输入存在状态(上架/下架:1/0):\n");
scanf("%d",&b[x].status);
while(!(b[x].status==1||b[x].status==0))
{printf("输入错误,请重新输入存在状态(上架/下架:1/0)\n");
scanf("%d",&b[x].status);}
t[x]=b[x].status;
}
}
void look()
{
printf("欢迎进入浏览图书信息功能\n");
printf("登陆号\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\n\n");
for(x=0;x
printf("%d\t%s\t%s\t%d\t%s\t\t%d\t\t%f\n",b[x].num1,b[x].book,b[x].writer,b[x].num2,b[x].danwei,b[x].time,b[x].price);
}
void search()
{
int i,j;
char a[N];
printf("\t\t******************************\n");
printf("开始查询:\n");
printf("\t\t1-------------按书名查询\n");
printf("\t\t2-------------按作者名查询\n");
printf("\t\t******************************\n");
printf("\t\t请选择你想要的查询方式:");
scanf("%d",&j);
if(j==1)
{
printf("请输入书名:");
scanf("%s",a);
for(i=0;i
{
if (strcmp(a,b[i].book)==0)
{
b[i].status=t[i];
printf("登陆号\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\t存在状态\n\n");
printf("%d\t%s\t%s\t%d\t%s\t\t%d\t\t%6.2f\t%d\n",b[i].num1,b[i].book,b[i].writer,b[i].num2,b[i].danwei,b[i].time,b[i].price,b[i].status); p=&t[i];
k=i;
}
}
}
if(j==2)
{
printf("请输入作者名:");
scanf("%s",a);
for(i=0;i
{
if (strcmp(a,b[i].writer)==0)
{
b[i].status=t[i];
printf("登陆号\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\t存在状态\n\n");
printf("%d\t%s\t%s\t%d\t%s\t\t%d\t\t%6.2f\t%d\n",b[i].num1,b[i].book,b[i].writer,b[i].num2,b[i].danwei,b[i].time,b[i].price,b[i].status); p=&t[i];
k=i;
}
}
}
if(j==0) return;
}
int del()
{
char c,e;
do
{
search();
if(*p==1)
{
printf("是否借阅该图书(y/n):\n");
scanf("%s",&c);
if(c=='y'||c=='Y')
{ *p=0;
printf("请输入本人的姓名:\n");
scanf("%s",b[k].name);
printf("请输入本人性别:(男/女:X/Y)\n");
scanf("%s",b[k].sex);
printf("请输入本人的学号:\n");
scanf("%d",&b[k].num3);
printf("登陆号\t书名\t作者名\t分类号\t出版单位\t出版时间\t价格\t存在状态\t借阅人\t性别\t学号\n\n");
printf("%d\t%s\t%s\t%d\t%s\t\t%d\t\t%6.2f\t%d\t%s\t%s\t%d\n",b[k].num1,b[k].book,b[k].writer,b[k].num2
,b[k].danwei,b[k].time,b[k].price,b[k].status,b[k].name,b[k].sex
,b[k].num3);
printf("\n借阅成功!\n");
g[k]=b[k].num1;
h[k]=b[k].num3;
}
}
printf("是否继续借阅:(y/n)?\n");
scanf("%s",&e);
}
while(e=='y'||e=='Y');
return(*p);
}
void change()
{int a,r,e;
do
{
printf("请输入图书的登录号:\n");
scanf("%d",&a);
printf("请输入本人的学生号:\n");
scanf("%d",&r);
if(a==g[k]&&r==h[k])
{
*p=1;
printf("图书归还成功\n");
}
else
printf("\n无此借阅相关信息,请核对相关信息后再执行操作:\n"); printf("是否继续归还图书:(y/n)?\n");
scanf("%s",&e);
}
while(e=='y'||e=='Y');
}