本文实例为大家分享了C++实现小型图书管理系统的具体代码,供大家参考,具体内容如下
因为课程设计的原因,需要实现一个小型图书管理系统
包含功能:问题描述:
设计一个系统,对图书信息进行管理,信息描述:有关该系统基本信息的描述,如:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。
基本要求:基本功能:
1、新进图书基本信息的输入。
2、图书基本信息的查询。
3、对撤消图书信息的删除。
4、为借书人办理注册。
5、办理借书手续(非注册会员不能借书)。
6、办理还书手续。
7、统计图书库存、已借出图书数量。
需要创建三个文本文件:record.txt book.txt reader.txt
operating.h的头文件:
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include<sstream>
#include<vector>
#include <iomanip>
using namespace std;
int all_stock = 0;
int out_stock = 0;
int times=0;
void outData(vector<string> res,int n) // n为txt中 每行数据个数
{
for(int i=0;i<res.size();i+=n){
for(int j=0;j<n;j++)
cout<<setw(12)<<res[i+j]<<" ";
cout<<endl;
}
}
void BookEntry()
{
double price;
string bookname,writer;
fstream out;
out.open("book.txt",ios::app);
if(!out)
{
cerr<<"打开文件失败!"<<endl;
}
time_t tt = time(NULL);//这句返回的只是一个时间cuo
cout<<"请输入书籍名称"<<endl;
cin>>bookname;
cout<<"请输入书籍作者"<<endl;
cin>>writer;
cout<<"请输入书籍价格"<<endl;
while(! (cin>>price) || price <= 0 )
{
cin.clear();
cin.ignore(100,'\n');
cout<<"请输入正确的价格"<<endl;
}
out<<tt<<" "<<bookname<<" "<<writer<<" "<<price<<" "<<"0"<<"\n";
out.close();
}
void BookMes()
{
fstream in;
string line;
//用于存放分割后的字符串
vector<string> res;
string temp; //暂存字符串
in.open("book.txt",ios::in);
if(!in)
{
cerr<<"打开文件失败!"<<endl;
}
all_stock = 0;
while(getline(in,line))
{
all_stock++;
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
while(input>>temp)
{
res.push_back(temp);
}
}
// 0 书籍编号 1 书籍名称 2作者 3价格 4书籍状态
//输出res
cout<<endl<<setw(12)<<"书籍编号"<<" "<<setw(12)<<"书籍名称"<<" "<<setw(12)<<"作者"<<" "<<setw(12)<<"价格"<<" "<<setw(12)<<"在馆0,不在1"<<"\n";
outData(res,5);
in.close();
}
void DelBook()
{
string del_book;
string line;
vector<string>res;
string temp;
bool flag=false;
fstream in;
in.open("book.txt",ios::in);
if(!in)
{
cerr<<"打开错误文件"<<endl;
}
cout<<"请输入需要删除的图书ID"<<endl;
cin>>del_book;
while(getline(in,line))
{
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
times=0;
while(input>>temp)
{
if(del_book == temp && times==0)
{
for(int i=0;i<3;i++) //因为一共五个 第一个temp已经是del_book 所以这里取得是四个
{
input>>temp;
}
input>>temp;
if(temp != "0")
{
cout<<"书籍状态不对";
in.close();
return ;
}
flag=true;
cout<<"\n找到了喔,应该删除成功了\n";
continue;
}
res.push_back(temp);
times++;
}
}
//outData(res,5);
in.close();
if(!flag)
{
cout<<"\n错误的书籍ID\n";
return ;
}
fstream out;
out.open("book.txt",ios::out);
if(!out)
{
cerr<<"打开文件失败!"<<endl;
}
for(int j=0;j<res.size();j+=5)
{
line = res[j] + " " + res[j+1] + " " + res[j+2] + " " + res[j+3] + " " + res[j+4] + "\n";
out<<line;
}
out.close();
}
void ReaderEntry()
{
string readername,sex_str;
int sex;
fstream out;
out.open("reader.txt",ios::app);
if(!out)
{
cerr<<"打开文件失败!"<<endl;
}
time_t readerid = time(NULL);//这句返回的只是一个时间cuo
cout<<"请输入读者姓名"<<endl;
cin>>readername;
do
{
cout<<"请输入读者性别:0为女,1为男"<<endl;
while(! (cin>>sex) )
{
cin.clear();
cin.ignore(100,'\n');
cout<<"请输入正确的0或1"<<endl;
}
}while(sex != 0 && sex!=1);
if(sex == 1)
{
sex_str = "男";
}else if (sex == 0){
sex_str = "女";
}else{
out.close();
return ;
}
out<<readerid<<" "<<readername<<" "<<sex_str<<"\n";
out.close();
}
/*读者信息*/
void ReaderMes()
{
fstream in;
string line;
//用于存放分割后的字符串
vector<string> res;
string temp; //暂存字符串
in.open("reader.txt",ios::in);
if(!in)
{
cerr<<"打开文件失败!"<<endl;
}
while(getline(in,line))
{
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
while(input>>temp)
res.push_back(temp);
}
// 0读者学号 1读者姓名 2读者性别
//输出res
cout<<endl<<setw(12)<<"读者编号"<<" "<<setw(12)<<"读者"<<" "<<setw(12)<<"性别"<<"\n";
outData(res,3);
in.close();
}
/* 借阅书籍 */
void BorrowBook()
{
string book[5];
string readerid;
string readername;
string line;
vector<string>res; //取书籍状况,并且更新
string temp;
bool flag_book = false; //用于判断书籍是否存在 读者是否存在
bool flag_reader = false;
/* 取book的图书情况,并判断是否在馆*/
fstream in;
in.open("book.txt",ios::in);
if(!in)
{
cerr<<"打开错误文件"<<endl;
}
cout<<"请输入需要借的图书ID"<<endl;
cin>>book[0];
while(getline(in,line))
{
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
times=0;
while(input>>temp)
{
if(book[0] == temp && times ==0)
{
res.push_back(temp);
for(int i=0;i<3;i++) //从书籍名称开始取,一直取到价钱
{
input>>temp; //读取了书籍编号,要及时写入res,以后要写进文本
book[1+i]=temp;
res.push_back(temp);
}
input>>temp; //取书籍状态,如果0在馆 如果1不在馆
if(temp == "0")
{
book[4]="1";
temp="1";
res.push_back(temp);
flag_book=true;
}else{
cout<<"\n书籍不在馆\n";
in.close();
return ;
}
continue; //继续取
}
res.push_back(temp);
times++;
}
}
in.close();
if(!flag_book)
{
cout<<"错误的书籍ID"<<endl;
return ;
}
in.open("reader.txt",ios::in);
if(!in)
{
cerr<<"打开错误文件"<<endl;
}
cout<<"\n请输入读者ID\n";
cin>>readerid;
while(getline(in,line))
{
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
times=0;
while(input>>temp)
{
if(readerid == temp && times==0)
{
input>>temp;
readername=temp;
flag_reader=true;
break;
}
times++;
}
}
if(!flag_reader)
{
cout<<"错误的读者ID"<<endl;
in.close();
return ;
}
in.close();
fstream out;
out.open("record.txt",ios::app);
if(!out)
{
cerr<<"打开错误文件"<<endl;
}
line = book[0] + " " + book[1] + " " + readername + '\n';
out<<line;
cout<<"\n办理借书成功\n";
out.close();
out.open("book.txt",ios::out);
if(!out)
{
cerr<<"打开文件失败!"<<endl;
}
for(int j=0;j<res.size();j+=5)
{
line = res[j] + " " + res[j+1] + " " + res[j+2] + " " + res[j+3] + " " + res[j+4] + "\n";
out<<line;
}
out.close();
}
void BorrowMes()
{
fstream in;
string line;
//用于存放分割后的字符串
vector<string> res;
string temp; //暂存字符串
in.open("record.txt",ios::in);
if(!in)
{
cerr<<"打开文件失败!"<<endl;
}
out_stock=0;
while(getline(in,line))
{
out_stock++;
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
while(input>>temp)
res.push_back(temp);
}
// 0书籍编号 1书籍名称 2读者姓名
//输出res
cout<<endl<<setw(12)<<"书籍编号"<<" "<<setw(12)<<"书籍名称"<<" "<<setw(12)<<"读者"<<"\n";
outData(res,3);
in.close();
}
void RtnBook()
{
string rtn_book;
string line;
vector<string>res;
string temp;
bool flag=false;
fstream in;
in.open("record.txt",ios::in); //先打开record 查看是否有借这本书
if(!in)
{
cerr<<"打开错误文件"<<endl;
}
cout<<"请输入需要归还的书籍ID"<<endl;
cin>> rtn_book;
while(getline(in,line))
{
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
times=0;
while(input>>temp)
{
if(rtn_book == temp && times==0) //如果有的话
{
flag=true;
for(int i=0;i<2;i++) //因为一共三个 第一个temp已经是del_book 所以这里取得是两个
{
input>>temp;// 将删除的东西不输出到向量中
}
continue;
}
res.push_back(temp);
times++;
}
}
//outData(res,3);
in.close();
if(!flag)
{
cout<<"该图书不存在或者没有被外借"<<endl;
return ;
}
fstream out;
out.open("record.txt",ios::out); //record已经删除成功
if(!out)
{
cerr<<"打开文件失败!"<<endl;
}
for(int j=0;j<res.size();j+=3)
{
line = res[j] + " " + res[j+1] + " " + res[j+2] + "\n";
out<<line;
}
out.close();
vector<string>res_book;
in.open("book.txt",ios::in); //开始取 被修改的书籍
if(!in)
{
cerr<<"打开错误文件"<<endl;
}
while(getline(in,line))
{
//cout<<line<<endl;
//将字符串读到input中
stringstream input(line); //将line切割 通过input存入temp,然后存入res中
times=0;
while(input>>temp)
{
if(rtn_book == temp && times==0)
{
res_book.push_back(temp);
for(int i=0;i<3;i++) //因为一共五个 第一个temp已经是rtn_book 所以这里取得是四个
{
input>>temp;
res_book.push_back(temp);
}
input>>temp;//最后一个取得是书籍状态,需要修改书籍状态
temp = "0";
res_book.push_back(temp);
continue;
}
res_book.push_back(temp);
times++;
}
}
//outData(res,5);
in.close();
out.open("book.txt",ios::out); //再存入文本中;
if(!out)
{
cerr<<"打开文件失败!"<<endl;
}
for(int j=0;j<res_book.size();j+=5)
{
line = res_book[j] + " " + res_book[j+1] + " " + res_book[j+2] + " " + res_book[j+3] + " " + res_book[j+4] + "\n";
out<<line;
}
out.close();
cout<<"\n找到了喔,应该还书成功了\n";
}
void CountBook()
{
cout<<"\n图书馆书籍情况";
BookMes();
cout<<"图书馆一共有:"<<all_stock<<" 本书\n\n\n";
cout<<"\n图书馆书籍外借情况";
BorrowMes();
cout<<"图书馆目前外借:"<<out_stock<<" 本书\n\n";
cout<<"\n\n图书馆当前在馆书籍还有:"<<all_stock - out_stock<<" 本书\n";
}
main.cpp的主函数
#include "operating.h"
int main()
{
int order;
do
{
order = -1;
cout<<"\n";
cout<<"----------------------------------------------------------\n";
cout<<"| 1. 图书信息录入 2. 图书信息查询 3. 图书信息删除 |\n";
cout<<"| 4. 读者办理注册 5. 读者信息查询 6. 办理借书手续 |\n";
cout<<"| 7. 办理还书手续 8 已借出图书 9.统计图书库存 |\n";
cout<<"| 按 \"0\"退出 |\n";
cout<<"----------------------------------------------------------\n";
cout<<" 请输入相应序号进行相应操作:";
cin>>order;
cin.clear();//清除缓冲区中后面的字符
cin.ignore(100,'\n');
switch(order)
{
case 1:
BookEntry();
break;
case 2:
BookMes();
break;
case 3:
DelBook();
break;
case 4:
ReaderEntry();
break;
case 5:
ReaderMes();
break;
case 6:
BorrowBook();
break;
case 7:
RtnBook();
break;
case 8:
BorrowMes();
break;
case 9:
CountBook();
break;
case 0:
break;
default:
cout<<"错误的命令行"<<endl;
break;
}
}while(order != 0);
system("pause");
return 0;
}