问题描述
设计一图书信息管理系统,实现以下功能:系统以菜单方式工作,图书信息录入功能(图书信息用文件保存) ;图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等;图书信息浏览功能(输出所有图书信息);查询和排序功能:按书名查询(显示所有同名的书),按作者名查询(所有该作者的书); 图书信息的删除与修改。
基本要求
(1)使用面向对象编程思想编写开发过程中需要用到的类,比如:图书类(图书信息)、日期类 、管理类(实现对图书信息的管理)。
(2)输入和输出可以使用文本文件重定向输入(保存数据为磁盘文件);也可以使用标准输入输出进行(提交时需要提交TXT格式输入数据)。应包含 20条以上记录,且有同姓名不同作者的书和同一作者的多部著作,包含数据信息即图书信息。在运行程序时自动载入,若文件不存则创建一个空文件。
(3)基本功能要求具有增、删、改、查。
三.需求分析
系统目的:本图书信息管理系统菜单方式工作,用户可以通过此管理系统对书籍进行管理,它具有(1)登录号、书名、作者名、分类号、出版单位、出版时间、价格等图书信息的录入功能。(2)图书信息的浏览功能(3)对书籍的查询和排序功能,按书名查询与按作者名查询(4)对图书信息的删除与修改。
用户需求:此系统采用文本文件重定向输入已保存数据为磁盘文件,输入值已按登录号整齐排列,用户可以在此基础上进行书籍信息的增删改查,可以按书籍价格增序与降序进行重新排列。可以在退出时保存数据方便下次使用,可通过主菜单方式按书名或作者名进行查询,便于准确找到图书。可通过菜单方式显示书籍信息,一目了然。已实现多条书籍信息对齐排列,使页面更加简洁明了。
功能需求:系统已实现对书籍信息的增删改查。
测试数据:数据已经过测试,测试结果(包括正确的输入及其输出结果和含有错误的输入及其输出结果)将会在下文中展示。
#include"iostream"
#include"windows.h"//与 system("cls");连用实现清屏操作
#include "fstream"//对文件进行操作所包含的头文件
#include"stdio.h"//使用Sleep(3000)需包含的头文件
#include "cstring"
#include"iomanip"
using namespace std;
#define long 11
class book
{public:
book *next;//构建链表
string book_Entry_number;//书籍登录号
string book_name;//书籍名称
string author_name;//作者姓名
string book_number;// 书籍分类号
string publish_address;//书籍出版单位
string publish_time;//书籍出版时间
string book_price;//书籍价格
string getbook_Entry_number()//get函数实现private数据在类外调用
{return book_Entry_number;}
string getbook_name()
{return book_name;}
string getauthor_name()
{return author_name;}
string getbook_number()
{return book_number;}
string getpublish_address()
{return publish_address;}
string getpublish_time()
{return publish_time;}
string getbook_price()
{return book_price;}
friend istream&operator>>(istream& in,book &p);//重载输入
friend ostream&operator<<(ostream& out,book &p);//重载输出
void m_book_Entry_number()//输入图书数据 book_Entry_number
{cin>>book_Entry_number;}
void m_book_name()// 输入图书数据book_name
{cin>>book_name;}
void m_author_name()// 输入图书数据author_name
{cin>>author_name;}
void m_book_number()// 输入图书数据book_number
{cin>>book_number;}
void m_publish_address()// 输入图书数据publish_address
{cin>>publish_address;}
void m_publish_time()// 输入图书数据publish_time
{cin>>publish_time;}
void m_book_price()// 输入图书数据book_price
{cin>>book_price;}
void Exchange_book(book *q);//进行图书信息交换
};
istream&operator>>(istream&in,book &p)//实现重载输入
{in>>p.book_Entry_number>>p.book_name>>p.author_name>>p.book_number>>p.publish_address>>p.publish_time>>p.book_price;
return in;
}
ostream&operator<<(ostream&out,book &p)//实现重载输出 (固定输出数据宽度为Long,左对齐,
{out<<setw(long)<<setiosflags(ios::left)<<p.book_Entry_number<<"\t\t";
out<<setw(long)<<setiosflags(ios::left)<<p.book_name<<"\t\t";
out<<setw(long)<<setiosflags(ios::left)<<p.author_name<<"\t\t";
out<<setw(long)<<setiosflags(ios::left)<<p.book_number<<"\t\t";
out<<setw(long)<<setiosflags(ios::left)<<p.publish_address<<"\t\t";
out<<setw(long)<<setiosflags(ios::left)<<p.publish_time<<"\t\t";
out<<setw(long)<<setiosflags(ios::left)<<p.book_price<<endl;
return out;
}
class LibraryManager//图书馆管理类
{public:
LibraryManager();//图书管理类的构造函数
void Menu();//图书管理系统菜单
void ExitManager();//退出系统
void Add_book(book **q);//增加图书信息
void show_book(book *q) ;//显示图书信息
void Delete_book(book **q);//删除图书信息
void amend_book(book *q);//修改图书信息
void FIND_book(book *q);//查找图书信息
void sort_book(book *q);//按照图书价格排序
void Exchange_book(book *q);//排序时用来信息交换
void SaveData(book *q);//将图书数据保存在新文件中
int init_book(book **q);//从文件中读出图书信息
private:
book *abook;//book类指针指向链表头top
book *zbook;};//book类指针指向链表尾
LibraryManager::LibraryManager()//图书管理类的构造函数
{
abook=NULL;
init_book(&abook);//将链表头部地址传给 init_book
Menu();//调用菜单
}//链表生成
void LibraryManager::Menu()
{
cout<<"######欢迎使用图书信息管理系统#######"<<endl;
cout<< "######输入1 增加图书信息####################"<<endl;
cout<< "######输入2显示图书信息####################"<<endl;
cout<< "######输入3 删除图书信息####################"<<endl;
cout<< "######输入4 修改图书信息####################"<<endl;
cout<< "######输入5查找图书信息####################"<<endl;
cout<< "######输入6按照价格排序####################"<<endl;
cout<< "######输入7 图书数据保存在新文件中并退出系统####################"<<endl;
char m;//定义为int类型输入符号或汉字会刷屏,故定义为char类型
cin>>m;
while(m<'1'||m>'8')//判断用户是否正确输入
{cout<<"输入有误,请重新输入"<<endl;
cin>>m;
}
switch(m)//根据用户的选择进行功能实现
{case '1': Add_book(&abook );break;//增加图书信息
case '2': show_book(abook) ;break;//显示图书信息
case '3': Delete_book(&abook);break;//删除图书信息
case '4': amend_book(abook);break;//修改图书信息
case '5': FIND_book(abook);break;//查找图书信息
case '6': sort_book(abook);break;//按照登录号排序
case '7': SaveData(abook);cout<<"欢迎下次使用"<<endl;exit (0); break;//将图书数据保存在新文件中
case '8': init_book(&abook);break;}}//从文件中读出图书信息
void LibraryManager::Add_book(book **q)//增加图书信息
{ char m;
cout<<"请输入图书信息"<<endl;
book *p;//定义book类指针
p=new book;//申请存储空尾间
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cin >>*p;
if (*q==NULL)//检查链表是否为空链表
{p->next=NULL;
*q=p;}//如果链表为空则把链表头指向p
else
{p->next=NULL;//p是倒数第二个节点,next指针中保存这尾节点的地址值,p指向尾节点
(zbook)->next=p;//如果链表不为空则把链表尾指向p
}
zbook=p;
cout<<"添加成功,是否继续添加:是c,否d:"<<endl;
cin>>m;
while(m!='c'&&m!='d')
{
cout<<"输入错误,请重新输入:"<<endl;
cin>>m;
}
if(m=='c')
{Add_book(&abook);
exit(0);}
else
{cout<<"正在返回到菜单,请勿操作"<<endl;
Sleep(3000);//停滞3s再继续
system("cls");//清屏
Menu();
exit(0);
}}
void LibraryManager::show_book(book *q)//显示图书信息
{book *m=q;//定义book类指针指向链表地址
int k=0,j=0;//k控制换行,j记录书籍本书
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
while(m!=NULL)
{cout<<*m<<endl;
k++;j++;
if(k>10)//每 11个数据换行
{cout<<endl<<endl;k=k-11;}
m=m->next;}
cout<<"一共展示"<<j<<"本图书"<<endl;
system("pause");
cout<<"正在返回到菜单,请勿操作"<<endl;
Sleep(3000);
system("cls");
Menu();
exit (0);}
void LibraryManager:: amend_book(book *q)//修改图书信息
{ string mp;
char h;
book *p,ctemp;
p=q;
cout<<"请输入要修改的图书的登录号:输入NO返回菜单"<<endl;
cin>>mp;
if(mp=="NO"){system("cls");Menu();exit(0);}//返回菜单
while(p!=NULL)
{if(p->getbook_Entry_number()==mp)break;//已查找到
else{p=p->next;}
}
if(p==NULL)//未查找到
{cout<<"无此图书"<<endl;cout<<"正在返回到菜单,请勿操作"<<endl;
Sleep(3000);
amend_book(q);
exit(0);
}
else
{system("cls");
ctemp=*p;
cout<<"以下为图书信息:"<<endl;
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cout<<*p<<endl;
cout<<"********************************"<<endl;
cout<<"本书登录号0"<<endl;
cout<<"本书书籍名称1"<<endl;
cout<<"本书作者姓名2"<<endl;
cout<<"本书分类号3"<<endl;
cout<<"本书出版单位4"<<endl;
cout<<"本书出版时间5"<<endl;
cout<<"本书书籍价格6"<<endl;
cout<<"********************************"<<endl;
cout<<"7返回菜单"<<endl;
cout<<"请选择要修改的信息:0,1,2,3,4,5,6对应相应信息";
cin>>h;
while(h<'0'||h>'7')
{cout<<"输入错误,请重新输入"<<endl;
cin>>h; }
cout<<"输入修改后的信息"<<endl;
switch(h)
{case '0':p->m_book_Entry_number();break;
case '1':p->m_book_name();break;
case '2':p->m_author_name();break;
case '3':p->m_book_number();break;
case '4':p->m_publish_address();break;
case '5':p->m_publish_time();break;
case '6':p->m_book_price();break;
case '7':Sleep(3000);
system("cls");
Menu();
exit(0);break;
}
cout<<"修改后图书信息为" <<endl;
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cout<<*p<<endl;
system("pause");
cout<<"无此图书"<<endl;cout<<"正在返回到菜单,请勿操作"<<endl;
Sleep(3000);
system("cls");
Menu();
exit(0);
}
};
int LibraryManager:: init_book(book **q)//从文件中读出图书信息,返回值用来中断函数
{int j=0;//用来计录读取信息数
ifstream infile("shuji.txt",ios::in);//从shuji.txt文件中读取数据
if(!infile)
{cout<<"书籍文件不存在"<<endl; //书籍文件不存在
Sleep(3000);
system("cls");
return 0;
}
while(!infile.eof())
{book *atemp;
atemp=new book;
infile>>(*atemp);
if(infile.eof()){break;}//读取到文件尾,结束
j++;
if(*q==NULL)//检查链表是否为空链表
{atemp->next=NULL;
*q=atemp;
}
else
{atemp->next=NULL;
(zbook)->next=atemp;
}
zbook=atemp;
}
if(j==0){cout<<"书籍文件为空"<<endl;
Sleep(3000);
system("cls");}
else {cout<<"从文件中读取数据"<<endl;
Sleep(3000);
system("cls");
}
infile.close();
return 1;
}
void LibraryManager:: SaveData(book *q)//将图书数据保存在新文件中( (若文件不存在则新建)
{book *m=q;book *btemp;
fstream outfile("shuji.txt",ios::out);// shuji.txt
if(!outfile)
{cout<<"书籍文件保存失败"<<endl;
exit (0);
}
while (m!=NULL)//链表不为空
{outfile<<*m;//把链表中数据输入文件保存,每保存一个释放一个
btemp=m;
m=m->next;
delete btemp;//释放链表空间
}
outfile.close();//关闭文件
}
void LibraryManager::FIND_book(book *q)//查找图书信息
{char p;
cout<<"请按(s)书名(n)作者名"<<endl;
cin>>p;
if(p=='n')
{string j;
book *z;
z=q;
int i=0;
cout<<"请输入需查找书籍的作者名"<<endl;
cin>>j;
while(z!=NULL)
{if(z->getauthor_name()==j)//已找到此书籍
{cout<<"该图书信息如下"<<endl;
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cout<<*z;
z=z->next;
i++;
}
else{z=z->next;}//未找到,继续寻找
}
if(z=NULL)//最终未找到
{cout<<"无此图书"<<endl;
Sleep(3000);
FIND_book(q);
exit(0);
}
else
{system("pause");
system("cls");
Menu();
exit(0);
}
}
else// 按书名搜索
{string j;
book *z;
z=q;
int i=0;
cout<<"请输入需查找书籍的书名"<<endl;
cin>>j;
while(z!=NULL)
{if(z->getbook_name()==j)//已找到此书籍
{cout<<"该图书信息如下"<<endl;
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cout<<*z;
z=z->next;
i++;
}
else{z=z->next;}//未找到,继续寻找
}
if(z=NULL)//最终未找到
{cout<<"无此图书"<<endl;
Sleep(3000);
FIND_book(q);
exit(0);
}
else
{system("pause");
system("cls");
Menu();
exit(0);
}
}
}
void LibraryManager::Delete_book(book **q)//删除图书信息
{string m;//需输入的图书的登录号
book *w;book *ww;
w=*q;
char j;
cout<<"请输入需删除图书的登录号"<<endl;
cin>>m;
if(w->getbook_Entry_number()==m)//若在链表头找到该图书
{cout<<"该图书原本信息如下"<<endl;
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cout<<*w;
(*q)=(*q)->next;//移动链表头到下一位置
delete w;//释放原链表头地址
cout<<"该图书信息已删除"<<endl;
Sleep(3000);
system("cls");
Menu();
exit(0);
if(w=NULL)//最终未找到
{cout<<"无此图书"<<endl;
Sleep(3000);
Delete_book(q);
exit(0);}
else {cout<<"该图书原本信息如下"<<endl;//已找到该图书
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cout<<*w;
ww->next= w->next;
delete w;//删除信息
cout<<"该图书信息已删除"<<endl;
Sleep(3000);
system("cls");
Menu();
exit(0);}}
while(w!=NULL)
{
if(w->getbook_Entry_number()==m)break;
else{
ww=w;//锁定目标图书的下一地址
w=w->next;}}
if(w==NULL)
{
cout<<"查询不到该图书"<<endl<<"正在返回"<<endl;
Sleep(3000);
Delete_book(q);
exit(0);
}
else {cout<<"该图书原本信息如下"<<endl;//已找到该图书
cout<<"本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格"<<endl;
cout<<*w;
ww->next= w->next;
delete w;//删除信息
cout<<"该图书信息已删除"<<endl;
Sleep(3000);
system("cls");
Menu();
exit(0);}
Sleep(3000);
system("cls");
Menu();
exit(0);
}
void LibraryManager::sort_book(book *q)//按照价格排序(对整个链表进行排序 )
{book *p=q,*m=q;
int Long=0,i,j;
char k;
cout<<"1.按价格增长排序2.按价格降序排序"<<endl;
cin>> k;
while(k<'1'||k>'2'){cout<<"输入错误,请重新输入"<<endl;
cin>>k;}
while(m!=NULL)//链表是否为空
{Long ++;//对链表长度进行计算
m=m->next;
}
m=q;
for(i=0;i<Long-1;i++)
{p=m;
for(j=0;j<Long-1;j++)
{if(k=='1'){if(p->getbook_price()>p->next->getbook_price())//按价格增长排序
{p->Exchange_book(p->next);}}
if(k=='2'){if(p->getbook_price()<p->next->getbook_price())//按价格降序排序
{p->Exchange_book(p->next);}}
p = p->next;
}
}
cout<<"图书正在排序中,请稍候"<<endl;
Sleep(3000);
system("cls");
Menu();
exit(0);
}
void book::Exchange_book(book *q)
{string book_Entry_number=this->getbook_Entry_number();
string book_name=this->getbook_name();
string author_name=this->getauthor_name();
string book_number=this->getbook_number();
string publish_address=this->getpublish_address();
string publish_time=this->getpublish_time();
string book_price=this->getbook_price();
this->book_Entry_number=q->getbook_Entry_number();
this->book_name=q->getbook_name();
this->author_name=q->getauthor_name();
this->book_number=q->getbook_number();
this->publish_address=q->getpublish_address();
this->publish_time=q->getpublish_time();
this->book_price=q->getbook_price();
q->book_Entry_number=book_Entry_number;
q->book_name=book_name;
q->author_name=author_name;
q->book_number=book_number;
q->publish_address=publish_address;
q->publish_time=publish_time;
q->book_price=book_price;}
int main()
{LibraryManager staff;
return 0;}
设计一图书信息管理系统 实现以下功能:系统以菜单方式工作 图书信息录入功能(图书信息用文件保存) ;