C++课程设计报告.docx
《C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告.docx(37页珍藏版)》请在冰豆网上搜索。
C++课程设计报告
课程设计说明书
题目:
图书管理系统
学生姓名:
学院:
信息工程学院
班级:
软件10-1
指导教师:
讲师
讲师
讲师
讲师
2011年12月26日
内蒙古工业大学课程设计(论文)任务书
课程名称:
面向对象程序设计课程设计学院:
信息工程学院班级:
软件10-1
学生姓名:
___学号:
_
指导教师:
一、题目
图书管理系统
二、目的与意义
《面向对象程序设计课程设计》课程设计是计算机科学与技术专业实践性环节之一,通过课程设计的综合训练可以使学生进一步理解和掌握面向对象程序设计课程的基本知识;掌握面向对象程序设计的思路和方法;基本具有利用面向对象的方法以及C++的编程思想来完成系统设计的能力。
三、要求(包括原始数据、技术参数、设计要求、图纸量、工作量要求等)
1.要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
2.要求在设计的过程中,建立清晰的类层次;
3.在系统中至少要定义一个类,类中要有各自的属性和方法;
4.在系统的设计中,至少要用到面向对象的一种机制。
四、工作内容、进度安排
1.根据课程设计的要求,确定设计题目;(0.5天)
2.查找相关资料,进行应用程序总体结构、使用功能的设计;(0.5天)
3.进行应用程序的界面设计和源程序代码的编写;(2.5天)
4.设计说明书的撰写、答辩(1.5天)
五、主要参考文献
[1]《C++语言程序设计(第三版)》,郑莉,清华大学出版社,2004
[2]《C++程序设计教程》,钱能主编,清华大学出版社,1999.4
[3]《C++程序设计课程设计》,刘振安,机械工业出版社,2004.8
审核意见
系(教研室)主任(签字)
指导教师下达时间2011年12月26日
指导教师签字:
_______________
摘要
现在的社会日新月异,发展的非常快。
学校的发展也是非常的快了,图书馆的图书更多了,如何才能把所有的图书进行有效快速的管理已经迫在眉睫,而且手工的管理已经不能满足广大读者借阅的需求了在这种条件下,使用微机管理已经是大势所趋了。
面向对象程序设计课程设计是集中实践性环节之一,是学习完面向对象程序设计课程后进行的一次全面的综合练习。
要求学生达到熟练掌握C++语言的基本知识;基本掌握面向对象程序设计的思想和方法;能利用所学的基本知识和技能解决简单的面向对象程序设计的问题,从而提高动手编程解决实际问题的能力。
为了巩固自己已经学到的知识,以及方便广大师生借阅图书,本人就图书馆的实际需求设计了此图书管理系统。
一、设计正文1
1.1设计要求与需求分析1
1.1.1设计要求1
1.1.2需求分析1
1.2系统设计2
1.2.1总体设计2
1.2.2详细设计2
二、调试与运行结果12
2.1.欢迎界面:
12
2.2.主菜单:
12
2.3.图书浏览:
13
2.4.新书上架:
13
2.5.图书下架:
13
2.6.图书查询:
14
2.7.读者信息管理:
15
三、问题与总结16
3.1实验中遇到的问题及解决方法16
3.2实验的体会与感想17
3.3致谢17
四、程序源代码17
五、参考文献34
一、设计正文
1.1设计要求与需求分析
1.1.1设计要求
图书信息管理系统:
具体要求:
(1)利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统中至少要定义一个类,类中要有各自的属性和方法;
(4)在系统的设计中,至少要用到面向对象的一种机制。
(5)独立撰写一份设计报告,要求设计方案和指导思想正确,格式规范,内容全面,叙述清楚,分析和总结合理。
1、使用类和对象设计程序
设计类就是根据数据封装的要求,抽象出合适的类。
2、使用菜单
这部分的任务是设计一个含有多个菜单项,通过菜单选择不同的功能。
要求熟悉多文件菜单编程和面向对象程序设计的思想。
3、通过组合和派生构成新的类?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
设计相应的构造函数和复制构造函数,进一步理解程序如何调用它们及析构函数的执行顺序。
4、函数的设计
函数进一步扩充程序,完善功能。
5、使用适当的注释。
1.1.2需求分析
总体需求:
编写一个图书信息管理,图书信息的组成部分为:
书号、书名、作者名、出版社、出版时间、价格等。
功能需求:
a新书上架;
b图书浏览;
c图书下架;
d图书查询:
;
e读者信息管理。
1.2系统设计
1.2.1总体设计
功能设计:
根据设计要求及需求分析设计出一下几种功能:
1.新书上架:
添加图书信息;2.图书浏览:
:
输出所有图书信息;3.:
删除指定图书信息;4.图书查询:
可按书号、书名或作者名查询(按书号查询时,因书号唯一,结果仅为一条记录;按书名或作者名查询时,结果可能为多条记录);5.读者信息管理:
对读者的信息进行浏览、添加、修改等处理。
用户界面:
输入:
程序正常运行后,屏幕上显示一个文字菜单(根据序号选定相应的操作项目),当用户选定操作项目所对应的序号时,根据应用程序的提示信息,从键盘上输入相应的数据。
输出:
应用程序正常运行后,要在屏幕上显示一个文字菜单;要求用户输入数据时,要给出清晰、明确的提示信息。
1.2.2详细设计
UML类图:
流程图:
主要流程:
新书上架:
图书浏览:
关键代码:
voidInsert()//新书上架
{
inti,book_num,time[3],ppp=0;
doublepri;
charnam[20],chu[20],aut[20];
boolflag=true;
Bookbook[5000];//以下是检验书刊编号是否唯一
ifstreaminfile("Book.dat",ios:
:
in|ios:
:
binary);
if(!
infile)
{
cout<<"\t不能打开此文件,或此文件不存在!
"<return;
}
for(i=0;iinfile.read((char*)&book[i],sizeof(book[i]));
infile.close();
while(flag)
{
flag=false;
cout<"<>book_num;
for(i=0;iif(book[i].Getnumber()==book_num)
{
cout<<"\t您输入的书号与已有图书重复,请重新输入!
"<flag=true;break;
}
}
cout<<"请按以下顺序输入图书信息:
"<cout<<"书名:
作者:
出版社:
出版时间:
年:
月:
日:
价格:
"<cin>>nam>>aut>>chu>>time[0]>>time[1]>>time[2]>>pri;
Bookbook_insert(nam,book_num,aut,chu,time,pri);
ofstreamoutfile("Book.dat",ios:
:
app|ios:
:
binary);
if(!
outfile)
{
cout<<"\t不能打开此文件,或此文件不存在!
"<return;
}
outfile.write((char*)&book_insert,sizeof(book_insert));
outfile.close();
tatoal++;
cout<"<}
voidShow()//图书浏览
{
Bookbook;
ifstreaminfile("Book.dat",ios:
:
in|ios:
:
binary);
if(!
infile)
{
cout<<"\t不能打开此文件,或此文件不存在!
"<return;
}
for(inti=0;i{
infile.read((char*)&book,sizeof(book));
book.show();
}
infile.close();
if(tatoal==0)cout<"<}
图书下架:
图书查询:
(只画按书名查询,其余两个雷同)
关键代码:
voidDelete()//图书下架
{
charname[20];
intm=0,i=0,j;
Bookbook[500];
ifstreaminfile("Book.dat",ios:
:
in|ios:
:
binary);
if(!
infile)
{cout<<"\t不能打开此文件,或此文件不存在!
"<for(i=0;i{
infile.read((char*)&book[i],sizeof(book[i]));
}
infile.close();
cout<<"输入要删除的书名:
"<cin>>name;
for(i=0;i{
if(strcmp(name,book[i].Getname())==0)
{
cout<<"您要删除的图书是不是?
(Y/N):
"<book[i].show();
charss;cin>>ss;
if(ss=='Y'||ss=='y')
{
j=i;
for(;jbook[j]=book[j+1];
cout<"<m=1;
tatoal--;
}
elsecontinue;
}
}
if(!
m)cout<<"馆中无此书!
"<ofstreamoutfile("Book.dat",ios:
:
out|ios:
:
binary);
if(!
outfile)
{cout<<"\t不能打开此文件,或此文件不存在!
"<for(i=0;ioutfile.write((char*)&book[i],sizeof(book[i]));
outfile.close();
}
voidSearch()//查询图书信息
{
intm=0,i,search_number,flag=1;//flag用于判断是否有此书
Bookbook[5000];
ifstreaminfile("Book.dat",ios:
:
out|ios:
:
in|ios:
:
binary);
if(!
infile)
{cout<<"\t不能打开此文件,或此文件不存在!
"<for(i=0;iinfile.read((char*)&book[i],sizeof(book[i]));
infile.close();
cout<<"\t1.\t2.\t3."<cout<<"\t按书名查询\t按书号查询\t按作者查询"<charchoce123,search_name[20],search_author[20];
cin>>choce123;
switch(choce123){
case'1':
{cout<<"请输入书名:
"<cin>>search_name;
for(i=0;iif(strcmp(search_name,book[i].Getname())==0)
{book[i].show();flag=0;}
break;
}
case'2':
{cout<<"请输入书号:
"<cin>>search_number;
for(i=0;iif(search_number==book[i].Getnumber())
{book[i].show();flag=0;break;}
break;
}
case'3':
{cout<<"请输入作者姓名:
"<cin>>search_author;
for(i=0;iif(strcmp(search_author,book[i].Getauthor())==0)
{book[i].show();flag=0;}
break;
}
default:
cout<<"\t您的输入有误!
"<}
if(flag)cout<<"\t图书馆中无此书!
"<}
备注:
读者信息管理模块与图书管理模块类似,此处省略。
读者信息管理源代码在“第四章程序源代码”中给出。
二、调试与运行结果
2.1.欢迎界面:
2.2.主菜单:
2.3.图书浏览:
2.4.新书上架:
2.5.图书下架:
2.6.图书查询:
(1)按书名查询:
(2)按书号查询:
(3)按作者查询:
2.7.读者信息管理:
(1)浏览读者信息:
(2)添加读者信息:
(3)修改读者信息:
(4)删除读者信息:
三、问题与总结
3.1实验中遇到的问题及解决方法
问题如下:
1.使用多分支选择语句switch()时,定义变量choice为int类型。
以至于当出现非法输入时,不能够做出正确的处理。
当把choice改成char类型后能实现对非法输入的处理;
2.编写程序之前没有对系统进行完整的需求分析,在完成部分功能模块后,出现了新的需求,以至于不得不修改已经写好了的部分代码;
3.部分变量命名仍不够规范,比如nam,应尽量用“名称_属性”形式进行命名,以加强程序的可读性,便于阅读;
4.进行多文件编程时,文件包含不能重复,重复后会在编译连接时出现错误;
5.对部分功能在整个工程比较费时,操作繁琐,不易观察出错误。
解决方法:
部分功能可以再另建立一个工程进行编写测试,修改完善后再放回到原工程中。
6.此程序中未能实现读者已借阅的书籍与存在的图书关联,有待改进,即存在以下缺陷:
reader对象的shu(书)属性可能不是“book.dat”中的数据。
7.程序尚不完美,并没有实现对所有的错误容错处理,但已经考虑到大部分可能出现的非法操作,并进行了程序修改。
今后会更加努力,循序渐进,争取做到完美。
3.2实验的体会与感想
经过这近一个星期的训练,使我对面向程序设计有了更深入的理解,对类的机制有了进一步的认识,能够较熟练地使用和构造类,编写构造函数、复制构造函数,以及析构函数及其派生类的构造及使用。
同时也发现了自己在编程时经常犯的一些错误。
编写功能函数之前,应将主函数编写完整,每写完一个功能模块,就应及时进行运行调试,及时检查错误,发现错误,修改错误。
3.3致谢
通过本次课题的设计,让我熟练的掌握了制作程序的一些流程及规划,更加熟悉了编写程序时的正规流程。
在此特别感谢各位老师的指导,有了老师们的支持,才会让我更加圆满的完成此次课题的设计。
四、程序源代码
#include//library..h文件
usingnamespacestd;
classBook
{
public:
Book();
Book(charnames[],intnum,charaut[],charchu[],inttime[3],doublepri);
~Book(){}
voidshow();
intGetnumber();
char*Getname();
char*Getauthor();
private:
charBook_name[30];
intBook_number;
charauthor[20];
charchubanshe[20];
intpublic_time[3];
doubleprice;
};
classReader
{
public:
Reader();
Reader(charname[20],intnumber,chardepart[20],charshukan1[],charshukan2[]);
~Reader(){}
intGetnumber();
char*GetReader_name();
voidShow_reader();
voidChangemasseage(charname[20],intnumber,chardepart[20],charshukan1[],charshukan2[]);
private:
charReader_name[20];
intReader_number;
chardepartment[20];
charshu[2][20];
};
#include"library.h"//library.cpp文件
#include
Book:
:
Book()
{
strcpy(Book_name,"未命名");
Book_number=0;
strcpy(author,"无名氏");
strcpy(chubanshe,"未知");
for(inti=0;i<3;i++)
public_time[i]=0;
price=0.0;
}
Book:
:
Book(charnames[],intnum,charaut[],charchu[],inttime[3],doublepri)
{
strcpy(Book_name,names);
Book_number=num;
strcpy(author,aut);
strcpy(chubanshe,chu);
for(inti=0;i<3;i++)
public_time[i]=time[i];
price=pri;
}
intBook:
:
Getnumber()
{
returnBook_number;
}
char*Book:
:
Getname()
{
returnBook_name;
}
char*Book:
:
Getauthor()
{
returnauthor;
}
voidBook:
:
show()
{
cout<<"书名:
"<"<"<<<"出版社:
"<"<"<<<":
"<"<}
Reader:
:
Reader()
{
strcpy(Reader_name,"无名氏");
Reader_number=0;
strcpy(department,"计算机系");
}
Reader:
:
Reader(charname[20],intnumber,chardepart[20],charshukan1[20],charshukan2[20])
{
strcpy(Reader_name,name);
Reader_number=number;
strcpy(department,depart);
strcpy(shu[0],shukan1);
strcpy(shu[1],shukan2);
}
intReader:
:
Getnumber()
{
returnReader_number;
}
char*Reader:
:
GetReader_name()
{
returnReader_name;
}
voidReader:
:
Show_reader()
{
cout<<"姓名:
编号:
院系:
已借书刊1:
已借书刊2:
"<cout<<""<}
voidReader:
:
Changemasseage(charname[20],intnumber,chardepart[20],charshukan1[],charshukan2[])
{
strcpy(Reader_name,name);
Reader_number=number;
strcpy(department,depart);
strcpy(shu[0],shukan1);
strcpy(shu[1],shukan2);
}
#include"library.h"//function.cpp文件
#include
usingnamespacestd;
staticinttatoal=0;
staticintreader_tatoal=0;
voidtongji()
{
Bookbook;Readerreader;//统计书的数目
ifstreaminfile1("Book.dat",ios:
:
in|ios:
:
binary);
if(!
infile1)
return;
while(!
infile1.eof())
{infile1.read((char*)&book,sizeof(book));
tatoal++;}
infile1.close();
tatoal--;//统计读者数目
ifstreaminfile2("Reader.dat",ios:
:
in|ios:
:
binary);
if(!
infile2)
return;
while(!
infile2.eof())
{infile2.read((char*)&reader,sizeof(reader));
reader_tatoal++;}
infile2