基于C++實現(xiàn)酒店管理系統(tǒng)
現(xiàn)今大多數(shù)賓館所提供的服務(wù)樣式都各式各樣,規(guī)模大小也是各有不同,但是歸總下來,不可或缺的兩類模塊還是顧客和工作人員。由于對賓館行業(yè)內(nèi)部沒有很深刻的理解,此次系統(tǒng)設(shè)計包括數(shù)據(jù)庫和功能模塊都是根據(jù)網(wǎng)上收集到的材料和個人認知上,簡單模仿和具體實現(xiàn)的。
為滿賓館管理的實際需求,本系統(tǒng)主要實現(xiàn)以下功能:
1、入住登記:登記所入住房間號碼,登記顧客入住時間,退房時間,個人信息(身份證號,手機號,姓名)
2、退房辦理:輸入已經(jīng)入住的房間號,確認完畢即可退房。
3、房間查詢:管理員輸入正確的密碼后即可對房間狀態(tài)查詢,和具體入住信息查詢。
4、密碼修改:管理員對自身密碼進行修改,前提是先輸入正確密碼后才能實現(xiàn)。
5、以txt文檔的形式存儲信息數(shù)據(jù)。
6、使用類封裝。
注:代碼使用前需要先向代碼中自定義路徑下的Input.txt文檔中預(yù)存信息
功能截圖
代碼:
#include<iostream> #include<iomanip> #include<string> #include<fstream> #include<sstream> #include<windows.h> #include<stdexcept> ? #include<conio.h> using namespace std; class room { private: ?? ?int roomnumber = 0;?? ??? ?//房間號 ?? ?int price = 0;?? ??? ??? ?//價格 ?? ?int start_date = 0;?? ??? ?//開始 結(jié)束 日期 ?? ?int end_date = 0; ?? ?bool order = 0;?? ??? ??? ?//房間狀態(tài) 0/1 ?? ?string name;?? ??? ??? ?//個人信息 ?? ?string ID; ?? ?string phone; public: ?? ?void getnumber(int _number) ?? ?{ ?? ??? ?roomnumber = _number; ?? ?} ?? ?int returnnumber() const ?? ?{ ?? ??? ?return roomnumber; ?? ?} ?? ?void getprice(int _price) ?? ?{ ?? ??? ?price = _price; ?? ?} ?? ?int returnprice() const ?? ?{ ?? ??? ?return price; ?? ?} ?? ?void getdate(int s, int e) ?? ?{ ?? ??? ?if (s < 1 || s > 31 || e < 1 || e > 31 || s >= e) throw runtime_error("錯誤的日期!"); ?? ??? ?start_date = s; ?? ??? ?end_date = e; ?? ?} ?? ?int returnstartdate() const ?? ?{ ?? ??? ?return start_date; ?? ?} ?? ?int returnenddate() const ?? ?{ ?? ??? ?return end_date; ?? ?} ?? ?void getorder(bool _order) ?? ?{ ?? ??? ?if (!(_order == 0 || _order == 1)) throw out_of_range("房間狀態(tài)錯誤!"); ?? ??? ?order = _order; ?? ?} ?? ?bool returnorder() const ?? ?{ ?? ??? ?return order; ?? ?} ?? ?void getname(string _name) ?? ?{ ?? ??? ?name = _name; ?? ?} ?? ?string returnname() const ?? ?{ ?? ??? ?return name; ?? ?} ?? ?void getID(string id) ?? ?{ ?? ??? ?if (id.size() < 18 || id.size() > 19) throw runtime_error("您的身份證號輸入有誤,請重新輸入!(18位)"); ?? ??? ?ID = id; ?? ?} ?? ?string returnID() const ?? ?{ ?? ??? ?return ID; ?? ?} ?? ?void getphone(string ph) ?? ?{ ?? ??? ?if (ph.size() != 11) ?? ??? ??? ?throw runtime_error("您的手機號輸入有誤,請重新輸入(11位)!"); ?? ??? ?phone = ph; ?? ?} ?? ?string returnphone() const ?? ?{ ?? ??? ?return phone; ?? ?} ?? ?int sumprice() ?? ?{ ?? ??? ?return price * (end_date - start_date); ?? ?} ?? ?friend ostream& operator<<(ostream& os, const room* u)//輸出流重載 ?? ?{ ?? ??? ?os << u->returnnumber() << '\n'; ?? ??? ?os << u->returnprice() << '\n'; ?? ??? ?os << u->returnstartdate() << '\n'; ?? ??? ?os << u->returnenddate() << '\n'; ?? ??? ?os << u->returnorder() << '\n'; ?? ??? ?os << u->returnname() << '\n'; ?? ??? ?os << u->returnID() << '\n'; ?? ??? ?os << u->returnphone() << '\n'; ?? ??? ?return os; ?? ?} }; class standard :public room { }; class suite :public room { }; class kingsize :public room { }; void nomorememory() { ?? ?cerr << "unable to satisfy request for memory\n"; ?? ?abort(); } //new分配異常 int check(int a[], int size, int suspicion) { ?? ?int judge = 0; ?? ?for (int i = 0; i < size; i++) ?? ?{ ?? ??? ?if (suspicion == a[i]) ?? ??? ??? ?judge = 1; ?? ?} ?? ?if (judge == 0) ?? ??? ?throw suspicion; ?? ?return 0; } class file_exception { ?? ?string filename; public: ?? ?file_exception(const string& filename) :filename(filename) {} ?? ?~file_exception() {} ?? ?const string& get_filename()const { return filename; } }; void update(room* p[], const string& filename)//覆蓋/更新原有文件內(nèi)容 { ?? ?ofstream os(filename, ios_base::binary); ?? ?if (os) ?? ?{ ?? ??? ?for (int i = 0; i < 6; i++) ?? ??? ?{ ?? ??? ??? ?os << p[i]; ?? ??? ?} ?? ?} ?? ?else ?? ??? ?throw file_exception(filename); ?? ?os.close(); } void addRecord(const string& filename, room* current)//以追加模式打開文件,用于記錄 { ?? ?ofstream file(filename, ios_base::app); ?? ?if (file) ?? ?{ ?? ??? ?file << current; ?? ??? ?file.close(); ?? ?} ?? ?else ?? ??? ?throw file_exception(filename); ?? ?file.close(); } void password(string rightpassword) { part4: ?? ?string password; ?? ?cout << "請輸入 密碼: " << endl; ?? ?int i = 0; ?? ?char ch; ?? ?while ((ch = _getch()) != 13) ?? ?{ ?? ??? ?password += ch; //字符串拼接 ?? ??? ?cout << "*"; ?? ?} ?? ?if (password != rightpassword) ?? ?{ ?? ??? ?cout << "密碼錯誤! 請重新輸入" << endl; ?? ??? ?goto part4; ?? ?} ?? ?cout << "密碼正確!" << endl; ?? ?fflush(stdin); } void checkin(room* p[], int size, const string& filename1, const string& filename2) { ?? ?HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//句柄 ?? ?cout.width(120); ?? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); ?? ?cout << "歡迎來到 小劉 酒店!\n本酒店設(shè)有 標準房, 商務(wù)套房 和 大床房. \n目前可入住房間為: " << endl; ?? ?int vacant_room[6]; ?? ?int j = 0; ?? ?int temp, temp1; ?? ?string str; ?? ?for (int i = 0; i < 6; i++) ?? ?{ ?? ??? ?if (p[i]->returnorder() == 0) ?? ??? ?{ ?? ??? ??? ?temp1 = p[i]->returnnumber(); ?? ??? ??? ?cout << temp1 << "、"; ?? ??? ??? ?vacant_room[j] = temp1; ?? ??? ??? ?j++; ?? ??? ?} ?? ?} ?? ?cout << endl << "101-102 是標準間. 價格為 100 CNY 每晚" << endl; ?? ?cout << "103-104 是商務(wù)套間. 價格為 200 CNY 每晚" << endl; ?? ?cout << "105-106 是大床房. 價格為 300 CNY 每晚" << endl; part1: ?? ?try ?? ?{ ?? ??? ?cout << '\n' << setiosflags(ios_base::left) << " 請輸入你選擇的房間號." << endl; ?? ??? ?cout << "共有 " << j << " 間空房." << endl; ?? ??? ?cin >> temp; ?? ??? ?check(vacant_room, j, temp); ?? ?} ?? ?catch (int e) ?? ?{ ?? ??? ?cout << "房間 " << e << " 不可選擇入住,請重新選擇." << endl; ?? ??? ?goto part1; ?? ?} ?? ?room* current = NULL; ?? ?for (int i = 0; i < 6; i++) ?? ?{ ?? ??? ?if (p[i]->returnnumber() == temp) ?? ??? ?{ ?? ??? ??? ?current = p[i]; ?? ??? ??? ?break; ?? ??? ?} ?? ?} part2: ?? ?try ?? ?{ ?? ??? ?cout << "請輸入 入住 日期" << endl; ?? ??? ?cin >> temp; ?? ??? ?cout << "請輸入 離店 日期" << endl; ?? ??? ?cin >> temp1; ?? ??? ?current->getdate(temp, temp1); ?? ??? ?cout << "請輸入您的 姓名 " << endl; ?? ??? ?cin >> str; ?? ??? ?current->getname(str); ?? ??? ?cout << "請輸入您的 身份證號 " << endl; ?? ??? ?cin >> str; ?? ??? ?current->getID(str); ?? ??? ?cout << "請輸入您的 手機號 " << endl; ?? ??? ?cin >> str; ?? ??? ?current->getphone(str); ?? ??? ?current->getorder(static_cast<bool>(1)); ?? ??? ?cout << "您的 消費金額 "; ?? ??? ?temp = current->sumprice(); ?? ??? ?cout << temp << endl; ?? ?} ?? ?catch (runtime_error& e) ?? ?{ ?? ??? ?cout << e.what() << endl; ?? ??? ?goto part2; ?? ?} ?? ?catch (out_of_range& e) ?? ?{ ?? ??? ?cout << e.what() << endl; ?? ??? ?goto part2; ?? ?} ?? ?cout << resetiosflags(ios_base::left); ?? ?try ?? ?{ ?? ??? ?update(p, filename1); ?? ??? ?addRecord(filename2, current); ?? ?} ?? ?catch (file_exception& e) ?? ?{ ?? ??? ?cout << "Fail to open " << e.get_filename() << endl; ?? ?} } void checkout(room* p[], int size, const string& filename) { ?? ?int temp; ?? ?HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//句柄 ?? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); ?? ?cout << " 感謝您的光臨,歡迎您下次入住! " << endl; ?? ?cout << endl; part3: ?? ?cout << " 請輸入你想要 退房 的房間號." << endl; ?? ?cin >> temp; ?? ?room* current = NULL; ?? ?cout << setiosflags(ios_base::left); ?? ?int orderroom[6]; ?? ?int j = 0; ?? ?try ?? ?{ ?? ??? ?for (int i = 0; i < 6; i++) ?? ??? ?{ ?? ??? ??? ?if (p[i]->returnnumber() == temp) ?? ??? ??? ?{ ?? ??? ??? ??? ?current = p[i]; ?? ??? ??? ?} ?? ??? ??? ?if (p[i]->returnorder() == 1) ?? ??? ??? ?{ ?? ??? ??? ??? ?orderroom[j] = p[i]->returnnumber(); ?? ??? ??? ??? ?j++; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?check(orderroom, j, temp); ?? ?} ?? ?catch (int e) ?? ?{ ?? ??? ?cout << "房間 " << e << " 錯誤,請重新輸入!" << endl; ?? ??? ?goto part3; ?? ?} ?? ?cout << resetiosflags(ios_base::left); ?? ?current->getorder(static_cast<bool>(0)); ?? ?try ?? ?{ ?? ??? ?update(p, filename); ?? ?} ?? ?catch (file_exception& e) ?? ?{ ?? ??? ?cout << "Fail to open " << e.get_filename() << endl; ?? ?} } void searchfor(room* p[], int size, string& rightpassword) { ?? ?int temp1; ?? ?password(rightpassword); ?? ?cout << "如果您想要修改密碼 請輸入 1 , 2 鍵繼續(xù)" << endl; ?? ?cin >> temp1; ?? ?fflush(stdin); ?? ?if (temp1 == 1) ?? ?{ ?? ??? ?password(rightpassword); ?? ??? ?cout << "請輸入新的密碼 " << endl; ?? ??? ?rightpassword = ' '; ?? ??? ?cin >> rightpassword; ?? ?} ?? ?HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//句柄 ?? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); ?? ?cout << "請輸入想要查詢的房間號 ." << endl; ?? ?cin >> temp1; ?? ?for (int i = 0; i < 6; i++) ?? ?{ ?? ??? ?if (p[i]->returnnumber() == temp1) ?? ??? ?{ ?? ??? ??? ?cout << p[i] << endl; ?? ??? ??? ?break; ?? ??? ?} ?? ?} } int main() { ?? ?room* p[10]; ?? ?set_new_handler(nomorememory);//處理new分配異常 ?? ?for (int i = 0; i < 2; i++) ?? ?{ ?? ??? ?p[i] = new standard(); ?? ?} ?? ?for (int i = 2; i < 4; i++) ?? ?{ ?? ??? ?p[i] = new suite(); ?? ?} ?? ?for (int i = 4; i < 6; i++) ?? ?{ ?? ??? ?p[i] = new kingsize(); ?? ?} ?? ?const string filename1 = "此處填寫路徑 ? \\Input.txt"; ?? ?const string filename2 = "此處填寫路徑 ? \\Output.txt"; ?? ?try ?? ?{ ?? ??? ?ifstream ifs;//構(gòu)建輸入流對象,以二進制形式打開,得到文件內(nèi)容 ?? ??? ?ifs.open(filename1, ios_base::binary); ?? ??? ?if (ifs) ?? ??? ?{ ?? ??? ??? ?for (int i = 0; i < 6; i++) ?? ??? ??? ?{ ?? ??? ??? ??? ?int roomnumber, price, start_date, end_date; ?? ??? ??? ??? ?bool order; ?? ??? ??? ??? ?string name; ?? ??? ??? ??? ?string ID; ?? ??? ??? ??? ?string phone; ?? ??? ??? ??? ?ifs >> roomnumber >> price >> start_date >> end_date >> order >> name >> ID >> phone; ?? ??? ??? ??? ?p[i]->getnumber(roomnumber); ?? ??? ??? ??? ?p[i]->getprice(price); ?? ??? ??? ??? ?p[i]->getdate(start_date, end_date); ?? ??? ??? ??? ?p[i]->getorder(order); ?? ??? ??? ??? ?p[i]->getname(name); ?? ??? ??? ??? ?p[i]->getID(ID); ?? ??? ??? ??? ?p[i]->getphone(phone); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?else ?? ??? ??? ?throw file_exception(filename1); ?? ??? ?ifs.close(); ?? ?} ?? ?catch (file_exception& e) ?? ?{ ?? ??? ?cout << "Fail to open " << e.get_filename() << endl; ?? ?} ?? ?catch (runtime_error& e) ?? ?{ ?? ??? ?cout << e.what() << endl; ?? ?} ?? ?catch (out_of_range& e) ?? ?{ ?? ??? ?cout << e.what() << endl; ?? ?} ?? ?int temp; ?? ?HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//句柄 ?? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); ?? ?printf("▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n\n"); ?? ?cout << "\t\t\t小劉 酒店管理系統(tǒng) ? ? ? ?\n\n\t\t游客 please input 1. 管理員 please input 2." << endl; ?? ?printf("\n▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n\n"); ?? ?cin >> temp; ?? ?system("cls"); ?? ?if (temp == 1) ?? ?{ ?? ??? ?while (1) ?? ??? ?{ ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//設(shè)置背景和字體顏色 ?? ??? ??? ?cout << "歡迎來到 小劉 酒店!(游客)\n "; ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); ?? ??? ??? ?cout << "若你想要安全退出 ,please input 0. \n "; ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_BLUE); ?? ??? ??? ?cout << "若你想要入住酒店, please input 1.\n "; ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); ?? ??? ??? ?cout << "若你想要辦理退房, please input 2.\n"; ?? ??? ??? ?int temp2; ?? ??? ??? ?string str; ?? ??? ??? ?cin >> temp2; ?? ??? ??? ?system("cls"); ?? ??? ??? ?if (temp2 == 0) ?? ??? ??? ??? ?break; ?? ??? ??? ?if (temp2 == 1) ?? ??? ??? ?{ ?? ??? ??? ??? ?checkin(p, 6, filename1, filename2); ?? ??? ??? ?} ?? ??? ??? ?if (temp2 == 2) ?? ??? ??? ?{ ?? ??? ??? ??? ?checkout(p, 6, filename1); ?? ??? ??? ?} ?? ??? ??? ?cout << "succeed!" << endl; ?? ??? ??? ?system("pause"); ?? ??? ??? ?system("cls"); ?? ??? ?} ?? ?} ?? ?if (temp == 2) ?? ?{ ?? ??? ?while (1) ?? ??? ?{ ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//設(shè)置背景和字體顏色 ?? ??? ??? ?cout << "歡迎來到 小劉 酒店!(管理員)\n "; ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); ?? ??? ??? ?cout << "若你想要安全退出 ,please input 0. \n "; ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_BLUE); ?? ??? ??? ?cout << "若你想要入住酒店, please input 1.\n "; ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); ?? ??? ??? ?cout << "若你想要辦退房, please input 2.\n "; ?? ??? ??? ?SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); ?? ??? ??? ?cout << "若你想要查詢房間信息, please input 3.\n"; ?? ??? ??? ?int temp2; ?? ??? ??? ?string str; ?? ??? ??? ?cin >> temp2; ?? ??? ??? ?system("cls"); ?? ??? ??? ?if (temp2 == 0) ?? ??? ??? ??? ?break; ?? ??? ??? ?if (temp2 == 1) ?? ??? ??? ?{ ?? ??? ??? ??? ?checkin(p, static_cast<int>(6), filename1, filename2); ?? ??? ??? ?} ?? ??? ??? ?if (temp2 == 2) ?? ??? ??? ?{ ?? ??? ??? ??? ?checkout(p, static_cast<int>(6), filename1); ?? ??? ??? ?} ?? ??? ??? ?if (temp2 == 3) ?? ??? ??? ?{ ?? ??? ??? ??? ?string rightpassword = "123456";?? ??? ??? ?//默認初始密碼 ?? ??? ??? ??? ?searchfor(p, 6, rightpassword); ?? ??? ??? ?} ?? ??? ??? ?system("pause"); ?? ??? ??? ?system("cls"); ?? ??? ?} ?? ?} ?? ?return 0; }
注:代碼使用前需要先向代碼中自定義路徑下的Input.txt文檔中預(yù)存信息
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。