您的位置:首页 > 运维架构 > Linux

Linux下写的一个C++课程设计

2009-05-14 00:47 686 查看
  主要是从网络里搬弄过来的一个课程设计。写得很赞。因为里面有STL的知识。(最近在开始阅读STL的书,发现其实大一的时候我们无意识中就运用过了)。逻辑很不错的一个代码。附上Makefile文件,如果不能make通过的欢迎讨论,因为我自己也没通过,哈哈……



  Makefile

Library.out : library_tmp_db.o LibraryObject.o Librarian.o Book.o Reader.o
	g++ -o Library.out library_tmp_db.o LibraryObject.o Librarian.o Book.o Reader.o
library_tmp_db.o : library_tmp_db.cpp LibraryObject.h Reader.h Book.h Database.h Librarian.h
	g++ -c library_tmp_db.cpp
LibraryObject.o : LibraryObject.cpp LibraryObject.h
	g++ -c LibraryObject.cpp 
Librarian.o : Librarian.cpp LibraryObject.h Reader.h Book.h Database.h Librarian.h
	g++ -c Librarian.cpp 
Book.o : Book.cpp LibraryObject.h Book.h
	g++ -c Book.cpp 
Reader.o : Reader.cpp LibraryObject.h Reader.h
	g++ -c Reader.cpp


(这个Makefile文件比较难写点,哈……)





  Database.h(比较有嚼头的文件,里面有迭代器)

#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <typeinfo>
#include <iterator>
#include "LibraryObject.h"
using namespace std;
template <class T>
class Database : public object
{
private:
	fstream File;	
	string FileName;	
	long FileLen, rec_size;	
	typedef map<string, T, less<string> > mmtype;
 	
	mmtype RecMap;	
	int MaxID;	
public:	
    
	Database() ;
	~Database(){SaveMap();}
	void Insert(T &);	
	void Delete(string);	
	T * Query(string);	
	void InitiMap();	
	void SaveMap();	
	void ShowAllData();
};
template <class T>
Database<T>::Database() : FileName(T::GetFileName())
{
	rec_size = sizeof(T);
	InitiMap();	
}
template <class T>
void Database<T>::Insert(T & Object)	
{
	MaxID++;	
	Object.SetIndex(MaxID);	
	RecMap.insert(mmtype::value_type (Object.GetName(), Object) );
}
template <class T>
T * Database<T>::Query(string ObjName)	
{
	typename mmtype::iterator iter;
	iter = RecMap.find(ObjName);	
	if(iter == RecMap.end())
	{	
		string c_name = typeid(T).name();
		int NameLen = c_name.size();
		string s = "Don't find this "
                   + c_name.substr(6, NameLen) + "'s data!/n";
		throw(s);
	}
	return &(iter->second);	//肚тン
}
template <class T>
void Database<T>::Delete(string ObjName) 
{
	Query(ObjName);
	RecMap.erase(ObjName);	
}
template <class T>
void Database<T>::InitiMap()
{
	fstream File;
	MaxID = 0;		
	
	File.open(FileName.data(), ios::in | ios::binary);
	File.seekg(0, ios::end);	
	if(!File) return;	
	FileLen = File.tellg();
	if(FileLen == 0){
		File.close();
		return;
	}
	T Object;
	File.seekg(0, ios::beg);
		
	do{	
		File.read((char *) & Object, rec_size);
		if(Object.GetIndex() > MaxID)
			MaxID = Object.GetIndex();
		RecMap.insert(mmtype::value_type (Object.GetName(), Object) );
	}while(File.tellg() < FileLen);
	File.close();
}
template <class T>
void Database<T>::SaveMap()	
{
	typename mmtype::const_iterator iter;
	T Object;
	File.open(FileName.data(), ios::out | ios::binary | ios::trunc);
	
	for(iter = RecMap.begin() ; iter != RecMap.end() ; ++iter)
		File.write((char *) & iter->second, rec_size);
     	
	File.close();
}
template <class T>
void Database<T>::ShowAllData()	
{
	typename mmtype::iterator iter;
	T Object;
	if(RecMap.empty())
		cout << "no data!" << endl;
	else
		for(iter = RecMap.begin() ; iter != RecMap.end() ; ++iter)
			(iter->second).ShowData();	
}






  下面的代码就都挺普通了,几个类文件,稍微看看就能懂的。



