• 问题描述

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

  • 基本要求 

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

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

  1. C语言学生学籍管理系统源程序|用数据文件存放学生的学籍,可对学生学籍进行注册,登录,修改,删除,查找,统计,学籍变化等操作。(用文件保存) 功能要求: (1) 系统以菜单方式工作。 (2) 登记学生的

    学生学籍管理系统 用数据文件存放学生的学籍,可对学生学籍进行注册,登录,修改,删除,查找,统计,学籍变化等操作.(用文件保存) 功能要求: (1) 系统以菜单方式工作. (2) 登记学生的学号,姓名, ...

  2. java毕业生设计眼科医疗室信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计眼科医疗室信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计眼科医疗室信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B ...

  3. java毕业生设计学生信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计学生信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计学生信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  4. java毕业生设计学生学籍信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计学生学籍信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计学生学籍信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S ...

  5. java毕业生设计房产客户信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计房产客户信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计房产客户信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S ...

  6. java毕业生设计员工信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计员工信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计员工信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  7. java毕业生设计校园闲置物品信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计校园闲置物品信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计校园闲置物品信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构 ...

  8. java毕业生设计预装箱式净水站可视化信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计预装箱式净水站可视化信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计预装箱式净水站可视化信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技 ...

  9. java毕业生设计畜牧场信息管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计畜牧场信息管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计畜牧场信息管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 ...

  10. java毕业生设计中小型饭馆餐饮管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计中小型饭馆餐饮管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计中小型饭馆餐饮管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B ...

最新文章

  1. 图像拼接--Construction and Refinement of Panoramic Mosaics with Global and Local Alignment
  2. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
  3. mysql 列累加计算
  4. python里os什么模块_python中os模块的主要方法
  5. GitHub 支持上传视频文件啦!
  6. redis开启redis_Redis聚类
  7. SVN,桌面右击-settings-Icon Overlays 选择 None
  8. Servlet相关(servletconfig、servletcontext、request)
  9. JavaScript运行机制:event-loop
  10. 服务器专用影子系统,试试最牛X的影子系统!瞬间创建N个账号
  11. 数学建模(NO.9斯皮尔曼相关系数)
  12. 嗖嗖嗖Wordpress外贸企业主题制作教程--第二讲 整站下载器的使用和静态页面的准备
  13. vue 设置表单必填项
  14. 国产时钟芯片应用探讨,CLB2305对标CY2305, CLB30110兼容IDT:8L30110,TI:CDCLVC1310
  15. 服务器3389信息,服务器3389远程记录查看
  16. Jeff Atwood:Google的头号UI问题
  17. C语言:str函数(一)
  18. python average函数详解_Python内置函数详解——总结篇
  19. TikTok跨境电商:TikTok代开英国小店、印尼小店,美国小黄车,广告账户
  20. asd激光粒度仪测试原理是什么解答

热门文章

  1. 哈希函数 英语单词_使用Hash表实现英文单词表并实现单词查询操作
  2. 无线路由桥接关掉服务器要怎么办,路由器设置无线桥接后不能登录副路由器怎么办?...
  3. 局域网vnc远程控制软件,那些超级好用的局域网vnc远程控制软件
  4. 巧用CHKDSK命令修复U盘文件或目录损坏问题
  5. Skype 4.1 Linux 发布,支持微软帐号登录
  6. qq,微信抓句柄发送信息
  7. 图像同时对比度、空间分辨率、幅度分辨率的实现
  8. python和jieba库进行简单文本处理之天龙八部小说
  9. 强连通分量入门——Trajan算法
  10. 软件工程知识点总结——第一、二部分