媒体库管理系统设计(C++)含模板
一、实验目的 图书馆中的资料很多,如果能分类对其资料流通进行管理,将会带来很多方便,因此需要有一个媒体库管理系统。 图书馆共有三大类物品资料:图书、视频光盘、图画。 这三类物品共同具有的属性有:编号、标题、作者、评级(未评级,一般,成人,儿童)等。其中图书类增加出版社、ISBN号、页数等信息;视频光盘类增加出品者的名字、出品年份和视频时长等信息;图画类增加出品国籍、作品的长和宽(以厘米计,整数)等信息。 二、实验内容 (1)添加物品:主要完成图书馆三类物品信息的添加,要求编号唯一。当添加了重复的编号时,则提示数据添加重复并取消添加;当物品库已满,则提示不能再添加新的数据。 (2)查询物品 可按照三种方式来查询物品,分别为: 按标题查询:输入标题,输出所查询的信息,若不存在该记录,则提示“该标题不存在!”; 按编号查询:输入编号,输出所查询的信息,若不存在该记录,则提示“该编号不存在!”; 按类别查询:输入类别,输出所查询的信息,若不存在记录,则提示“该类别没有物品!”; (3)显示物品库:输出当前物品库中所有物品信息,每条记录占据一行。 (4)编辑物品:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。 (5)删除物品:主要完成图书馆物品信息的删除。如果当前物品库为空,则提示“物品库为空!”,并返回操作;否则,输入要删除的编号,根据编号删除该物品的记录,如果该编号不在物品库中,则提示“该编号不存在”。 (6)统计信息 输出当前物品库中总物品数,以及按物品类别,统计出当前物品中各类别的物品数并显示。 (7)物品存盘:将当前程序中的物品信息存入文件中。 (8)读出物品:从文件中将物品信息读入程序。
为实现物品存盘和读出物品功能需要在文件夹中建立相应文档,在文档中输入初始物品信息,格式由代码设定决定,这样才能从文档中读取数据。
以下分别为视频,图画,图书文件    图画未设置内容,不做展示
程序效果展示 按提示输入1,进行添加物品操作,选择添加到哪类物品,输入编号,若编号重复则重新输入,根据提示输入对应内容,添加成功。 
根据提示输入2进行查询操作,选择编号查询方式,若无该编号则重新输入,若有该编号则输出对应信息。

根据提示输入3进行输出所有信息操作,输出所有信息。 
按照提示输入4进行编辑物品操作,选择编辑全部,先输入编号,若不重复则按要求输入信息,编辑成功返回菜单界面。 
按提示输入5进行输出物品操作,输入要删除的物品编号,若有该编号物品,删除成功,返回菜单界面。 
按提示输入6,进行统计物品操作,显示各个类别有多少物品。

