资源描述
北京理工大学珠海学院
课程设计说明书
_2011_—_2012_学年第_2_学期
题目: 图书管理程序
学 院: 计算机学院
专业班级: 11计算机科学与技术X班
学 号: XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX
学生姓名: xx
XX
指导教师: XXX
成 绩:
时 间:
XXXX 年 X 月 xX 日
北京理工大学珠海学院
课程设计任务书
2011 ~2012 学年第 2 学期
学生姓名: XXXXX 专业班级: XX计算机科学与技术XX班
指导教师: XXXXX 工作部门: 计算机学院
一、课程设计题目
图书管理程序
二、课程设计内容
使用文本命令行界面;用文件保存图书馆里的图书信息;能实现图书信息的增、删、改、查等功能.
三、进度安排
(1)1—2学时,选定题目、分析需求、理解需求;
(2)3-4学时,程序设计,定义数据类型、数据处理方式;
(3)5-10学时,编写程序、调试、测试;
(4)11-12学时,编写设计报告;
(5)13-16学时,答辩。
四、基本要求
(1)只能使用C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块(视情况可另外加分)
(4)建立文件操作类、界面显示类及相关接口类,用文件读写实现。
(5)写出课程设计报告,应不少于3000字(不含附录),同一组学生只需提交1份,但必须在报告中列明分工。
课程负责人签名:
XXXX年 X月 XX日
课程设计分工安排
姓名
课程设计负责工作
备注
课程设计成绩评定表
姓 名
成绩评定权重
总分
总成绩
(五分制)
平时成绩20
报告成绩50
答辩成绩30
图书管理程序
摘 要
二十一世纪是信息的社会,信息作为社会最主要的资源,将成为战略资源引起人们广泛的关注.如何获取信息?图书是我们最好的获取信息的方式,但由于图书馆图书收藏量大大增加,使传统的图书管理员的工作日益繁重起来.迫使人们起用新的管理方法来管理图书,如何把图书管理员从繁重的工作中解脱出来呢?
科学技术日新月异的进步,让人类生活发生了巨大的变化,计算机技术的飞速发展,使各行各业在计算机技术应用方面得到了广泛的普及和使用。信息化时代的到来成为不可抗拒的潮流,人类文明正在进入一个崭新的时代.因此,图书管理系统也以方便、快捷、费用低的优点正慢慢地进入人们的生活,将传统的图书管理方式彻底的解脱出来,提高效率,减轻工人人员以往繁忙的工作,减小出错的概率,使读者可以花更多的时间在选择书和看书上。从而使人们有更多时间来获取信息、了解信息、掌握信息 。
关键词:图书管理 系统工程 信息管理系统 VC++
I
目 录
第一章 设计内容与目标 1
第二章 总体设计 2
2。1 模块化设计总方案 2
2.2 模块功能设计 2
第三章 详细设计 3
3.1数据结构设计 3
3。2 模块接口设计 3
3.3 模块实现设计 3
第四章 调试与测试 4
4。1 调试过程中的主要问题 4
4.2 测试过程与结果 4
参考文献 5
心得体会 6
北京理工大学珠海学院计算机学院课程设计
第一章 设计内容与目标
本图书管理程序将拥有学生和图书两种主要信息。程序是一个简单的管理程序,主要分为学生信息管理、图书信息管理、借书以及还书和借书查询五个模块.信息的储存则用到多个dat文件进行写入和读取。与一般图书管理程序有较大区别的是本程序并未保存学生及图书的编号,所以不存在书名和书号、学生名和学生号的关联,而是根据位置来利用文件流进行读写操作,但是依然可以通过学生号和图书号来查询借阅情况,并且可以查询历史借书记录。而对于程序的操作方面也将进行相当的简化,不过程序的图书和学生信息的数量存在着上限。
第二章 总体设计
2。1 模块化设计总方案
为实现图书管理程序的系统功能,程序将主要分为五个模块。他们分别是以下六个模块:学生信息管理、图书信息管理、借书管理、还书管理、借书查询、历史查询。这六个函数通过主函数进行调用.
2.2 模块功能设计
学生信息管理:添加修改学生数据、删除学生数据、浏览学生数据
图书信息管理:添加修改图书数据、删除图书数据、浏览图书数据
借书管理:借出书本
还书管理:收回书本
借书查询:按书号顺序列出所有书目以及借书的学生编号
图书管理程序
历史查询:按时间列出所有借书还书记录
查看图书
删除图书
修改图书
添加图书
查看学生
删除学生
修改学生
添加学生
借书查询
图书信息管理
还书
借书
学生信息管理
历史记录查询
功能结构框图第三章 详细设计
3。1数据结构设计
程序较为简单,仅用十四个dat文件分别保存了十四个数据,主要是学生姓名、图书名字、借书的学生编号以及时间数据。其中,借书的学生编号原理是一本书只能借给一个学生。这种方法可以简化数据信息储存,不过相对应的,图书借阅查询被复杂化。
3.2 模块接口设计
通过简单的函数调用把模块连接起来。
switch(getch())
case '1':{}
case '2':{}
case '3':{}
case '4':{}
case '5':{}
case '6':{}
主函数中,将显示“1 借书”、“2 还书”、“3 图书管理”、“4 学生管理”、“5 借书查询”、“6 历史记录”五个选项.
管理者通过
void lend();
void lendko();
void readerg();
void bookg();
void chaxun();
void lishi();
进行选择,六个选项中各有一个函数调用,分别对应开头
所建立的六个函数。
3.3 模块实现设计
学生信息管理:增改学生、删除学生、查看学生、所有学生四个选项。要储存信息只有学生名字。
增改学生:增加学生和修改学生。因为学生名额设置100个为上限,所以学生号设置为1—100.
信息一共只有一个—-学生名字,保存在文件“a1。dat”中。
如果学生已存在会进行提示。
system("cls");
ofstream fout("a1.dat",ios::out|ios::in);
cout<<"\n\n请输入学生编号(1-100):";
cin>>q;
fstream fin("a1.dat",ios::in);
fin.seekp(sizeof(reader)*(q-1));//位置函数
fin>>a[q-1].name;
if(a[q-1].name[0]!='\0')//第一个字符为空字符则是不存在
{
cout<<"\n\n此学生已存在,是否修改?\n输入1进行修改,输入2不进行修改:";
int i;
cin>>i;
if(i==1)
{
cout<<"\n\n请输入学生姓名:";
cin>>a[q-1].name;
fout.seekp(sizeof(reader)*(q-1));
fout<<a[q-1].name;
fout.close();
}
}
else
{
cout<<"\n\n请输入学生姓名:";
cin>>a[q-1].name;
fout.seekp(sizeof(reader)*(q-1));
fout<<a[q-1].name;
fout.close();
}
具体设计如下
通过位置来写入和读取学生的名字。
删除学生:删除学生首先根据所输入的学生号来读取学生名字,如果学生不存在则不进行删除作业。
system("cls");
cout<<"\n\n请输入学生编号(1-100):";
cin>>q;
fstream fin("a1.dat",ios::in);
fin.seekp(sizeof(reader)*(q-1));
fin>>a[q-1].name;
fin.close();
具体设计如下
if(a[q-1].name[0]=='\0')
判断学生名存不存在
Y
N
ofstream fout("a1.dat",ios::out|ios::in);
fout.seekp(sizeof(reader)*(q-1));
fout<<'\0';
fout.close();
cout<<"\n已删除相关信息\n";
cout<<"\n学生不存在"<<endl;
cout<<"\n按任意键继续";
getch();
system("cls");
cout<<"\n\n\n\n\t\t\t1 增 改 学 生\n\n\t\t\t2 删 除 学 生\n\n\t\t\t3 查看学生\n\n\t\t\t4 所有学生\n\n\t\t\t0 返 回"<<endl;
break;
查看学生:查看学生因为要把学生所借书号和书名也显示出来,所以过程较为复杂。方法主要是读取借书学生编号的文件,从头到尾读取数据,当借书学生编号与输入的学生号相同时,记录位置信息,位置信息就是图书的编号。
system("cls");
fstream fin("a1.dat",ios::in);
cout<<"\n\n请输入学生编号(1-100):";
cin>>q;
fin.seekp(sizeof(reader)*(q-1));
fin>>a[q-1].name;
fin.close();
具体设计如下
读取学生名字。
if(a[q-1].name[0]=='\0')
接着判断学生是否存在
N Y
cout<<"\n学生名字:"<<a[q-1].name<<endl;
book b[100];
int c[100];int i;
int s=0;//判断学生有没借书
for(i=0;i<100;i++)
c[i]=888;//用于输出学生所借书籍
fstream fin2("c1.dat",ios::in);
for(i=0;i<100;i++)
{
fin2.seekp(sizeof(book)*i);
fin2>>b[i].z;
if(b[i].z==q){s=s+1;c[i]=i;}
}
fin2.close();
cout<<"\n学生不存在"<<endl;
读取学生所借书籍
if(s==0)
Y
cout<<"\n此学生未借书\n";
fstream fin3("b1.dat",ios::in);
cout<<"\n学生所借书籍:";
for(i=0;i<100;i++)
if(c[i]!=888)
{
fin3.seekp(sizeof(book)*i);
fin3>>b[i].name;
cout<<"\n书号:"<<i+1<<"\t书名:"<<b[i].name<<endl;
fin3.clear();
}
fin3.close();
N
cout<<"\n按任意键继续";getch();system("cls");
cout<<"\n\n\n\n\t\t\t1 增 改 学 生\n\n\t\t\t2 删 除 学 生\n\n\t\t\t3 查看学生\n\n\t\t\t4 所有学生\n\n\t\t\t0 返 回"<<endl;break;
所有学生:按编号顺序把所有学生名字显示出来。
system("cls");
cout<<"学生编号\t\t学生名字\n";
for(q=0;q<100;q++)
{
cout<<q+1;
fstream fin("a1.dat",ios::in);
fin.seekp(sizeof(reader)*q);
fin>>a[q].name;
cout<<"\t"<<setw(20)<<a[q].name<<endl;//setw(20)空20个字符,右对齐
fin.close();
}
cout<<"\n按任意键继续";
getch();
system("cls");
cout<<"\n\n\n\n\t\t\t1 增 改 学 生\n\n\t\t\t2 删 除 学 生\n\n\t\t\t3 查看学生\n\n\t\t\t4 所有学生\n\n\t\t\t0 返 回"<<endl;
break;
具体设计如下:
图书信息管理:增改图书、删除图书、查看图书、所有图书四个选项。其中,增改图书、删除图书、所有图书三个选项实际就是把学生信息管理的增改学生、删除学生、所有学生的代码直接复制过去,把学生信息改为图书信息而已,所以基本上非常相似。其中,书名信息保存在“b1.dat”
fstream fin2("c1.dat",ios::in);
fin2.seekp(sizeof(book)*(q-1));
fin2>>b[q-1].z;
if(b[q-1].z!=0)
cout<<"\n借此书的学生编号:"<<b[q-1].z<<endl;
else
cout<<"\n此书未被学生借走"<<endl;
有所不同的是查看图书,因为一本图书只能借给一个学生,所以这里除了显示图书名字外还有如下程序
显示此图书的情况。
reader a[100];
book b[100];
system("cls");
int i,q;
cout<<"\n\n输入图书编号:";
cin>>q;
fstream fin("b1.dat",ios::in);
fin.seekp(sizeof(book)*(q-1));
fin>>b[q-1].name;
fin.close();
借书管理:借书管理是先输入图书编号
接着会自动读取文件显示图书名字,并判断图书是否存在和是否在。然后在输入借书的学生编号就可以完成借书。学生所借书的数量并没有设置上限。至于已经借出的书自然是不能在借出的。
if(b[q-1].name[0]=='\0')//初始化的和删除后的都是空字符
cout<<"\n图书不存在"<<endl;
else{
fstream fin3("c1.dat",ios::in);
fin3.seekp(sizeof(book)*(q-1));
fin3>>b[q-1].z;
fin3.close();
cout<<"\n书名:"<<"《"<<b[q-1].name<<"》"<<endl;
if(b[q-1].z!=0)cout<<"\n此书已被借\n";
else{
cout<<"\n请输入借书学生编号:";
cin>>i;
fstream fin2("a1.dat",ios::in);
fin2.seekp(sizeof(reader)*(i-1));
fin2>>a[i-1].name;
fin2.close();
if(a[i-1].name[0]=='\0')
cout<<endl<<"\n学生不存在"<<endl;
else{
cout<<"\n借书学生姓名:"<<a[i-1].name<<endl;
ofstream fout("c1.dat",ios::out|ios::in);
fout.seekp(sizeof(book)*(q-1));
fout<<i;
fout.close();
比较重要的是,本程序是可以查看借书还书的历史记录的,而且时间精确到秒。所以在借书管理和还书管理中会有记录时间的代码,其中,年、月、日、时、分、秒分别保存在六个文件中。
具体设计如下
int k;tm *year;tm *month;tm *day;tm *hour;
tm *minute;tm *second;time_t t;t=time(0);
year=localtime(&t);month=localtime(&t);
day=localtime(&t);hour=localtime(&t);
minute=localtime(&t);second=localtime(&t);
fstream time("g2.dat",ios::in);
time>>k;time.close();
k=k+1;
ofstream timea("g2.dat",ios::out);
timea<<k;timea.close();
ofstream time1("a2.dat",ios::out|ios::in);
time1.seekp(sizeof(5)*(2*k));time1<<(year->tm_year+1900);time1.close();
ofstream time2("b2.dat",ios::out|ios::in);
time2.seekp(sizeof(5)*(2*k));time2<<(month->tm_mon+1);time2.close();
ofstream time3("c2.dat",ios::out|ios::in);
time3.seekp(sizeof(5)*(2*k));time3<<day->tm_mday;time3.close();
ofstream time4("d2.dat",ios::out|ios::in);
time4.seekp(sizeof(5)*(2*k));time4<<hour->tm_hour;time4.close();
ofstream time5("e2.dat",ios::out|ios::in);
time5.seekp(sizeof(5)*(2*k));time5<<minute->tm_min;time5.close();
ofstream time6("f2.dat",ios::out|ios::in);
time6.seekp(sizeof(5)*(2*k));time6<<second->tm_sec;time6.close();
ofstream time7("a3.dat",ios::out|ios::in);
time7.seekp(sizeof(5)*(2*k));time7<<i;time7.close();
ofstream time8("b3.dat",ios::out|ios::in);
time8.seekp(sizeof(5)*(2*k));time8<<q;time8.close();
ofstream time9("c3.dat",ios::out|ios::in);
time9.seekp(sizeof(5)*(2*k));time9<<1;time9.close();//时间保存结束
cout<<endl<<"\n已完成借书处理"<<endl;
}
}
}
cout<<"\n按任意键继续";
getch();
}
system("cls");
reader a[100];book b[100];int q,i;
cout<<"\n\n输入图书编号:";
cin>>q;
fstream fin("c1.dat",ios::in);
fin.seekp(sizeof(book)*(q-1));
fin>>b[q-1].z;
i=b[q-1].z;
fin.close();
还书管理:先输入图书编号.
接着会自动读取文件显示图书名字,并判断图书是否已被借走。然后还书管理会自动完成。
fstream fin3("b1.dat",ios::in);
fin3.seekp(sizeof(book)*(q-1));
fin3>>b[q-1].name;
fin3.close();
if(b[q-1].name[0]=='\0')
cout<<"\n图书不存在"<<endl;
else
{
cout<<"\n书名:"<<"《"<<b[q-1].name<<"》"<<endl;
if(i==0)
cout<<"\n此书未被人借"<<endl;
else
{
cout<<"\n借书学生编号:"<<i<<endl;
fstream fin2("a1.dat",ios::in);
fin2.seekp(sizeof(reader)*(i-1));
fin2>>a[i-1].name;
fin2.close();
cout<<"\n借书学生姓名:"<<a[i-1].name<<endl;
ofstream fout("c1.dat",ios::out|ios::in);
fout.seekp(sizeof(book)*(q-1));
fout<<0;
fout.close();
至于接下来的是和借书管理一样的时间记录,唯一不同的是输出到“c3.dat”文件中的不是“1",而是“2”,借以区分借书和还书.
借书查询:很简单的代码,不过是按顺序把图书编号、图书名字、借此书的学生编号列出来而已.
system("cls");
book b[100];
int i;
cout<<"图书编号\t\t图书名字\t\t借书学生编号"<<endl;
for(i=0;i<100;i++)
{
cout<<i+1;
fstream fin("b1.dat",ios::in);
fin.seekp(sizeof(book)*i);
fin>>b[i].name;
cout<<"\t\t"<<setw(20)<<b[i].name;
fin.close();
fstream fin2("c1.dat",ios::in);
fin2.seekp(sizeof(book)*i);
fin2>>b[i].z;
if(b[i].z==0)
cout<<endl;
else
cout<<"\t"<<setw(20)<<b[i].z<<endl;
fin2.close();
}
cout<<"\n按任意键继续";
getch();
历史查询:按顺序读取时间数据和借书还书的信息。
int k;//这里开始是时间读取
int t[10];reader a[100];book b[100];
cout<<"借书历史数据"<<endl;
for(k=0;k<100;k++)
{
fstream time1("a2.dat",ios::in);
time1.seekp(sizeof(5)*(2*k));time1>>t[1];time1.close();
fstream time2("b2.dat",ios::in);
time2.seekp(sizeof(5)*(2*k));time2>>t[2];time2.close();
fstream time3("c2.dat",ios::in);
time3.seekp(sizeof(5)*(2*k));time3>>t[3];time3.close();
fstream time4("d2.dat",ios::in);
time4.seekp(sizeof(5)*(2*k));time4>>t[4];time4.close();
fstream time5("e2.dat",ios::in);
time5.seekp(sizeof(5)*(2*k));time5>>t[5];time5.close();
fstream time6("f2.dat",ios::in);
time6.seekp(sizeof(5)*(2*k));time6>>t[6];time6.close();
fstream time7("a3.dat",ios::in);
time7.seekp(sizeof(5)*(2*k));time7>>t[7];time7.close();
fstream time8("b3.dat",ios::in);
time8.seekp(sizeof(5)*(2*k));time8>>t[8];time8.close();
fstream time9("c3.dat",ios::in);
time9.seekp(sizeof(5)*(2*k));time9>>t[9];time9.close();//时间读取结束
fstream fin("a1.dat",ios::in);
fin.seekp(sizeof(reader)*(t[7]-1));
fin>>a[t[7]-1].name;
fin.close();
fstream fin2("b1.dat",ios::in);
fin2.seekp(sizeof(book)*(t[8]-1));
fin2>>b[t[8]-1].name;
fin2.close();
接着显示所有借书还书记录。
if(t[9]==1)
{
cout<<"时间:"<<t[1]<<"年"<<t[2]<<"月"<<t[3]<<"日 "<<t[4]<<":"<<t[5]<<":"<<t[6]<<endl;
cout<<"学号:"<<t[7]<<" 学生名字:"<<a[t[7]-1].name<<endl;
cout<<"书号:"<<t[8]<<" 图书名字:"<<b[t[8]-1].name;
cout<<" 借还:借书\n"<<endl;
}
else if(t[9]==2)
{
cout<<"时间:"<<t[1]<<"年"<<t[2]<<"月"<<t[3]<<"日 "<<t[4]<<":"<<t[5]<<":"<<t[6]<<endl;
cout<<"学号:"<<t[7]<<" 学生名字:"<<a[t[7]-1].name<<endl;
cout<<"书号:"<<t[8]<<" 图书名字:"<<b[t[8]-1].name;
cout<<" 借还:还书\n"<<endl;
}
else break;
第四章 调试与测试
4.1 调试过程中的主要问题
程序调试中,主要的问题是数据信息的储存问题,以及文件流的错误使用.
1、 “()"括号是其中的一个问题。括号的重要性在C++中不言而喻。由于未能及时发现,导致程序编写速度变得非常缓慢,例如在文件中指定位置保存数据时,代码“fout。seekp(sizeof(reader)*(q—1))”中的“(q—1)"开始就是由于没有使用括号而导致数据信息储存错误。
2、 由于信息储存中没有学生号和图书号,所以在借书还书以及查询上问题较多。因为简化了储存,只保存书名、学生名和借书学生编号,所以在通过书号和学生号进行查询时花费较多的语句来将信息关联,使程序复杂化。
3、 简单错误:写程序太快,把“=”(赋值)和“==”(弄错),漏写非常多个“;",“{”、“}”大括号多写或漏写。
4.2 测试过程与结果
主界面(第一次开启会初始化数据,如左上角显示):
图书管理:
增改图书:
删除图书:
删除和查看图书时,若图书不存在:
查看图书:
所有图书:
学生管理的除了查看学生之外和图书管理的类似。
查看学生:
借书:
还书:
借书查询:
历史记录:
参考文献
[1]陈维兴、林小茶:《C++面向对象程序设计教程》[M],清华大学出版社—3版,第305页。
心得体会
通过一个完整的图书管理信息系统的创建,我了解到一个数据库系统的开发,即是前台和后台的开发。前台是应用程序的开发:功能模块设计、源代码开发.后台是数据库的开发:系统设计、数据库设计、数据库结构的设计等.
前台开发涉及到整个图书管理系统功能的实现,及实现的效率。后台开发也尤为重要,它对应用程序的效率以及实现的效果产生影响.另外,合理的数据结构将非常有利于程序的实现,而不合理的信息储存则会使得程序大幅度的复杂化。
通过对这个系统的开发,我对VC++ 有了更深程度的认识和了解,也使我对数据库的开发有所了解,为以后从事数据库开发工作打下了良好的基础。在这个程序的设计过程中,我清楚的意识到自己的水平有多么的薄弱,课程的知识学得有多么的不扎实.看网上的例子好像觉得也没那么难,自己一上机实际操作就出现了很多问题,调试的时候系统总是在报错,还有很多警告,每增加一个函数就要调试好久,有时候应为少了一个大括号或是分号,导致要找很久很久。虽然系统可以运行,也具有了一些基本的功能,但我意识到了自己有太多的不足。
以后还会有很多的课程设计,一定要吸取这次的教训,把知识学懂学透学精,真正的为我所用,这样走上社会我才能真正的发挥所长。
计算机学院课程设计答辩记录表
专业学院
专业
姓名
学号
课程设计
题目
答辩日期
答辩时间
答
辩
提
问
及
其
回
答
记
录
10
展开阅读全文