日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

基于C++實現酒店管理系統_C 語言

作者:qq_996852067 ? 更新時間: 2022-05-21 編程語言

現今大多數賓館所提供的服務樣式都各式各樣,規模大小也是各有不同,但是歸總下來,不可或缺的兩類模塊還是顧客和工作人員。由于對賓館行業內部沒有很深刻的理解,此次系統設計包括數據庫和功能模塊都是根據網上收集到的材料和個人認知上,簡單模仿和具體實現的。

為滿賓館管理的實際需求,本系統主要實現以下功能:

1、入住登記:登記所入住房間號碼,登記顧客入住時間,退房時間,個人信息(身份證號,手機號,姓名)
2、退房辦理:輸入已經入住的房間號,確認完畢即可退房。
3、房間查詢:管理員輸入正確的密碼后即可對房間狀態查詢,和具體入住信息查詢。
4、密碼修改:管理員對自身密碼進行修改,前提是先輸入正確密碼后才能實現。
5、以txt文檔的形式存儲信息數據。
6、使用類封裝。

注:代碼使用前需要先向代碼中自定義路徑下的Input.txt文檔中預存信息

功能截圖

代碼:

#include
#include
#include
#include
#include
#include
#include ?
#include
using namespace std;

class room
{
private:
?? ?int roomnumber = 0;?? ??? ?//房間號
?? ?int price = 0;?? ??? ??? ?//價格
?? ?int start_date = 0;?? ??? ?//開始 結束 日期
?? ?int end_date = 0;
?? ?bool order = 0;?? ??? ??? ?//房間狀態 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("房間狀態錯誤!");
?? ??? ?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)//覆蓋/更新原有文件內容
{
?? ?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本酒店設有 標準房, 商務套房 和 大床房. \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 是商務套間. 價格為 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(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(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 鍵繼續" << 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;//構建輸入流對象,以二進制形式打開,得到文件內容
?? ??? ?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小劉 酒店管理系統 ? ? ? ?\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);//設置背景和字體顏色
?? ??? ??? ?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);//設置背景和字體顏色
?? ??? ??? ?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(6), filename1, filename2);
?? ??? ??? ?}
?? ??? ??? ?if (temp2 == 2)
?? ??? ??? ?{
?? ??? ??? ??? ?checkout(p, static_cast(6), filename1);
?? ??? ??? ?}
?? ??? ??? ?if (temp2 == 3)
?? ??? ??? ?{
?? ??? ??? ??? ?string rightpassword = "123456";?? ??? ??? ?//默認初始密碼
?? ??? ??? ??? ?searchfor(p, 6, rightpassword);
?? ??? ??? ?}
?? ??? ??? ?system("pause");
?? ??? ??? ?system("cls");
?? ??? ?}
?? ?}
?? ?return 0;
}

注:代碼使用前需要先向代碼中自定義路徑下的Input.txt文檔中預存信息

原文鏈接:https://blog.csdn.net/weixin_43811333/article/details/107361540

欄目分類
最近更新