代码
#include <iostream>
#include <cstring>
#include <fstream>
#include <sstream>
#include <cstdlib>
using namespace std;
#define Max 120
class Thing
{
protected:
int num;
string title;
string author;
string grade;
public:
Thing()
{
}
Thing(string N,string T,string A,string G)
{
int i;
istringstream is(N);
is>>num;
title=T;
author=A;
grade=G;
}
int get_num()
{
return num;
}
string get_title()
{
return title;
}
};
class Tushu:public Thing
{
private:
string press;
string ISBN;
int ynum;
public:
Tushu()
{
}
Tushu(string N,string T,string A,string G,string p,string i,string y):Thing(N,T,A,G)
{
press=p;
ISBN=i;
istringstream is(y);
is >> ynum;
}
void show_wenjian(fstream &a)
{
a<<num<<" "<<title<<" "<<author<<" "<<grade<<" "<<press<<" "<<ISBN<<" "<<ynum<<endl;
}
void show_al()
{
cout<<num<<" "<<title<<" "<<author<<" "<<grade<<" "<<press<<" "<<ISBN<<" "<<ynum<<endl;
}
void BIanji(int n,string x)
{
int m,y;
string q,p,e,f,g;
if(n==1)
{
istringstream is(x);
is >> m;
num=m;
}else if(n==2)
{
title=x;
}else if(n==3)
{
author=x;
}else if(n==4)
{
grade=x;
}else if(n==5)
{
press=x;
}else if(n==6)
{
ISBN=x;
}else if(n==7)
{
istringstream is(x);
is >> ynum;
}else
{
cin>>q>>e>>f>>g>>p>>m;
istringstream is(x);
is >> y;
num=y;
title=q;
author=e;
grade=f;
press=g;
ISBN=p;
ynum=m;
}
}
};
class Shipin:public Thing
{
private:
string name;
string year;
int hour;
public:
Shipin()
{
}
Shipin(string N,string T,string A,string G,string n,string y,string h):Thing(N,T,A,G)
{
name=n;
year=y;
istringstream is(h);
is >> hour;
}
void show_wenjian(fstream &a)
{
a<<num<<" "<<title<<" "<<author<<" "<<grade<<" "<<name<<" "<<year<<" "<<hour<<endl;
}
void show_al()
{
cout<<num<<" "<<title<<" "<<author<<" "<<grade<<" "<<name<<" "<<year<<" "<<hour<<endl;
}
void BIanji(int n,string x)
{
int o,m;
string p,q,e,f,g;
if(n==1)
{
istringstream is(x);
is >> o;
num=o;
}else if(n==2)
{
title=x;
}else if(n==3)
{
author=x;
}else if(n==4)
{
grade=x;
}else if(n==5)
{
name=x;
}else if(n==6)
{
year=x;
}else if(n==7)
{
istringstream is(x);
is >> hour;
}else
{
cin>>q>>e>>f>>g>>p>>m;
istringstream is(x);
is >> o;
num=o;
title=q;
author=e;
grade=f;
name=g;
year=p;
hour=m;
}
}
};
class Tuhua:public Thing
{
private:
string nationality;
int length;
int wide;
public:
Tuhua()
{
}
Tuhua(string N,string T,string A,string G,string n,string l,string w):Thing(N,T,A,G)
{
nationality=n;
istringstream is(l);
is >> length;
istringstream iis(w);
iis >> wide;
}
void show_wenjian(fstream &a)
{
a<<num<<" "<<title<<" "<<author<<" "<<grade<<" "<<nationality<<" "<<length<<" "<<wide<<endl;
}
void show_al()
{
cout<<num<<" "<<title<<" "<<author<<" "<<grade<<" "<<nationality<<" "<<length<<" "<<wide<<endl;
}
void BIanji(int b)
{
string m;
int n;
if(b==2)
{
cout<<"输入要编辑的标题: ";
cin>>m;
title=m;
}else if(b==3)
{
cout<<"输入要编辑的作者: ";
cin>>m;
author=m;
}else if(b==4)
{
cout<<"输入要编辑的评级: ";
cin>>m;
grade=m;
}else if(b==5)
{
cout<<"输入要编辑的国籍: ";
cin>>m;
nationality=m;
}else if(b==6)
{
cout<<"输入要编辑的作品长度: ";
cin>>n;
length=n;
}else if(b==7)
{
cout<<"输入要编辑的作品宽度: ";
cin>>n;
wide=n;
}else{
num=b;
}
}
void BIanji(int n,string x)
{
int p,m,y;
string q,e,f,g;
if(n==1)
{
istringstream is(x);
is >> p;
num=p;
}else if(n==2)
{
title=x;
}else if(n==3)
{
author=x;
}else if(n==4)
{
grade=x;
}else if(n==5)
{
nationality=x;
}else if(n==6)
{
istringstream is(x);
is >> length;
}else if(n==7)
{
istringstream is(x);
is >> wide;
}else
{
cin>>q>>e>>f>>g>>p>>m;
istringstream is(x);
is >> y;
num=y;
title=q;
author=e;
grade=f;
nationality=g;
length=p;
wide=m;
}
}
};
template<class T>
class FileOperation
{
public:
T a[Max];
int n;
fstream myfile;
char filename[40];
public:
FileOperation(char *fname)
{
n=0;
strcpy(filename,fname);
}
void read()
{
myfile.open(filename,ios::in);
string temp2,temp3,temp4,temp5,temp6,temp7,temp8;
if(!myfile.is_open())
cout<<"Open error!"<<endl;
while(!myfile.eof())
{
myfile>>temp2>>temp3>>temp4>>temp5>>temp6>>temp7>>temp8;
if(!temp2.empty()&&!temp3.empty()&&!temp4.empty()&&!temp5.empty()&&!temp6.empty()&&!temp7.empty()&&!temp8.empty())
{
a[n]=T(temp2,temp3,temp4,temp5,temp6,temp7,temp8);
n++;
}
myfile.get();
if(myfile.peek() == '\n') break;
}
myfile.close();
}
void wenjiangx()
{
myfile.open(filename,ios::out);
for(int i=0;i<n;i++)
{
a[i].show_wenjian(myfile);
}
myfile.close();
}
void Tianjia(string N,string t,string A,string G,string Nu,string l,string w)
{
a[n++]=T(N,t,A,G,Nu,l,w);
wenjiangx();
}
int Chachong(int x)
{
for(int i=0;i<n;i++)
{
if(a[i].get_num()==x) return 0;
}
return 1;
}
int Chaxun(int x,string y)
{
int i,g=0,o;
if(x==1)
{
for(i=0;i<n;i++)
{
if(a[i].get_title()==y)
{
Show(i);
g=1;
}
}
}else
{
for(i=0;i<n;i++)
{
istringstream is(y);
is>>o;
if(a[i].get_num()==o)
{
Show(i);
g=1;
}
}
}
return g;
}
int Cha(int x,string y)
{
int i,o;
if(x==1)
{
for(i=0;i<n;i++)
{
if(a[i].get_title()==y)
return i;
}
return -1;
}else
{
for(i=0;i<n;i++)
{
istringstream is(y);
is>>o;
if(a[i].get_num()==o)
{
return i;
}
}
return -1;
}
}
void Show(int i)
{
a[i].show_al();
}
void Show_all()
{
int o=0;
for(int i=0;i<n;i++)
{
Show(i);
o=1;
}
if(o==0)
cout<<"该类中无物品!"<<endl;
}
void deletel(int x)
{
for(int i=x;i<n;i++)
{
a[i]=a[i+1];
}
n--;
wenjiangx();
}
void Bianji(int i,int b,string x)
{
a[i].BIanji(b,x);
wenjiangx();
}
};
class manage
{
private:
FileOperation<Tushu> s1;
FileOperation<Shipin> s2;
FileOperation<Tuhua> s3;
public:
manage(char Fname1[],char Fname2[],char Fname3[]):s1(Fname1),s2(Fname2),s3(Fname3)
{
s1.read();
s2.read();
s3.read();
}
void tianjia_menu()
{
while(1)
{
int x;
cout<<" 选择添加到哪类物品 "<<endl<<endl;
cout<<" 1、图书类 "<<endl;
cout<<" 2、视频类 "<<endl;
cout<<" 3、图画类 "<<endl;
cout<<" 4、返回菜单界面 "<<endl;
cout<<" 5、退出系统 "<<endl;
cin>>x;
switch(x)
{
case 1:
tianjia(1);
break;
case 2:
tianjia(2);
break;
case 3:
tianjia(3);
break;
case 4:
menu();
break;
case 5:
exit(0);
break;
default:
cout<<"请输入正确的数字:"<<endl;
}
}
}
void tianjia(int i)
{
string a,b,c,d,e,f,g;
while(1)
{
cout<<"输入编号:";
cin>>a;
if(chachong(a))
{
if(i==1)
{
cout<<"请输入标题、作者、评级、出版社、ISBN号、页数(用空格隔开):"<<endl;
cin>>b>>c>>d>>e>>f>>g;
s1.Tianjia(a,b,c,d,e,f,g);
}else if(i==2)
{
cout<<"请输入标题、作者、评级、出品者名字、出品年份、视频时长(用空格隔开):"<<endl;
cin>>b>>c>>d>>e>>f>>g;
s2.Tianjia(a,b,c,d,e,f,g);
}else
{
cout<<"请输入标题、作者、评级、出品国籍、作品长度、作品宽度(用空格隔开):"<<endl;
cin>>b>>c>>d>>e>>f>>g;
s3.Tianjia(a,b,c,d,e,f,g);
}
cout<<endl<<"添加成功,即将回到菜单界面..."<<endl<<endl;
menu();
}else
cout<<"该编号重复,请重新输入.."<<endl;
}
}
int chachong(string a)
{
int b;
istringstream is(a);
is >> b;
if(s1.Chachong(b)&&s2.Chachong(b)&&s3.Chachong(b))
return 1;
return 0;
}
void chaxun_menu()
{
while(1)
{
int x;
cout<<" 选择查询方式 "<<endl<<endl;
cout<<" 1、按标题查询 "<<endl;
cout<<" 2、按类名查询 "<<endl;
cout<<" 3、按编号查询 "<<endl;
cout<<" 4、返回菜单界面 "<<endl;
cout<<" 5、退出系统 "<<endl;
cin>>x;
switch(x)
{
case 1:
chaxun(1);
break;
case 2:
chaxun(2);
break;
case 3:
chaxun(3);
break;
case 4:
menu();
break;
case 5:
exit(0);
break;
default:
cout<<"请输入正确的数字:"<<endl;
}
}
}
void chaxun(int x)
{
int m;
string o;
if(x==1)
{
cout<<"输入要查询的标题: ";
cin>>o;
if(!s1.Chaxun(x,o)&&!s2.Chaxun(x,o)&&!s3.Chaxun(x,o))
cout<<"不存在该标题!"<<endl;
cout<<endl;
}else if(x==2)
{
cout<<"输入要查询的类名(有图书类,视频类,图画类): ";
cin>>o;
if(o=="图书类")
{
s1.Show_all();
cout<<endl;
}
else if(o=="视频类")
{
s2.Show_all();
cout<<endl;
}
else if(o=="图画类")
{
s3.Show_all();
cout<<endl;
}else
{
cout<<"输入有误..."<<endl;
cout<<"即将返回菜单界面..."<<endl;
menu();
}
}else
{
cout<<"输入要查询的编号: ";
cin>>m;
ostringstream os;
os<<m;
istringstream is(os.str());
is>>o;
if(!s1.Chaxun(x,o)&&!s2.Chaxun(x,o)&&!s3.Chaxun(x,o))
{
cout<<"不存在该编号!"<<endl;
}
cout<<endl;
}
}
void show_all()
{
cout<<"图书类:"<<endl;
s1.Show_all();
cout<<endl<<"视频类"<<endl;
s2.Show_all();
cout<<endl<<"图画类"<<endl;
s3.Show_all();
cout<<endl;
}
void bianji(int n,int x)
{
int i,o,g=1;
string p;
if(n==1)
{
cout<<" 输入要编辑内容的代码 "<<endl<<endl;
cout<<" 1、编号 "<<endl;
cout<<" 2、标题 "<<endl;
cout<<" 3、作者 "<<endl;
cout<<" 4、评级 "<<endl;
cout<<" 5、出版社 "<<endl;
cout<<" 6、ISBN号 "<<endl;
cout<<" 7、页数 "<<endl;
cout<<" 8、全部 "<<endl;
cout<<" 9、返回菜单界面 "<<endl;
cin>>i;
switch(i)
{
case 1:
while(1)
{
cout<<"输入要修改的编号:"<<endl;
cin>>o;
ostringstream s;
s<<o;
istringstream is(s.str());
is>>p;
if(chachong(p))
{
s1.Bianji(x,1,p);
break;
}else
cout<<"编号重复!"<<endl;
}
break;
case 2:
cout<<"输入要修改的标题:"<<endl;
cin>>p;
s1.Bianji(x,2,p);
break;
case 3:
cout<<"输入要修改的作者:"<<endl;
cin>>p;
s1.Bianji(x,3,p);
break;
case 4:
cout<<"输入要修改的评级:"<<endl;
cin>>p;
s1.Bianji(x,4,p);
break;
case 5:
cout<<"输入要修改的出版社:"<<endl;
cin>>p;
s1.Bianji(x,5,p);
break;
case 6:
cout<<"输入要修改的ISBN号:"<<endl;
cin>>p;
s1.Bianji(x,6,p);
break;
case 7:
cout<<"输入要修改的页数:"<<endl;
cin>>p;
s1.Bianji(x,7,p);
break;
case 8:
while(g)
{
cout<<"先输入要修改的编号:"<<endl;
cin>>o;
ostringstream s;
s<<o;
istringstream is(s.str());
is>>p;
if(chachong(p))
{
cout<<"输入标题、作者、评级、出版社、ISBN号、页数:"<<endl;
s1.Bianji(x,8,p);
g=0;
}else
{
cout<<"编号重复!"<<endl;
}
}
break;
case 9:
menu();
break;
default:
cout<<"输入错误"<<endl;
}
cout<<"编辑成功!"<<endl;
cout<<"即将返回菜单界面..."<<endl;
menu();
}else if(n==2)
{
cout<<" 输入要编辑内容的代码 "<<endl<<endl;
cout<<" 1、编号 "<<endl;
cout<<" 2、标题 "<<endl;
cout<<" 3、作者 "<<endl;
cout<<" 4、评级 "<<endl;
cout<<" 5、出品者名字 "<<endl;
cout<<" 6、出品年 "<<endl;
cout<<" 7、视频时长 "<<endl;
cout<<" 8、全部 "<<endl;
cout<<" 9、返回菜单界面 "<<endl;
cin>>i;
switch(i)
{
case 1:
while(1)
{
cout<<"输入要修改的编号:"<<endl;
cin>>o;
ostringstream s;
s<<o;
istringstream is(s.str());
is>>p;
if(chachong(p))
{
s2.Bianji(x,1,p);
break;
}else
cout<<"编号重复!"<<endl;
}
break;
case 2:
cout<<"输入要修改的标题:"<<endl;
cin>>p;
s2.Bianji(x,2,p);
break;
case 3:
cout<<"输入要修改的作者:"<<endl;
cin>>p;
s2.Bianji(x,3,p);
break;
case 4:
cout<<"输入要修改的评级:"<<endl;
cin>>p;
s2.Bianji(x,4,p);
break;
case 5:
cout<<"输入要修改的出品者名字:"<<endl;
cin>>p;
s2.Bianji(x,5,p);
break;
case 6:
cout<<"输入要修改的出品年份:"<<endl;
cin>>p;
s2.Bianji(x,6,p);
break;
case 7:
cout<<"输入要修改的视频时长:"<<endl;
cin>>p;
s2.Bianji(x,7,p);
break;
case 8:
while(g)
{
cout<<"先输入要修改的编号:"<<endl;
cin>>o;
ostringstream s;
s<<o;
istringstream is(s.str());
is>>p;
if(chachong(p))
{
cout<<"输入标题、作者、评级、出版社、ISBN号、页数:"<<endl;
s1.Bianji(x,8,p);
g=0;
}else
{
cout<<"编号重复!"<<endl;
}
}
break;
case 9:
menu();
break;
default:
cout<<"输入错误"<<endl;
}
cout<<"编辑成功!"<<endl;
cout<<"即将返回菜单界面..."<<endl;
menu();
}else
{
cout<<" 输入要编辑内容的代码 "<<endl<<endl;
cout<<" 1、编号 "<<endl;
cout<<" 2、标题 "<<endl;
cout<<" 3、作者 "<<endl;
cout<<" 4、评级 "<<endl;
cout<<" 5、出品国籍 "<<endl;
cout<<" 6、作品长度 "<<endl;
cout<<" 7、作品宽度 "<<endl;
cout<<" 8、全部 "<<endl;
cout<<" 9、返回菜单界面 "<<endl;
cin>>i;
switch(i)
{
case 1:
while(1)
{
cout<<"输入要修改的编号:"<<endl;
cin>>o;
ostringstream s;
s<<o;
istringstream is(s.str());
is>>p;
if(chachong(p))
{
s3.Bianji(x,1,p);
break;
}else
cout<<"编号重复!"<<endl;
}
break;
case 2:
cout<<"输入要修改的标题:"<<endl;
cin>>p;
s3.Bianji(x,2,p);
break;
case 3:
cout<<"输入要修改的作者:"<<endl;
cin>>p;
s3.Bianji(x,3,p);
break;
case 4:
cout<<"输入要修改的评级:"<<endl;
cin>>p;
s3.Bianji(x,4,p);
break;
case 5:
cout<<"输入要修改的出品国籍:"<<endl;
cin>>p;
s3.Bianji(x,5,p);
break;
case 6:
cout<<"输入要修改的作品长度:"<<endl;
cin>>p;
s3.Bianji(x,6,p);
break;
case 7:
cout<<"输入要修改的作品宽度:"<<endl;
cin>>p;
s3.Bianji(x,7,p);
break;
case 8:
while(g)
{
cout<<"先输入要修改的编号:"<<endl;
cin>>o;
ostringstream s;
s<<o;
istringstream is(s.str());
is>>p;
if(chachong(p))
{
cout<<"输入标题、作者、评级、出版社、ISBN号、页数:"<<endl;
s1.Bianji(x,8,p);
g=0;
}else
{
cout<<"编号重复!"<<endl;
}
}
break;
case 9:
menu();
break;
default:
cout<<"输入错误"<<endl;
}
cout<<"编辑成功!"<<endl;
cout<<"即将返回菜单界面..."<<endl;
menu();
}
}
void bianji_menu()
{
int i,x;
string h;
while(1)
{
cout<<"输入待编辑物品的编号: ";
cin>>i;
ostringstream s;
s<<i;
istringstream is(s.str());
is>>h;
if(s1.Cha(2,h)==-1&&s2.Cha(2,h)==-1&&s3.Cha(2,h)==-1)
cout<<"不存在该编号"<<endl<<endl;
else if(s1.Cha(2,h)!=-1)
{
x=s1.Cha(2,h);
bianji(1,x);
}
else if(s2.Cha(2,h)!=-1)
{
x=s2.Cha(2,h);
bianji(2,x);
}
else
{
x=s3.Cha(2,h);
bianji(3,x);
}
}
}
void Delete()
{
int i,x,c=0;
string h;
if(s1.n==0&&s2.n==0&&s3.n==0)
cout<<"物品库为空!"<<endl;
else
{
while(1)
{
cout<<"输入删除物品的编号: ";
cin>>i;
ostringstream s;
s<<i;
istringstream is(s.str());
is>>h;
if(s1.Cha(2,h)==-1&&s2.Cha(2,h)==-1&&s3.Cha(2,h)==-1)
cout<<"不存在该编号,请重新输入..."<<endl<<endl;
else if(s1.Cha(2,h)!=-1)
{
x=s1.Cha(2,h);
s1.deletel(x);
break;
}
else if(s2.Cha(2,h)!=-1)
{
x=s2.Cha(2,h);
s2.deletel(x);
break;
}
else
{
x=s3.Cha(2,h);
s3.deletel(x);
break;
}
}
cout<<"删除成功!"<<endl<<endl;
}
cout<<"即将返回菜单界面..."<<endl<<endl;
menu();
}
void tongji()
{
int x;
x=s1.n+s2.n+s3.n;
cout<<"当前物品库总物品数: "<<x<<endl;
cout<<"图书类物品数: "<<s1.n<<" 视频类物品数: "<<s2.n<<" 图画类物品数: "<<s3.n<<endl;
}
void menu()
{
while(1)
{
int x;
cout<<"----------------选择要进行的操作---------------------"<<endl<<endl;
cout<<" 1、添加物品 "<<endl;
cout<<" 2、查询物品 "<<endl;
cout<<" 3、输出物品物品库所有信息 "<<endl;
cout<<" 4、编辑物品 "<<endl;
cout<<" 5、删除物品 "<<endl;
cout<<" 6、统计物品 "<<endl;
cout<<" 7、退出系统 "<<endl;
cin>>x;
switch(x)
{
case 1:
tianjia_menu();
break;
case 2:
chaxun_menu();
break;
case 3:
show_all();
break;
case 4:
bianji_menu();
break;
case 5:
Delete();
break;
case 6:
tongji();
break;
case 7:
exit(0);
break;
default:
cout<<"请输入正确的数字:"<<endl;
}
}
}
};
int main()
{
char fn1[40]="C:\\Users\\lyl\\Desktop\\大作业\\Tushu.txt";
char fn2[40]="C:\\Users\\lyl\\Desktop\\大作业\\Shipin.txt";
char fn3[40]="C:\\Users\\lyl\\Desktop\\大作业\\Tuhua.txt";
manage a(fn1,fn2,fn3);
a.menu();
return 0;
}
|