C++课程设计媒体库管理系统.docx
- 文档编号:8966182
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:20
- 大小:417.60KB
C++课程设计媒体库管理系统.docx
《C++课程设计媒体库管理系统.docx》由会员分享,可在线阅读,更多相关《C++课程设计媒体库管理系统.docx(20页珍藏版)》请在冰点文库上搜索。
题目3 “媒体库管理系统设计”
1、问题描述
图书馆中的资料很多,如果能分类对其资料流通进行管理,将会带来很多方便,因此需要有一个媒体库管理系统。
图书馆共有三大类物品资料:
图书、视频光盘、图画。
这三类物品共同具有的属性有:
编号、标题、作者、评级(未评级,一般,成人,儿童)等。
其中图书类增加出版社、ISBN号、页数等信息;视频光盘类增加出品者的名字、出品年份和视频时长等信息;图画类增加出品国籍、作品的长和宽(以厘米计,整数)等信息。
2、功能要求
(1)添加物品:
主要完成图书馆三类物品信息的添加,要求编号唯一。
当添加了重复的编号时,则提示数据添加重复并取消添加;当物品库已满,则提示不能再添加新的数据。
(2)查询物品
可按照三种方式来查询物品,分别为:
按标题查询:
输入标题,输出所查询的信息,若不存在该记录,则提示“该标题不存在!
”;按编号查询:
输入编号,输出所查询的信息,若不存在该记录,则提示“该编号不存在!
”;按类别查询:
输入类别,输出所查询的信息,若不存在记录,则提示“该类别没有物品!
”;
(3)显示物品库:
输出当前物品库中所有物品信息,每条记录占据一行。
(4)编辑物品:
可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
(5)删除物品:
主要完成图书馆物品信息的删除。
如果当前物品库为空,则提示“物品库为空!
”,并返回操作;否则,输入要删除的编号,根据编号删除该物品的记录,如果该编号不在物品库中,则提示“该编号不存在”。
(6)统计信息
输出当前物品库中总物品数,以及按物品类别,统计出当前物品中各类别的物品数并显示。
(7)物品存盘:
将当前程序中的物品信息存入文件中。
(8)读出物品:
从文件中将物品信息读入程序。
3、问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。
暨南大学本科实验报告专用纸
课程名称 C++程序设计 成绩评定
实验项目名称 媒体库管理系统 指导教师
实验项目编号 课程设计 实验项目类型设计实验地点
学生姓名 学号
学院 系 专业
实验时间2010年 月 日
1.程序设计目的
通过设计、实现一个媒体库管理系统,熟悉面向对象的设计思想;进一步熟悉、掌握STL中有关数据类型及其使用方法,泛型编程的风格。
STL是一种新的程序设计思想——泛型化设计,它是标准模版库,是一个具有工业强度的,高效的C++程序库。
从实现层次上看,整个STL是以一种类型参数化方式实现的
2.系统设计要求
在这个课程设计中,你需要设计并实现一个继承体系以管理图书馆中流通的物品:
图书、视频光盘以及图画。
你需要设计一个名为Medium(媒体)的基类以表示所有流通物品的公共属性;然后从Medium类派生出Book,Video(视频光盘),Painting(图画)三个派生类。
2.1基类描述
在这个应用中,每一个物品都有:
编号,标题,作者(标题和作者都可能包含空格),评级
(具体分为:
未评级、一般、成人和儿童四种类型),借出状态(可用,已借出)四个属性。
因此,基类Medium应具有这四个数据成员,其访问权限为受保护;此外,基类Medium还具有如下成员函数:
从标准输入流中读取物品信息的函数;从文件中读取物品信息的函数;输出信息到标准输出流的函数。
2.2继承类描述
Book类 相比基类,Book类增加了出版社的名字,ISBN号(可简单认为是一个由0-9,‘-
’,A-Z构成的字符串),出版年份和书的页数这四个数据成员。
Video类 相比基类,Video类增加了出品者的名字,出品年份和视频时长(以分钟计,整数)这三个数据成员。
Painting类 相比基类,Painting类增加了出品国籍,作品的长与宽(以厘米计,整数)这三个数据成员。
2.3MediaLib(多媒体函数库)类
2.3.1MediaLib类及menu(菜单类)成员函数
设计一个名为MediaLib的类,在其构造函数中从一个数据文件中读入信息,此数据文件的名字应该由用户提供而不是由程序员自己假设。
此类应具有如下方法:
增加新物品,删除物品,修改物品,显示整个媒体库中的物品,显示媒体库中的部分物品。
换言之,媒体库中所有物品
的信息存在于硬盘中的某个文件中,当一个MediaLib对象被创建时将该媒体库文件中的所有物品信息读入内存中。
在内存中,物品信息有可能被修改,在程序退出时所有物品信息又被写回至硬盘(这里所有物品信息被写回至硬盘只是功能上的描述;从效率着眼,仅仅写回发生了改变的信息的实现策略更好,但是需要考虑新增纪录、删除纪录、修改记录的处理,比较复杂,有兴趣的同学可以尝试这种策略)。
因为具有插入、删除功能,实现MediaLib 类的时候应该使用STL中的list类作为底层容器。
MediaLib类还具有一个名为menu的成员函数以显示如下功能表:
1.新增一个物品;
2.删除物品;
3.修改物品信息;
4.显示满足搜索条件的物品;
5.退出。
2.3.2menu成员函数
新增物品:
提示用户输入物品的相关信息,除标题外其余信息都有默认值。
删除物品:
利用下述搜索功能列出待删除的物品后将这些物品从媒体库中删除。
修改物品信息:
利用下述搜索功能列出待修改的物品后对这些物品的全部或部分进行修改。
显示满足搜索条件的物品:
譬如,显示所有的Book,按照作者名排序。
实现此功能时需要提供进一步的子功能菜单以便用户指定查询条件和排序依据。
查询时只针对一类物品
(Book,Video,Painting),且至多涉及该类别物品的两个属性;对于年份(出版年份、出品年份),书籍页数,视频时长和作品长度、宽度可以进行范围查询。
查询结果的排序依据可以是被查询的某类物品的任何属性,但用户最多只能按照重要性的不同指定两个排序依据;每个排序依据都有升序、降序之分。
注意:
在显示物品信息时必须比较合理,譬如适时地清空整个屏幕;假如信息超出一屏则显示必须暂停,待用户指示继续后再继续显示;输出的信息中应加上适当的空白以方便阅读。
退出:
当选择“退出”时,整个媒体库,包括已作的修改,必须写回到数据文件中。
输入说明:
在程序一开始提示用户输入数据文件的名字。
输入的具体格式参见提供的示例文件。
但教师在测试时会用一个很大的数据文件进行测试,因此不要对物品的数目做任何假定。
2.4界面要求
界面需要设计良好、便于使用但又不过分花哨!
3.系统功能模块图
3.1主要功能
●能够打开用户指定的文本文件,并将数据读入。
●对于文件中的物品信息,能提供一系列操作:
新增一个物品、删除物品、修改物品信息、显示满足搜索条件的物品。
●能够将用户操作完毕后的文件进行保存到指定文件名的文本文件中。
3.2系统功能模块图
4.程序实现思路
4.1分析系统中各个对象之间的相互关系及其属性和行为
4.1.1对象
◆识别系统中的对象
媒体库、BOOK、VIDEO、PAINTING
◆对象间的关系
整体—部分关系
4.1.2对象的属性媒体库属性:
※若干BOOK、VEDIO、PAINTING类型的物品
※多项关于以上物品的操作
BOOK、VEDIO、PAINTING类型的物品的属性:
※单个物品
※多项关于该种类物品的信息
4.1.3对象的行为
◆BOOK、VIDEO、AINTING类型的物品的行为
※相应类型物品的信息输入
※相应类型物品的信息输出
※物品信息从文件中\控制台读入
※物品信息输出到文件中\控制台
◆媒体库的行为
※打开一个文件读入其中的相关物品信息
※增加若干物品
※对其中的物品进行查找
※对其中的物品进行删除
※对其中的物品进行修改
※显示媒体库中所有物品信息
※退出媒体库并保存媒体库信息
4.2各类的描述
4.2.1程序模块图
4.2.2基类Medium
◆定义
classMedium{
friendclassMediaLib(多媒体函数库);friendclassMedia_info;
public:
Medium(){}Medium(std:
:
ifstream&);Medium(std:
:
istream);
virtualstd:
:
stringget_category(){return0;}//获得类型//virtual是用于修改方法或属性的声明
virtualstd:
:
stringget_title(){returntitle;}//获得标题virtualstd:
:
stringget_author(){returnauthor;}//获得作者
virtualstd:
:
stringget_rank(){returnrank;}//获得评级
virtualstd:
:
stringget_state(){returnstate;}//获得状态(是否在馆)
virtualstd:
:
stringget_press(){return0;}virtualstd:
:
stringget_ISBN(){return0;}virtualstd:
:
stringget_pub_year(){return0;}virtualstd:
:
stringget_pages(){return0;}virtualstd:
:
stringget_producer(){return0;}virtualstd:
:
stringget_pro_year(){return0;}
virtualstd:
:
stringget_vedio_duration(){return0;}virtualstd:
:
stringget_nationality(){return0;}virtualstd:
:
stringget_length(){return0;}
virtualstd:
:
stringget_width(){return0;}
virtualstd:
:
istream&read_infor(std:
:
istream&);//从标准输入流中读取物品信息virtualstd:
:
ifstream&read_infor(std:
:
ifstream&);//从文件中读取物品信息virtualstd:
:
ostream&put_out(std:
:
ostream&);//输出信息到标准输出流的函数virtualstd:
:
ofstream&put_out(std:
:
ofstream&);//输出信息到文件中
virtualMedium*clone()const{returnnewMedium(*this);}protected:
std:
:
stringtitle; //标题
std:
:
stringauthor;//作者std:
:
stringrank;//评级std:
:
stringstate;//状态
};
◆函数描述
该类开始定义三个构造函数其中有一默认构造函数,用来构造Medium型的数据结构;接着是15个get_XX()函数,用来获取成员信息;然后是4个操作函数,用来从文件\控制台输入输出数据;最后是clone()函数,用来创建一个新对象,并是这个对象包含的值是原先对象的值的副本(后文的类中的clone()函数功能一样)。
4.2.3BOOK、VIDEO、AINTING类(以BOOK类为例)
◆BOOK类定义
classBook:
publicMedium{public:
Book(){}
Book(std:
:
istream&is){read_infor(is);}Book(std:
:
ifstream&fin){read_infor(fin);}std:
:
stringget_category(){
std:
:
strings="BOOK";returns;
}
Book*clone()const{returnnewBook(*this);}std:
:
stringget_press(){returnpress;}std:
:
stringget_ISBN(){returnISBN;}std:
:
stringget_pub_year(){returnpub_year;}
std:
:
stringget_pages(){returnpages;}
std:
:
istream&read_infor(std:
:
istream&);
std:
:
ifstream&read_infor(std:
:
ifstream&);//从文件中读取物品信息的函数std:
:
ostream&put_out(std:
:
ostream&);
std:
:
ofstream&put_out(std:
:
ofstream&);//输出信息到文件中private:
std:
:
stringpress; //出版社std:
:
stringISBN; //ISBN号std:
:
stringpub_year; //出版年份std:
:
stringpages; //页数
};
◆函数描述
BOOK、VIDEO、PAINTING类均为Medium类的继承类,包含基类的所有成员。
较之基类中成员函数的定义,BOOK类中定义了三个构造函数,其中一个默认构造函数,然后是为了获取press、ISBN、pub_year、pages等私有成员数据的对应get_XX()函数,此外,还有4个读入输出函数。
std:
:
stringget_category(){std:
:
strings="BOOK";returns;}用来给出BOOK类型数据类型,使得用户能够访问到。
由于在输入时通过
std:
:
istream& Media_info:
:
read(std:
:
istream&is)
Media_info类中的用于数据读入的成员函数,在读入数据时对物品的类型进行判断,因而在把数据读入到对应的BOOK、VIDEO、PAINTING类型中时,并没有将相应的类型读入并存储,所以,在定义这三个类时,需要一个get_category()另行给出类型。
除了类的构造函数,应该将其他成员函数定义为vitual函数,使得函数调用时,能够调用到正确的函数。
std:
:
ifstream&Book:
:
read_infor(std:
:
ifstream&fin){Medium:
:
read_infor(fin);
getline(fin,press);getline(fin,ISBN);getline(fin,pub_year);getline(fin,pages);returnfin;}
该函数用来读取BOOK类型的数据。
其中Medium:
:
read_infor(fin)为Medium类中的读入函数,用来读入物品的公共成员。
std:
:
ostream&Book:
:
put_out(std:
:
ostream&os){Medium:
:
put_out(os);
os< 该函数用来输出BOOK类型的数据。 其中Medium: : put_out(os)为Medium类中的输出函数,输出物品的公共成员。 4.2.3Media_info类 classMedia_info{ friendclassMediaLib;public: Media_info(): cp(0){}Media_info(std: : istream&is): cp(0){read(is);} Media_info(std: : ifstream&fin): cp(0){read(fin);}Media_info(constMedia_info&); Media_info&operator=(constMedia_info&); ~Media_info(){deletecp;} //操作 std: : istream&read(std: : istream&);std: : ifstream&read(std: : ifstream&);std: : ostream&put_out(std: : ostream&os){ if(cp)returncp->put_out(os); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : ofstream&put_out(std: : ofstream&of){ if(cp)returncp->put_out(of); elsethrowstd: : runtime_error("uninitializedlibrary-data");} std: : stringcategory(){ //获得类型if(cp)returncp->get_category(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringtitle(){ //获得标题 if(cp)returncp->get_title(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringauthor(){ //获得作者 if(cp)returncp->get_author(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringrank(){//获得评级 if(cp)returncp->get_rank(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringstate(){//获得状态(是否在馆 if(cp)returncp->get_state(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringpress(){ if(cp)returncp->get_press(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringISBN(){ if(cp)returncp->get_ISBN(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringpub_year(){ if(cp)returncp->get_pub_year(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringpages(){ if(cp)returncp->get_pages(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringproducer(){ if(cp)returncp->get_producer(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringpro_year(){ if(cp)returncp->get_pro_year(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringvedio_duration(){ if(cp)returncp->get_vedio_duration(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringnationality(){ if(cp)returncp->get_nationality(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringlength(){ if(cp)returncp->get_length(); elsethrowstd: : runtime_error("uninitializedlibrary-data");}std: : stringwidth(){ if(cp)returncp->get_width(); elsethrowstd: : runtime_error("uninitializedlibrary-data");} private: Medium*cp; }; ◆函数描述 Media_info类为一句柄类,含有一个私有成员Medium*cp,cp可以指向任意一个 以Medium类为基类的继承类的数据类型。 该类含有4个构造函数,一Media_info&operator=()函数,一虚析构函数,接下来为4个读入输出函数,最后为15个get_XX()函数。 std: : ifstream&Media_info: : read(std: : ifstream&fin){cp=0; //如果cp已有指向,先删除已有的指向std: : stringstr="";getline(fin,str); //得到记录的类型if(str=="BOOK") {cp=newBook;cp->read_infor(fin); }elseif(str=="VIDEO"){cp=newVedio;cp- >read_infor(fin);}elseif(str=="PAINTING"){cp=newPainting;cp- >read_infor(fin);}getline(fin,str); returnfin;} 该函数用来读入物品信息,通过一Medium型指针,经过物品类型判断,创建对应的 BOOK、VIDEO、PAINTING类型,然后将
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 媒体库 管理 系统