library_tmp_db.cpp

#include <iostream>
#include <map>
#include <string>
#include <fstream>
#include <string.h>
#include "LibraryObject.h"	
#include "Reader.h"
#include "Book.h"
#include "Database.h"
#include "Librarian.h"
using namespace std;
int main()		
{
	char choice = 'I';
	Librarian librarian;
	while( !(choice == 'E' || choice == 'e') )
	{
		cout << "check (O)ut, check (I)n, (B)ook's data,";
        cout << " (R)eader's data, (E)xit :" << endl;
		cin >> choice;	
		switch(choice)
		{
		case 'o':		
		case 'O':	
			librarian.CheckOut();	
			break;
		case 'i':		
		case 'I':
			cout << "Let you practice!" << endl;
			break;
		case 'b':		
		case 'B':	
			librarian.BookData();			
			break;
		case 'r':		
		case 'R':	
			librarian.ReaderData();
			break;
		case 'e':
		case 'E':	
			break;
		default:
			cout << "Don't provide this function!" << endl;
		}
	};
}






Book.h

#include "LibraryObject.h"
class Book : public LibraryObject
{
private:
	char name[40];	
	bool OnShelf;	
	static char FileName[40];	
public:	
	
	Book(const char * i_name) : OnShelf(true)
    { strcpy(Book::name, i_name); }
	Book( ) {}
	void CheckOut();
	const char * GetName ( ) { return name; }	
	void ShowData();
	void SetName(const char * i_name) 
    { strcpy(name, i_name); }
	static char * GetFileName ( )
    { return FileName;}
};






Book.cpp

#include "Book.h"
char Book::FileName[40] = "Book.bin";
void Book::CheckOut()	
{
	if(OnShelf == false)
		throw("Book is not on shelf!/n");
	
	OnShelf = false;
}
void Book::ShowData()
{
	cout << index << "  " << name << "  ";
	if(OnShelf == false)
		cout << "  Not on shelf" << endl;
	else
		cout << "  On shelf" << endl;
}






Librarian.h

#include <iostream>
using namespace std;
#include "LibraryObject.h"
class Librarian : public LibraryObject
{
public:
	void CheckOut();	
	void BookData();
	void ReaderData();
};






Librarian.cpp

#include <iostream>
#include "Librarian.h"
#include "Database.h"
#include "Reader.h"
#include "Book.h"
using namespace std;
void Librarian::CheckOut()	
{
	char r_name[20], b_name[40];
	Database<Reader> ReaderDB;
	Database<Book> BookDB;
	try{
		cout << "Please input Reader's name :" << endl;
		cin >> r_name;
		Reader * reader = ReaderDB.Query(r_name);
  
		cout << "Please input Book's name :" << endl;
		cin.ignore(1);
		cin.get(b_name, 40, '/n') ;
		Book * book = BookDB.Query(b_name);	
		book->CheckOut();
		reader->BorrowBook(book->GetIndex());	
	}
	catch(string s) { cerr << s;}
}
void Librarian::BookData()	
{
	char choice = 'I';
	char b_name[40];
	Database<Book> BookDB;
	Book * book;
	while ( !(choice == 'E' || choice == 'e') )
	{
		cout << "Maintain Book Database" << endl;
		cout << "(I)nsert new data, (U)pdate data, (D)elete data,"
			 <<	" (Q)uery data, (S)how all data, (E)xit  : " << endl;
		cin >> choice;	
		
		try{
			switch(choice)
			{
			case 'i':
			case 'I':	
				cout << "Please input a Book's name : " << endl;
				cin.ignore(1);
				cin.get(b_name, 40, '/n');
				book = new Book(b_name);
				BookDB.Insert(*book);
				break;
			case 'u':
			case 'U':
				cout << "Please input Book's name : " << endl;
				cin.ignore(1);
				cin.get(b_name, 40, '/n');
				book = BookDB.Query(b_name); 
				cout << "Please input Book's new name :" << endl;
				cin.ignore(1);
				cin.get(b_name, 40, '/n');
				book->SetName(b_name);	
				break;
			case 'd':
			case 'D':	
				cout << "Please input Book's name : " << endl;
				cin.ignore(1);
				cin.get(b_name, 40, '/n');
				BookDB.Delete(b_name);	
				break;
			case 'q':
			case 'Q':	
				cout << "Let you practice!" << endl;
				break;
			case 's':
			case 'S':	
				BookDB.ShowAllData();
				break;
			case 'e':
			case 'E':	
				break;
			default:
				cout << "Don't provide this function !" << endl;
			}
		}
		catch(string s) { cerr << s;}
	};
}
void Librarian::ReaderData()	
{
	char choice = 'I' , r_name[40];		
	Database<Reader> ReaderDB;
	Reader * reader;
		
	while ( !(choice == 'E' || choice == 'e') )
	{
		cout << "Maintain Reader Database" << endl;
		cout << "(I)nsert new data, (U)pdate data, (D)elete data,"
  			 << " (Q)uery data, (S)how all data, (E)xit  : " << endl;
		cin >> choice;
		try{
			switch(choice)
			{
			case 'i':
			case 'I':
				cout << "Please input a Reader's name : " << endl;
				cin >> r_name;
				reader = new Reader(r_name);
				ReaderDB.Insert(*reader);
				break;
			case 'u':
			case 'U':	
				cout << "Please input Reader's name : " << endl;
				cin >> r_name;
				reader = ReaderDB.Query(r_name);
			
				cout << "Please input Reader's new name :" << endl;
				cin >> r_name;
				reader->SetName(r_name);	
				break;
			case 'd':
			case 'D':	
				cout << "Please input Reader's name : " << endl;
				cin >> r_name;
	
				ReaderDB.Delete(r_name);
				break;
			case 'q':
			case 'Q':	
				cout << "Let you practice!" << endl;
				break;
			case 's':
			case 'S':
				ReaderDB.ShowAllData();
				break;
			case 'e':
			case 'E':
				break;
			default:
				cout << "Don't provide this function !" << endl;
			}
		}
		catch(string s) { cerr << s;}
	};
}






