一、实验目的
图书馆中的资料很多,如果能分类对其资料流通进行管理,将会带来很多方便,因此需要有一个媒体库管理系统。
图书馆共有三大类物品资料:图书、视频光盘、图画。
这三类物品共同具有的属性有:编号、标题、作者、评级(未评级,一般,成人,儿童)等。其中图书类增加出版社、ISBN号、页数等信息;视频光盘类增加出品者的名字、出品年份和视频时长等信息;图画类增加出品国籍、作品的长和宽(以厘米计,整数)等信息。
二、实验内容
(1)添加物品:主要完成图书馆三类物品信息的添加,要求编号唯一。当添加了重复的编号时,则提示数据添加重复并取消添加;当物品库已满,则提示不能再添加新的数据。
(2)查询物品
可按照三种方式来查询物品,分别为:
按标题查询:输入标题,输出所查询的信息,若不存在该记录,则提示“该标题不存在!”;
按编号查询:输入编号,输出所查询的信息,若不存在该记录,则提示“该编号不存在!”;
按类别查询:输入类别,输出所查询的信息,若不存在记录,则提示“该类别没有物品!”;
(3)显示物品库:输出当前物品库中所有物品信息,每条记录占据一行。
(4)编辑物品:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
(5)删除物品:主要完成图书馆物品信息的删除。如果当前物品库为空,则提示“物品库为空!”,并返回操作;否则,输入要删除的编号,根据编号删除该物品的记录,如果该编号不在物品库中,则提示“该编号不存在”。
(6)统计信息
输出当前物品库中总物品数,以及按物品类别,统计出当前物品中各类别的物品数并显示。
(7)物品存盘:将当前程序中的物品信息存入文件中。
(8)读出物品:从文件中将物品信息读入程序。
为实现物品存盘和读出物品功能需要在文件夹中建立相应文档,在文档中输入初始物品信息,格式由代码设定决定,这样才能从文档中读取数据。
以下分别为视频,图画,图书文件
图画未设置内容,不做展示
程序效果展示
代码
#include <iostream> #include <string> #include <cstring> #include <fstream> #include <cstdlib> using namespace std; class person { }; class Student //定义学生类 { public: string name; float score; public: friend ostream & operator<<(ostream & out,Student &s); friend istream & operator>>(istream & in,Student &s); Student(string n="gg ",float s=0) { name=n; score=s; } bool operator >(Student s) //重载 > 符号 { if(this->score>s.score) return true; else return false; } }; ostream & operator<<(ostream & out,Student &s) { out<<s.name<< " "<<s.score<<endl; return out; } istream & operator>>(istream & in,Student &s) { cout<<"请输入学生的姓名、成绩"<<endl; in>>s.name>>s.score; return in; } //****************************************文件类模板*************************************** template <class T> class FileOperation { private: fstream File; //文件流对象 T arr[100]; //对象数组 int n; //元素个数 char fileName[40]; //文件名 public: FileOperation(char *fn) //构造函数 { strcpy(fileName,fn); n=0; } void FileRead() //读文件 将文件记录读入数组对象的数组中 { n=0; File.open(fileName,ios::binary|ios::in); //打开文件 File.seekg(0,ios::end); //文件指针指向文件尾 long fileLen=File.tellg(); //文件长度 File.seekg(0,ios::beg); //文件指针指向文件头 while(File.tellg()<fileLen) { File.read((char *)&arr[n],sizeof(T)); n++; } File.close(); } void add(T a) //添加一条记录到数组和文件 { //数组添加 arr[n]=a; n++; //文件添加 File.open(fileName,ios::binary|ios::out|ios::app); //打开文件 File.write((char *)&a,sizeof(T)); //写入新记录 */ File.close(); } void display1() //显示数组记录 { for(int i=0;i<n;i++) cout<<arr[i]; } void display() //显示文件记录 { T a[100]; int i=0; File.open(fileName,ios::binary|ios::in); //打开文件 File.seekg(0,ios::end); //文件指针指向文件尾 long fileLen=File.tellg(); //文件长度 File.seekg(0,ios::beg); //文件指针指向文件头 while(File.tellg()<fileLen) { File.read((char *)&a[i],sizeof(T)); cout<<a[i]; i++; } File.close(); } int searchname(string s) //按姓名查询 { int flag=-1; for(int i=0;i<n;i++) if(arr[i].name==s) { flag=i; break; } return flag; } int searchnum(string s) //按学号查询 { int flag=-1; for(int i=0;i<n;i++) if(arr[i].num==s) { flag=i; break; } return flag; } }; int main() { fstream file1; char filename1[50]="d:\\c++book\\record.dat"; ifstream fin(filename1); if(fin) //判断文件是否存在 { fin.close(); } else{ file1.open(filename1,ios::binary|ios::out); //首次运行新建文件 file1.close(); } FileOperation <Student> files(filename1); files.FileRead(); //程序一开始运行,先读文件,将文件内容读出到数组中 Student s1("zhang",89); files.add(s1); Student s2("wang",79); files.add(s2); Student s3("zhao",86); files.add(s3); cout<<"添加后数组为"<<endl; files.display1(); cout<<"添加后文件为"<<endl; files.display(); char c; string nm; cout<<"请选择查询方式,按姓名查询,请输入1,学号查询输入2"<<endl; cin>>c; if(c=='1') { cout<<"请输入姓名"<<endl; cin>>nm; if(files.searchname(nm)==-1) cout<<"不存在"<<endl; else cout<<"找到"<<endl; } }
有用到模板