c++“美发店管理系统设计”
美發店管理系統設計
1、問題描述
定義顧客類,屬性有:會員卡號、姓名、性別、電話等信息和相關的對屬性做操作的行為。
定義員工類:屬性有:編號、姓名、性別、電話、美發項目(理發、燙發、洗發)等信 息和相關的對屬性做操作的行為。
定義美發類:屬性有各種美發項目的收費標準和相關的對屬性做操作的行為。
2、功能要求
(1)美發功能。根據顧客所要做的美發項目、服務的雇員、消費金額等將相應信息添 加到顧客類中指定顧客和員工類中指定員工信息里。
(2)簡單管理功能。
添加功能:程序能夠添加顧客信息和雇員信息,要求編號要唯一,如果添加了重復編號 的記錄時,則提示數據添加重復并取消添加。
查詢功能:可根據姓名、電話、卡號等信息對已添加的顧客信息進行查詢,如果未找到, 給出相應的提示信息,如果找到,則顯示相應的記錄信息;還可以根據姓名、工種編號等信 息對雇員信息進行查詢。
顯示功能:可顯示當前系統中所有顧客信息和雇員信息,每條信息占據一行。
編輯功能:可根據查詢結果對相應的記錄進行修改,修改時注意編號的唯一性。
刪除功能:主要實現對已添加的顧客和雇員記錄進行刪除。如果當前系統中沒有相應的 人員記錄,則提示“記錄為空!”并返回操作。
保存功能:可將當前系統中顧客和雇員記錄存入文件中,存入方式任意。 讀取功能:可將保存在文件中的信息讀入到當前系統中,供用戶進行使用。
(3)統計功能。能統計出顧客的消費總數、雇員的收入總數。都按從大到小排序。
3、問題的解決方案 根據系統功能要求,可以將問題解決分為以下步驟:
(1)應用系統分析,建立該系統的功能模塊框圖以及界面的組織和設計;
(2)分析系統中的各個實體及它們之間的關系;
(3)根據問題描述,設計系統的類層次;
(4)完成類層次中各個類的描述;
(5)完成類中各個成員函數的定義;
(6)完成系統的應用模塊;
(7)功能調試;
(8)完成系統總結報告。
一、 總體設計
1.1 主菜單的組成
主菜單中有6個選項:管理顧客,管理員工,管理美發項目,美發功能,統計功能,退出系統
1.2 子菜單的功能
三個管理子菜單均有6個選項:顯示信息,增加信息,刪除信息,查詢信息,保存信息,返回。
二、詳細設計
2.1 程序流程圖
(1)數據流圖
數據流圖是對系統數據流向的一種描述,并從本質上讓程序的使用者,大致了解系統的使用方法。本管理系統的大致流程圖如下:
(2)系統流程圖
系統流程圖是對系統的大致流程進行描述,本系統的系統流程圖如下:
2.2 程序模塊詳細設計
2.2.1 主菜單
借助switch語句進行下一步的選擇;
2.2.2 管理類子菜單
通過鏈表實現對數據的讀取寫入以及對數據的顯示,增加,刪除,查找,修改等功能;
以顧客管理子菜單界面為例:
2.2.3 美發功能
根據顧客所要做的美發項目編號、服務的雇員編號、消費金額等將相應信息添加到顧客類中指定顧客和員工類中指定員工信息里
2.2.4 統計功能
借助vector容器從文本文件中讀取數據并進行排序,統計出顧客的消費總數、雇員的收入總數。都按從大到小排序。
三、設計核心技術實現
3.1 讀取數據(以顧客類為例)
3.2 顯示數據(以顧客類為例)
//輸出函數將鏈表數據輸出 int print(node* head){cout << "卡號 姓名 性別 電話 累計消費" << endl<< "**********************************************************\n";if (m == 1){cout << "沒有顧客" << endl;return 0;}node* p;p = head->next;while (p != NULL){cout << p->Id << " " << p->Name << " " << p->Sex << " " << p->Phone << " " << p->Money<<endl;p = p->next;}system("PAUSE");//暫停程序的執行,等待任意健繼續執行}3.3 增加數據(以顧客類為例)
bool Findnode(node* head, int key)//查找是否存在Id為key的用戶{node* ptr = head;while (ptr != NULL && ptr->Id != key){ptr = ptr->next;}if (ptr != NULL){return 0;}else{return 1;}}//增加函數在鏈表后增加數據void creat(node* head){cout << "請輸入一個顧客信息:輸入完畢請保存(注:卡號僅為數字)" << endl<< "卡號 姓名 性別 電話" << endl<< "**********************************************************\n";cin >> p1->Id >> p1->Name >> p1->Sex >> p1->Phone;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> p1->Id >> p1->Name >> p1->Sex >> p1->Phone;}p1->Money = 0;if (Findnode(head, p1->Id) == 0){printf("卡號添加重復已取消添加");}if (Findnode(head, p1->Id) == 1){m = m + 1;p2->next = p1;p2 = p1;p1 = new node;p2->next = NULL;}}3.4 刪除數據(以顧客類為例)
//刪除函數刪去鏈表中指定節點 int Delete(node* head){int num;cout << "請輸入要刪除的卡號:輸入完畢請保存(注:卡號僅為數字)" << endl;cin >> num;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> num;}if (Findnode(head, num) == 1){cout << "記錄為空!" << endl;return 0;}node* p3, * p4, * t;p3 = head;if (p3->Id == num){t = head;head = t->next;}p4 = p3;p3 = p3->next;while (p3 != NULL){if (p3->Id == num){p4->next = p3->next;return 0;}p4 = p3;p3 = p3->next;}}3.5 查找修改數據(以顧客類為例)
//查詢函數查詢指定節點int Find(node* head){cout << "請選擇查詢方式:輸入0或1或2" << endl;cout << "通過顧客卡號查詢(0);通過顧客姓名查詢(1);通過顧客電話查詢(2)" << endl;int a;cin >> a;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >>a;}node* ptr = head->next;if (a == 0){int num;cout << "請輸入要查詢的顧客卡號(注:卡號僅為數字)" << endl;cin>>num;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> num;}while (ptr != NULL && ptr->Id != num){ptr = ptr->next;}}else if (a == 1){char name[15];cout << "請輸入要查詢的顧客姓名" << endl;cin >> name;while (ptr != NULL && strcmp(ptr->Name , name)!=0){ptr = ptr->next;}}else if (a == 2){char phone[15];cout << "請輸入要查詢的顧客電話" << endl;cin >> phone;while (ptr != NULL && strcmp(ptr->Phone , phone)!=0){ptr = ptr->next;}}else {cout << "error" << endl;return 0;}if (ptr == NULL){printf("未查找到該顧客");return 0;}else{cout << "卡號 姓名 性別 電話 累計消費(元)" << endl<< "**********************************************************\n";cout << ptr->Id << " " << ptr->Name << " " << ptr->Sex << " " << ptr->Phone << " " << ptr->Money << endl;}printf("是否要對信息進行修改:請輸入1(修改)或0(返回上一界面)\n");int n;cin >> n;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> n;}if (n){cout <<"請輸入修改后信息(注:累計消費僅為數字)" << endl<< "姓名 性別 電話 累計消費(元)" << endl<< "**********************************************************\n";cin >> ptr->Name >> ptr->Sex >> ptr->Phone>> ptr->Money;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> ptr->Name >> ptr->Sex >> ptr->Phone >> ptr->Money;}return 0;}}3.6 保存數據(以顧客類為例)
//保存將鏈表數據存入文本int WriteData(node* head){FILE* fp;node* p;fp = fopen("Customer.txt", "w");p = head;while (p != NULL){fprintf(fp, "%d %s %s %s %d\n", p->Id, p->Name, p->Sex, p->Phone,p->Money);//按格式輸出到流p = p->next;}fprintf(fp, "\0");rewind(fp);//把當前的讀寫位置回到文件開始cout << "保存成功!";fclose(fp);//關閉文件return 0;}3.7美發功能
//美發功能函數 void hair() {cout << "請輸入顧客卡號(注:卡號僅為數字)" << endl;int a, b, c;cin >> a;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> a;}Customer a1;Customer::node* head1=a1.ReadData(),*ptr1;ptr1 = head1->next;while (ptr1 != NULL && a != ptr1->Id){ptr1 = ptr1->next;}if (ptr1 == NULL){printf("不存在該用戶");menu();}else{cout << "卡號 姓名 性別 電話 累計消費(元)" << endl;cout << ptr1->Id << " " << ptr1->Name << " " << ptr1->Sex << " " << ptr1->Phone << " " << ptr1->Money << endl;cout << "請輸入員工編號" << endl;cin >> b;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> b;}Worker b1;Worker::node* head2 = b1.ReadData(),*ptr2;ptr2 = head2->next;while (ptr2 != NULL && b != ptr2->Id){ptr2 = ptr2->next;}if (ptr2 == NULL){printf("不存在該員工");menu();}else{cout << "編號 姓名 性別 電話 收入總數(元)" << endl;cout << ptr2->Id << " " << ptr2->Name << " " << ptr2->Sex << " " << ptr2->Phone << " " << ptr2->Money << endl;cout << "請輸入顧客所做美發項目編號" << endl;cin >> c;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> c;}Item c1;Item::node* head3 = c1.ReadData(), * ptr3;ptr3 = head3->next;while (ptr3 != NULL && b != ptr3->Id){ptr3 = ptr3->next;}if (ptr3 == NULL){printf("不存在該美發項目");menu();}else{cout << "編號 項目 價格(元)" << endl;cout << ptr3->Id << " " << ptr3->item << " " << ptr3->Price << endl;ptr1->Money += ptr3->Price;ptr2->Money += ptr3->Price;cout << "**********************************************************\n"<<"美發完成后數據" << endl;cout << "顧客卡號 姓名 性別 電話 累計消費(元)" << endl;cout << ptr1->Id << " " << ptr1->Name << " " << ptr1->Sex << " " << ptr1->Phone << " " << ptr1->Money << endl;cout << "員工編號 姓名 性別 電話 收入總數(元)" << endl;cout << ptr2->Id << " " << ptr2->Name << " " << ptr2->Sex << " " << ptr2->Phone << " " << ptr2->Money << endl;a1.WriteData(head1);b1.WriteData(head2);}}}menu(); }3.8 統計功能
//統計功能函數 struct node {int Id;//編號char Name[15];//姓名char Sex[4];//性別char Phone[15];//電話號碼int Money; }; bool cmp(node a, node b) {return a.Money > b.Money; } void Sort() {cout << "請輸入0(統計顧客數據)或1(統計員工數據)"<<endl;bool x;cin >> x;while (cin.fail()){cin.clear();cin.ignore();cout << "輸入錯誤,請重新輸入" << endl;cin >> x;}vector<node> a;node c;FILE* fp;if (x == 0){cout << "顧客卡號 姓名 性別 電話 消費總數" << endl<< "**********************************************************\n";fp = fopen("Customer.txt", "r");}else if(x == 1){cout << "員工編號 姓名 性別 電話 收入總數" << endl<< "**********************************************************\n";fp = fopen("Worker.txt", "r");}else{cout << "error"<<endl;Sort();}bool f = 0;while (!feof(fp))//沒有到文件尾時{fscanf(fp, "%d %s %s %s %d\n", &c.Id,&c.Name, &c.Sex, &c.Phone, &c.Money);//fscanf() 從流中按格式讀取 if (f){a.push_back(c);}f = 1;}sort(a.begin(), a.end(),cmp);int i = a.size();for (vector<node>::iterator it = a.begin(); it != a.end(); it++){cout << it->Id << " " << it->Name << " " << it->Sex << " " << it->Phone << " " << it->Money << endl;}menu(); }3.9 判斷輸入是否正確(以int型數據為例)
int num; cin >> num; while(cin.fail())//判斷cin的狀態的,如果cin為錯誤狀態則返回1,正常狀態則返回0{cin.clear();//清除cin的錯誤狀態cin.ignore();//忽略掉緩沖區的內容,直到遇到EOF為止cout << "輸入錯誤,請重新輸入"<<endl;cin >> num;}c++美發店管理系統設計.zip(含項目報告)
總結
以上是生活随笔為你收集整理的c++“美发店管理系统设计”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U盘点击提示文件或目录损坏且无法读取打不
- 下一篇: Android--打造流行的无数据空布局