Linux下写的一个C++课程设计
2009-05-14 00:47
686 查看
主要是从网络里搬弄过来的一个课程设计。写得很赞。因为里面有STL的知识。(最近在开始阅读STL的书,发现其实大一的时候我们无意识中就运用过了)。逻辑很不错的一个代码。附上Makefile文件,如果不能make通过的欢迎讨论,因为我自己也没通过,哈哈……
Makefile
(这个Makefile文件比较难写点,哈……)
Database.h(比较有嚼头的文件,里面有迭代器)
下面的代码就都挺普通了,几个类文件,稍微看看就能懂的。
library_tmp_db.cpp
Book.h
Book.cpp
Librarian.h
Librarian.cpp
LibraryObject.h
LibraryObject.cpp
Reader.h
Reader.cpp
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; }
相关文章推荐
- C++课程设计之模拟一个微型生态系统
- 我想写一个Linux下的C++程序库--记我的C++库设计历程:设计一个TCP服务程序
- 操作系统课程设计1 Linux下编译c++文件
- 59.用C++ 设计一个不能被继承的类
- 在Linux平台下如何编译一个C++工程
- c++课程设计
- C++课程设计
- 学习LSM(Linux security module)之四:一个基于LSM的简单沙箱的设计与实现
- 16级C++课程设计 第二题
- 16级C++课程设计 第三题
- C++设计一个类不能偷懒的地方
- 发布一个 Linux 下的 C++ 多线程库
- ISE(Iris Server Engine)是一个基于现代C++的跨平台(Linux和Windows)框架
- 用C++设计一个不能被继承的类
- 用c++创建一个Linux上的Daemon程序,含SHELL管理脚本(三)
- c++课程设计 对日期的基本运算 使用重载
- C++课程设计:学生成绩管理系统
- 用C++ 设计一个不能被继承的类
- 用C++ 写一个学生类和课程类
- 看你是不是编程高手。。。。 用C++ 写一个学生类和课程类