设计一图书信息管理系统,实现以下功能:系统以菜单方式工作,图书信息录入功能(图书信息用文件保存) ;

  • 问题描述

设计一图书信息管理系统,实现以下功能:系统以菜单方式工作,图书信息录入功能(图书信息用文件保存) ;图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、 价格等;图书信息浏览功能(输出所有图书信息);查询和排序功能:按书名查询(显示所有同名的书),按作者名查询(所有该作者的书); 图书信息的删除与修改。

  • 基本要求 

(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;}

 


版权声明:本文为qq_58529257原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。