资源描述
C++面向对象程序设计
课 程 设 计 报 告
课程名称 C++面向对象程序设计
课题名称 媒体库管理系统
专 业 计算机科学与技术
班 级 1120542
学 号 38
姓 名 周 晗
指导教师 韩燕丽
2012年 12 月 28 日
(一)、课程设计题目:
媒体库管理系统
(二)、目的与要求:
1、目的:
(1)要求学生达到熟练掌握C++语言的基本知识和技能;
(2)基本掌握面向对象程序设计的基本思路和方法;
(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
(2)要求在设计的过程中,建立清晰的类层次;
(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;
(4)在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
(三)、设计方法和基本原理:
功能要求:
1) 添加物品
程序主要完成图书馆三类物品信息的添加,要求编号唯一。如果添加了重复编号的物品时,则提示用户数据添加重复并取消添加;如果物品库已满,则提示不能再添加新的物品。
2) 查询物品
可按照三种方式进行物品的查询。
·按标题查询:
·按编号查询:
·按类别查询:
如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
3) 显示物品库
可显示当前物品库中所有的物品信息。
4) 修改物品
可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
5)删除物品
对已添加的物品信息进行删除。如果当前物品库为空,则提示“物品库为空!”并返回操作;否则输入要删除的编号,根据编号删除该物品信息,如果没有找到该物品信息,则提示“该编号不存在”。
6)统计功能
输出当前物品库中总物品数,以及按物品类别,统计出当前物品中各类别的物品数并显示。
7) 保存物品
将当前系统中物品信息存入文件中。
8) 读取物品
将保存在文件中的物品信息读入到当前系统中,以供用户使用。
在完成以上基本功能的基础上,可自行进行扩展或完善。
目 录
1. 系统需求分析 1
2. 总体设计 3
3. 详细设计及实现 5
3.1 Base类(抽象类)的实现 5
3.2 图书类的实现 5
3.3 视频类的实现 7
3.4图画类的实现 10
3.5main.cpp 13
4. 系统调试 20
5. 结论 21
6. 心得体会 21
7. 参考书目 22
1. 系统需求分析
1.1系统设计的目的与意义:
图书馆中的资料很多,如果能分类对其资料流通进行管理,将会带来很多方便,因此需要有一个媒体库管理系统。
1.2 系统功能需求:
图书馆共有三大类物品资料:图书、视频光盘、图画。
1)添加物品
程序主要完成图书馆三类物品信息的添加,要求编号唯一。如果添加了重复编号的物品时,则提示用户数据添加重复并取消添加;如果物品库已满,则提示不能再添加新的物品。
2) 查询物品
可按照三种方式进行物品的查询。
·按标题查询:
·按编号查询:
·按类别查询:
如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
3) 显示物品库
可显示当前物品库中所有的物品信息。
4) 修改物品
可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
5)删除物品
对已添加的物品信息进行删除。如果当前物品库为空,则提示“物品库为空!”并返回操作;否则输入要删除的编号,根据编号删除该物品信息,如果没有找到该物品信息,则提示“该编号不存在”。
6)统计功能
输出当前物品库中总物品数,以及按物品类别,统计出当前物品中各类别的物品数并显示。
7) 保存物品
将当前系统中物品信息存入文件中。
8) 读取物品
将保存在文件中的物品信息读入到当前系统中,以供用户使用。
在完成以上基本功能的基础上,可自行进行扩展或完善。
2. 总体设计
2.1 系统功能分析:
系统通过调用函数来实现信息录入、信息修改、信息删除、信息查询以及数据保存文件等功能。add()函数用于录入信息;modify()函数用来修改信息;del()函数用来修改信息;searchStu()及searchScore()函数用来查询某班级中所有学生信息及查询某学生所有课程的成绩信息;read()函数用于将文件中的数据读取到内存中;save()函数用于将内存中的信息存入文件内;主函数main()用于调用这些函数。
2.2系统功能模块划分与设计:
系统定义了Class类、Student类、Course类、Score类这四个类,定义了add()、modify()、del()、read()及save()等函数来实现系统所需功能。
媒体库管理系统
2.3 系统功能模块图:
图画信息管理
视频信息管理
图书信息管理
图书信息读取
图书信息添加
图书信息修改
图书信息删除
图书信息保存
图画信息修改
视频信息读取
视频信息读取
视频信息读取
视频信息读取
视频信息读取
图画信息保存
图画信息删除
图画信息添加
图画信息读取
2.4 类的设计
(1)Base类(抽象类)的设计:
Base
virtual void read()=0;
virtual void add()=0;
virtual void modify(int)=0;
virtual void del(int)=0;
virtual void save()=0;
char number[20]; //编号
char title[11]; //标题
char writer[8]; //作者
char grade [20]; //评级
图 3.1 Base类
(2)图书类的设计:
Book
int ISBNno; //ISBN号
char press[9]; //出版社
int page; //页数
void read();
void add();
void modify(int);
void del(int);
void save();
图 3.2图书类
(3)视频类的设计:
Video
char name; //出品人姓名
char time; //出品年份
int duration; //视频时长void read();
void add();
void modify(int);
void del(int);
void save();
图 3.3视频类
(4)图画类的设计:
Painting
char nationality[20]; //国籍
char size[20]; //作品大小
void read();
void add();
void modify(int);
void del(int);
void save();
图 3.4 图画类
3. 详细设计及实现
3.1 Base类(抽象类)的实现
class Base
{
public:
char number[20]; //编号
char title[11]; //标题
char writer[8]; //作者
char grade [20]; //评级
virtual void read()=0;
virtual void add()=0;
virtual void modify(int)=0;
virtual void del(int)=0;
virtual void save()=0;
};
3.2 图书类的实现
Book.h
class Book:public Base
{
public:
char number[20]; //编号
char title[11]; //标题
char writer[8]; //作者
char grade [20]; //评级
int ISBNno; //ISBN号
char press[9]; //出版社
int page; //页数
void read();
void add();
void modify(int);
void del(int);
void save();
};
Book.cpp
void Book::read()
{
fstream bookfile("图书类信息.dat",ios::in|ios::out);
bookfile>>b1[count_Book].number>>b1[count_Book].title>>b1[count_Book].writer>>b1[count_Book].grade>>b1[count_Book].ISBNno>>b1[count_Book].press>>b1[count_Book].page;
while(!bookfile.eof())
{
count_Book++; bookfile>>b1[count_Book].number>>b1[count_Book].title>>b1[count_Book].writer>>b1[count_Book].grade>>b1[count_Book].ISBNno>>b1[count_Book].press>>b1[count_Book].page;
}
bookfile.close();
}
void Book::add()
{ //存入对象数组中
strcpy(b1[count_Book].number,number);
strcpy(b1[count_Book].title,title);
strcpy(b1[count_Book].writer,writer);
strcpy(b1[count_Book].grade,grade);
b1[count_Book].ISBNno=ISBNno;
strcpy(b1[count_Book].press,press);
b1[count_Book].page=page;
count_Book++;
}
void Book::modify(int index)
{
strcpy(b1[index-1].number,number);
strcpy(b1[index-1].title,title);
strcpy(b1[index-1].writer,writer);
strcpy(b1[index-1].grade,grade);
b1[index-1].ISBNno=ISBNno;
strcpy(b1[index-1].press,press);
b1[index-1].page=page;
}
void Book::del(int index){
//前移其后记录
for(int i=index;i<=count_Book-1;i++)
{
strcpy(b1[i-1].number,b1[i].number);
strcpy(b1[i-1].title,b1[i].title);
strcpy(b1[i-1].writer,b1[i].writer);
strcpy(b1[i-1].grade,b1[i].grade);
b1[i-1].ISBNno=b1[i].ISBNno;
strcpy(b1[i-1].press,b1[i].press);
b1[i-1].page=b1[i].page;
}
count_Book--;
}
void Book::save()
{
ofstream bookfile;
bookfile.open("图书类信息.dat");
for(int i=0;i<=count_Book-1;i++)
bookfile<<b1[i].number<<" "<<b1[i].title<<" "<<b1[i].writer<<" "<<b1[i].grade<<b1[i].ISBNno<<" "<<b1[i].press<<" "<<b1[i].page<<endl;
bookfile.close(); }
3.3 视频类的实现
Video.h
class Video:public Base
{
public:
char number[20]; //编号
char title[11]; //标题
char writer[8]; //作者
char grade [20]; //评级
char name; //出品人姓名
char time; //出品年份
int duration; //视频时长
void read();
void add();
void modify(int);
void del(int);
void save();
};
Video.cpp
void Video::read()
{
fstream videofile("班级信息.dat",ios::in|ios::out);
videofile>>v1[count_Video].number>>v1[count_Video].title>>v1[count_Video].writer>>v1[count_Video].grade>>v1[count_Video].name>>v1[count_Video].time>>v1[count_Video].duration;
while(!videofile.eof())
{
count_Video++; videofile>>v1[count_Video].number>>v1[count_Video].title>>v1[count_Video].writer>>v1[count_Video].grade>>v1[count_Video].name>>v1[count_Video].time>>v1[count_Video].duration;
}
videofile.close();
}
void Video::add()
{ //存入对象数组中
strcpy(v1[count_Video].number,number);
strcpy(v1[count_Video].title,title);
strcpy(v1[count_Video].writer,writer);
strcpy(v1[count_Video].grade,grade);
strcpy(v1[count_Video].name,name);
strcpy(v1[count_Video].time,time);
v1[count_Video].duration=duration; count_Video++;
}
void Video::modify(int index)
{
strcpy(v1[index-1].number,number);
strcpy(v1[index-1].title,title);
strcpy(v1[index-1].writer,writer);
strcpy(v1[index-1].grade,grade);
strcpy(v1[index-1].name,name);
strcpy(v1[index-1].time,time);
v1[index-1].duration=duration;
}
void Video::del(int index)
{
//前移其后记录
for(int i=index;i<=count_Video-1;i++)
{
strcpy(v1[i-1].number,v1[i].number);
strcpy(v1[i-1].title,v1[i].title);
strcpy(v1[i-1].writer,v1[i].writer);
strcpy(v1[i-1].grade,v1[i].grade);
strcpy(v1[i-1].name,v1[i].name);
strcpy(v1[i-1].time,v1[i].time);
v1[i-1].duration=v1[i].duration;
}
count_Video--;
}
void Video::save()
{
ofstream videofile;
videofile.open("班级信息.dat");
for(int i=0;i<=count_Video-1;i++)
videofile<<c1[i].classID<<" "<<c1[i].stuNum<<endl;
videofile.close();
}
3.4图画类的实现
Painting.h
class Painting:public Base
{
public:
char number[20]; //编号
char title[11]; //标题
char writer[8]; //作者
char grade [20]; //评级
char nationality[20]; //出品国籍
char size[20]; //作品大小
void read();
void add();
void modify(int);
void del(int);
void save();
};
Painting.cpp
void Painting::read()
{
fstream paitingfile("图画类信息.dat",ios::in|ios::out);
paintingfile>>p1[count_Painting].number>>p1[count_Painting].title>>p1[count_Painting].writer>>p1[count_Painting].grade>>p1[count_Painting].nationality>>p1[count_Painting].size;
while(!paintingfile.eof())
{
count_Painting++;
paintingfile>>p1[count_Painting].number>>p1[count_Painting].title>>p1[count_Painting].writer>>p1[count_Painting].grade>>p1[count_Painting].nationality>>p1[count_Painting].size;
}
paintingfile.close();
}
void Painting::add()
{
//存入对象数组中
strcpy(p1[count_Painting].number,number);
strcpy(p1[count_Painting].title,title);
strcpy(p1[count_Painting].writer,writer);
strcpy(p1[count_Painting].grade,grade);
strcpy(p1[count_Painting].nationality,nationality);
strcpy(p1[count_Painting].size,size);
count_Painting++;
}
void Painting::modify(int index)
{
strcpy(p1[index-1].number,number);
strcpy(p1[index-1].title,title);
strcpy(p1[index-1].writer,writer);
strcpy(p1[index-1].grade,grade);
strcpy(p1[index-1].nationality,nationality);
strcpy(p1[index-1].size,size);
}
void Painting::del(int index)
{
//前移其后记录
for(int i=index;i<=count_Class-1;i++)
{
strcpy(p1[i-1].number,p1[i].number);
strcpy(p1[i-1].title,p1[i].title);
strcpy(p1[i-1].writer,p1[i].writer);
strcpy(p1[i-1].grade,p1[i].grade);
strcpy(p1[i-1].nationality,p1[i].nationality);
strcpy(p1[i-1].size,p1[i].size);
}
count_Painting--;
}
void Painting::save()
{
ofstream Paintingfile;
Paintingfile.open("班级信息.dat");
for(int i=0;i<=count_Painting-1;i++)
Paintingfile<<p1[i].number<<" "<<p1[i].title<<" "<<p1[i].writer<<" "<<p1[i].grade<<p1[i].nationality<<" "<<p1[i].size<<endl;
Paintingfile.close();
}
3.5main.cpp
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
#include "Base.h"
#include "Book.h"
#include "Painting.h"
#include "Video.h"
const int MAXBOOK=10;
const int MAXPAINTING=200;
const int MAXVIDEO=10;
Book b1[MAXBOOK];
Painting p1[MAXPAINTING];
Video c2[MAXVIDEO];
int count_Book=0;
int count_Painting=0;
int count_Video=0;
Base *p=NULL;
char out;
//图书类管理子菜单
void book_manage()
{
int choice,i=0;
bool quit=false;
while(1)
{
system("cls");
cout<<"**********图书类管理子菜单**********"<<endl;
cout<<" 1.添加图书信息"<<endl;
cout<<" 2.修改图书信息"<<endl;
cout<<" 3.删除图书信息"<<endl;
cout<<" 0.退出"<<endl;
cout<<"************************************"<<endl;
cout<<"请输入所要操作的编号:";
cin>>choice;
switch(choice)
{
case 1:
{
Book b2;
p=&b2;
cout<<"请输入编号、标题、作者、评级、ISBN号、出版社和页
数:\n";
cin>>>b2.number>>b2.title>>b2.writer>>b2.grade>>b2.ISBNno>>
b2.press>>b2.page>>endl;
cout<<"是否保存图书信息?(y/n)\n";
cin>>out;
if(out=='y')
{
p->add();
p->save();
}
break;
}
case 2:
{
Book b3;
p=&b3;
int index;
for(int i=0;i<count_Book;i++)
cout<<i+1<<"."<<b1[i].number<<" "<<b1[i].title<<" "<<b1[i].writer<<b1[i].grade<<" "<<b1[i].ISBNno<<" "<<b1[i].press<<" "<<<<b1[i].page<<endl;
cout<<"请选择图书信息编号:\n";
cin>>index;
cout<<"请输入要修改的标题、作者、评级、ISBN号、出版社和页
数: ";
cin>>b3.title>>b3.writer>>b3.grade>>b3.ISBNno>>b3.press>>b3.page;
cout<<"是否保存班级信息?(y/n)\n";
cin>>out;
if(out=='y')
{
p->modify(index);
p->save();
}
break;
}
case 3:
{
Class b4;
p=&b4;
int index;
for(int i=0;i<count_Book;i++)
cout<<i+1<<"."<<b1[i].number<<" "<<b1[i].title<<" "<<b1[i].writer<<b1[i].grade<<" "<<b1[i].ISBNno<<" "<<b1[i].press<<" "<<b1[i].page<<endl;
cout<<"请选择要删除的图书编号:\n";
cin>>index;
cout<<"是否保存图书信息?(y/n)\n";
cin>>out;
if(out=='y')
{
p->del(index);
p->save();
}
break;
}
case 0:quit=true;break;
default:cout<<"请输入0~3之间的数字!"<<endl; break;
}
if(quit==true)
break;
}
system("cls");
return;
}
//视频类管理子菜单
void video_manage()
{
int choice;
bool quit=false;
while(1)
{
system("cls");
cout<<"**********视频类管理子菜单**********"<<endl;
cout<<" 1.添加视频信息"<<endl;
cout<<" 2.修改视频信息"<<endl;
cout<<" 3.删除视频信息"<<endl;
cout<<" 0.退出"<<endl;
cout<<"************************************"<<endl;
cout<<"请输入所要操作的编号:";
cin>>choice;
switch(choice)
{
case 1:
{
Video v2;
p=&v2;
cout<<"请输入编号、标题、作者、评级、出品人的姓名、出品年份和视
频时长:\n";
cin>>>v2.number>>v2.title>>v2.writer>>v2.grade>>v2.name>>v2.time>>
v2.duration>>endl;
cout<<"是否保存视频信息?(y/n)\n";
cin>>out;
if(out=='y')
{
p->add();
p->save();
}
break;
}
case 2:
{
Video v3;
p=&v3;
int index;
for(int i=0;i<count_Video;i++)
cout<<i+1<<"."<<v3[i].number<<" "<<v3[i].title<<" "<<v3[i].writer<<v3[i].grade<<" "<<v3[i].name<<" "<<v3[i].time<<" "<<<<v3[i].duration<<endl;
cout<<"请选择要修改的学生信息序号:\n";
cin>>index;
cout<<"请输入要修改编号、标题、作者、评级、出品人的姓名、出品年份 和视频时长:\n";
cin>>s4.stuID>>s4.name>>s4.sex>>s4.major>>s4.college>>s4.c.classID;
cout<<"是否保存视频信息?(y/n)\n";
cin>>out;
if(out=='y')
{
p->modify(index);
p->save();
}
break;
}
case 3:
{
Video v4;
p=&v4;
int index;
for(int i=0;i<count_Video;i++)
cout<<i+1<<"."<<v4[i].number<<" "<<v4[i].title<<" "<<v4[i].writer<<v4[i].grade<<" "<<v4[i].name<<" "<<v4[i].time<<" "<<v4[i].duration<<endl;
cout<<"请选择要删除的视频信息序号:\n";
cin>>index;
cout<<"是否保存视频信息?(y/n)\n";
cin>>out;
if(out=='y')
{
p->del(index);
p->save();
}
break;
}
case 0:quit=true;break;
default:cout<<"请输入0~3之间的数字!"<<endl;break;
}
if(quit==true)
break;
}
system("cls");
return;
}
//图画类管理子菜单
void painting_manage()
{
int choice;
bool quit=false;
while(1)
{
system("cls");
cout<<"**********图画类管理子菜单**********"<<endl;
cout<<" 1.添加图画信息"<<endl;
cout<<"
展开阅读全文