1. 程式人生 > >C++ 實現小型圖書管理系統

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;

	
}