LibraryObject.h

#ifndef _LIBRARYOBJECT_H_
#define _LIBRARYOBJECT_H_
#include <iostream>
using namespace std;
class object{};	
class LibraryObject : public object
{
protected:
	int index;	
	char name[20];	
public:	
	LibraryObject (int index, const char * name);
	LibraryObject (const char * i_name);
	LibraryObject ();
	const char * GetName ( );	
	int GetIndex ( );
	virtual void ShowData();
	void SetIndex(int i_index);
	void SetName(const char * i_name);
};
#endif






LibraryObject.cpp

#include "LibraryObject.h"
LibraryObject::LibraryObject(int index, const char * name)
: index(index) { SetName(name);}
LibraryObject::LibraryObject (const char * i_name)
{ strcpy(name, i_name);}
LibraryObject::LibraryObject () {}
const char * LibraryObject::GetName ( ) 
{ return name; }
int LibraryObject::GetIndex ( ) { return index; }	
void LibraryObject::ShowData()
{ cout << index << "  " << name << "  ";}
void LibraryObject::SetIndex(int i_index) 
{ index = i_index; }
void LibraryObject::SetName(const char * i_name) //砞﹚嘿
{ strcpy(name, i_name); }






Reader.h

#include <iostream>
#include "LibraryObject.h"
using namespace std;
class Reader : public LibraryObject
{
private:
	int BorBookList[10];	
	static const char FileName[40];
public:	
	Reader(const char *) ;
	Reader( ) {}
	void BorrowBook(int);	
	static const char * GetFileName( )	
    { return FileName;}
	void ShowData();
};




Reader.cpp

#include <iostream>
#include "Reader.h"
using namespace std;
const char Reader::FileName[40] = "Reader.bin";
Reader::Reader(const char * name) : LibraryObject(name)
{
	for(int i = 0; i < 10; ++i)
		BorBookList[i] = 0;
}
void Reader::BorrowBook(int BookID)
{
	for(int i = 0; i < 10; ++i)
	{
		if (BorBookList[i] == 0)
		{
			BorBookList[i] = BookID;	
			return;
		}
	}
}
void Reader::ShowData()
{
	LibraryObject::ShowData();
	cout << endl << "Brorow book's index list : [ ";
	for (int i = 0 ; i < 10; i++)
		cout << BorBookList[i] << " | ";
	cout << "]" << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: