名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》
創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊)
專欄介紹:《編程項目實戰》
目錄
- 一、項目介紹與亮點功能
- 1. 項目背景
- 2.完整代碼
- 3. 核心功能亮點
- 二、面向對象設計架構解析
- 1. 類設計思路
- 2. 系統架構可視化
- 3. 封裝性體現
- 三、核心功能實現詳解
- 1. 點餐流程可視化
- 2. 智能點餐邏輯
- 3. 訂單編號生成機制
- 3. 訂單編號生成機制
- 4. 菜單分類展示
- 四、智能優惠系統設計
- 1. 算法工作原理可視化
- 2. 多重優惠策略
- 3. 優惠計算算法
- 五、程序運行演示與測試
- 1. 主界面展示
- 2. 點餐流程演示
- 3. 優惠效果展示
- 六、總結與學習拓展
本文將從零開始構建一個功能完整的C++快餐點餐系統,深入學習面向對象編程的精髓。通過實際項目開發,掌握類設計、封裝、繼承等核心概念,打造一個支持智能點餐、自動優惠、訂單管理的實用系統。
一、項目介紹與亮點功能
1. 項目背景
在快餐行業數字化轉型的大潮中,點餐系統已成為提升用戶體驗和運營效率的關鍵工具。我們將使用C++面向對象編程思想,構建一個功能豐富的快餐點餐系統,讓初學者在實戰中深入理解面向對象設計模式。
2.完整代碼
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
#include <ctime>
#include <sstream>using namespace std;// 菜品類
class MenuItem {
public:int id;string name;double price;string category;MenuItem(int _id, string _name, double _price, string _category) : id(_id), name(_name), price(_price), category(_category) {}
};// 訂單項類
class OrderItem {
public:MenuItem item;int quantity;double subtotal;OrderItem(MenuItem _item, int _quantity) : item(_item), quantity(_quantity) {subtotal = item.price * quantity;}
};// 訂單類
class Order {
public:string orderNumber;vector<OrderItem> items;double totalAmount;double discount;double finalAmount;string orderTime;Order() {generateOrderNumber();generateOrderTime();totalAmount = 0.0;discount = 0.0;finalAmount = 0.0;}void addItem(MenuItem item, int quantity) {// 檢查是否已存在該商品,如果存在則增加數量for(int i = 0; i < items.size(); i++) {if(items[i].item.id == item.id) {items[i].quantity += quantity;items[i].subtotal = items[i].item.price * items[i].quantity;calculateTotal();return;}}// 如果不存在,添加新的訂單項items.push_back(OrderItem(item, quantity));calculateTotal();}void calculateTotal() {totalAmount = 0.0;for(int i = 0; i < items.size(); i++) {totalAmount += items[i].subtotal;}// 計算優惠calculateDiscount();finalAmount = totalAmount - discount;}void calculateDiscount() {discount = 0.0;// 滿額優惠:滿100減10,滿200減25,滿300減40if(totalAmount >= 300) {discount = 40.0;} else if(totalAmount >= 200) {discount = 25.0;} else if(totalAmount >= 100) {discount = 10.0;}// 數量優惠:單品數量>=5打9折for(int i = 0; i < items.size(); i++) {if(items[i].quantity >= 5) {double itemDiscount = items[i].subtotal * 0.1;if(itemDiscount > discount) {discount = itemDiscount;}}}}private:void generateOrderNumber() {time_t now = time(0);stringstream ss;ss << "ORD" << now % 100000;orderNumber = ss.str();}void generateOrderTime() {time_t now = time(0);char* timeStr = ctime(&now);orderTime = string(timeStr);// 移除換行符if(!orderTime.empty() && orderTime[orderTime.length()-1] == '\n') {orderTime.erase(orderTime.length()-1);}}
};// 點餐系統類
class OrderSystem {
private:vector<MenuItem> menu;vector<Order> orders;public:OrderSystem() {initializeMenu();}void initializeMenu() {// 漢堡類menu.push_back(MenuItem(1, "經典漢堡", 25.0, "漢堡"));menu.push_back(MenuItem(2, "雞肉漢堡", 28.0, "漢堡"));menu.push_back(MenuItem(3, "牛肉漢堡", 32.0, "漢堡"));menu.push_back(MenuItem(4, "培根漢堡", 35.0, "漢堡"));// 小食類menu.push_back(MenuItem(5, "薯條(小)", 12.0, "小食"));menu.push_back(MenuItem(6, "薯條(大)", 18.0, "小食"));menu.push_back(MenuItem(7, "雞塊(6塊)", 20.0, "小食"));menu.push_back(MenuItem(8, "洋蔥圈", 15.0, "小食"));// 飲品類menu.push_back(MenuItem(9, "可樂(中)", 8.0, "飲品"));menu.push_back(MenuItem(10, "可樂(大)", 12.0, "飲品"));menu.push_back(MenuItem(11, "橙汁", 10.0, "飲品"));menu.push_back(MenuItem(12, "咖啡", 15.0, "飲品"));}void showMenu() {cout << "\n" << string(60, '=') << endl;cout << " 快餐店菜單" << endl;cout << string(60, '=') << endl;string currentCategory = "";for(int i = 0; i < menu.size(); i++) {if(menu[i].category != currentCategory) {currentCategory = menu[i].category;cout << "\n【" << currentCategory << "】" << endl;cout << string(30, '-') << endl;}cout << setw(2) << menu[i].id << ". " << setw(15) << left << menu[i].name << "¥" << fixed << setprecision(2) << menu[i].price << endl;}cout << string(60, '=') << endl;}MenuItem* findMenuItem(int id) {for(int i = 0; i < menu.size(); i++) {if(menu[i].id == id) {return &menu[i];}}return NULL;}void takeOrder() {Order newOrder;int choice, quantity;char continueOrder;cout << "\n開始新訂單..." << endl;cout << "訂單編號: " << newOrder.orderNumber << endl;do {showMenu();cout << "\n請選擇商品編號 (1-" << menu.size() << "): ";cin >> choice;MenuItem* item = findMenuItem(choice);if(item == NULL) {cout << "無效的商品編號,請重新選擇!" << endl;continue;}cout << "請輸入數量: ";cin >> quantity;if(quantity <= 0) {cout << "數量必須大于0!" << endl;continue;}newOrder.addItem(*item, quantity);cout << "已添加: " << item->name << " x" << quantity << endl;cout << "是否繼續點餐?(y/n): ";cin >> continueOrder;} while(continueOrder == 'y' || continueOrder == 'Y');if(!newOrder.items.empty()) {orders.push_back(newOrder);cout << "\n訂單創建成功!" << endl;showOrderSummary(newOrder);} else {cout << "訂單為空,已取消。" << endl;}}void showOrderSummary(const Order& order) {cout << "\n" << string(50, '=') << endl;cout << " 訂單匯總" << endl;cout << string(50, '=') << endl;cout << "訂單編號: " << order.orderNumber << endl;cout << "下單時間: " << order.orderTime << endl;cout << string(50, '-') << endl;for(int i = 0; i < order.items.size(); i++) {const OrderItem& item = order.items[i];cout << setw(15) << left << item.item.name << "x" << setw(2) << item.quantity << " ¥" << fixed << setprecision(2) << item.subtotal << endl;}cout << string(50, '-') << endl;cout << setw(20) << right << "小計: ¥" << order.totalAmount << endl;if(order.discount > 0) {cout << setw(20) << right << "優惠: -¥" << order.discount << endl;}cout << setw(20) << right << "總計: ¥" << order.finalAmount << endl;cout << string(50, '=') << endl;}void showAllOrders() {if(orders.empty()) {cout << "\n暫無訂單記錄。" << endl;return;}cout << "\n" << string(80, '=') << endl;cout << " 所有訂單" << endl;cout << string(80, '=') << endl;for(int i = 0; i < orders.size(); i++) {cout << "訂單 " << (i+1) << ":" << endl;showOrderSummary(orders[i]);cout << endl;}}void showDiscountRules() {cout << "\n" << string(50, '=') << endl;cout << " 優惠政策" << endl;cout << string(50, '=') << endl;cout << "1. 滿額優惠:" << endl;cout << " - 滿100元減10元" << endl;cout << " - 滿200元減25元" << endl;cout << " - 滿300元減40元" << endl;cout << "\n2. 數量優惠:" << endl;cout << " - 單品數量≥5個,享受9折優惠" << endl;cout << "\n注:優惠不可疊加,系統自動選擇最優惠方案" << endl;cout << string(50, '=') << endl;}void showStatistics() {if(orders.empty()) {cout << "\n暫無統計數據。" << endl;return;}double totalSales = 0.0;double totalDiscount = 0.0;int totalItems = 0;for(int i = 0; i < orders.size(); i++) {totalSales += orders[i].finalAmount;totalDiscount += orders[i].discount;totalItems += orders[i].items.size();}cout << "\n" << string(40, '=') << endl;cout << " 營業統計" << endl;cout << string(40, '=') << endl;cout << "總訂單數: " << orders.size() << "單" << endl;cout << "總銷售額: ¥" << fixed << setprecision(2) << totalSales << endl;cout << "總優惠額: ¥" << totalDiscount << endl;cout << "平均客單價: ¥" << totalSales / orders.size() << endl;cout << string(40, '=') << endl;}void run() {int choice;cout << "歡迎使用快餐點餐系統!" << endl;while(true) {cout << "\n" << string(40, '=') << endl;cout << " 主菜單" << endl;cout << string(40, '=') << endl;cout << "1. 查看菜單" << endl;cout << "2. 開始點餐" << endl;cout << "3. 查看所有訂單" << endl;cout << "4. 查看優惠政策" << endl;cout << "5. 營業統計" << endl;cout << "0. 退出系統" << endl;cout << string(40, '=') << endl;cout << "請選擇: ";cin >> choice;switch(choice) {case 1:showMenu();break;case 2:takeOrder();break;case 3:showAllOrders();break;case 4:showDiscountRules();break;case 5:showStatistics();break;case 0:cout << "\n感謝使用快餐點餐系統,再見!" << endl;return;default:cout << "無效選擇,請重新輸入!" << endl;break;}}}
};int main() {// 設置控制臺輸出格式cout << fixed << setprecision(2);OrderSystem system;system.run();return 0;
}
3. 核心功能亮點
🎯 基礎功能
- 分類菜單展示:漢堡、小食、飲品三大類,界面美觀清晰
- 智能點餐流程:支持選擇商品、設定數量,自動合并相同商品
- 實時價格計算:動態計算小計、優惠、總價
- 精美賬單打印:詳細訂單匯總,包含時間戳和唯一編號
🚀 進階功能
- 多訂單管理系統:支持并發處理多份訂單,歷史記錄完整保存
- 智能優惠算法:滿額立減 + 數量折扣,系統自動擇優
- 數據統計分析:營業統計、客單價分析、優惠效果評估
二、面向對象設計架構解析
1. 類設計思路
根據面向對象的三大特征:封裝、繼承、多態,我們將系統設計為四個核心類:
// 核心類設計架構
class MenuItem { // 菜品類 - 封裝商品屬性int id;string name;double price;string category;
};class OrderItem { // 訂單項類 - 封裝單個商品訂購信息MenuItem item;int quantity;double subtotal;
};class Order { // 訂單類 - 封裝整個訂單邏輯vector<OrderItem> items;double totalAmount;string orderNumber;
};class OrderSystem { // 點餐系統類 - 封裝業務邏輯vector<MenuItem> menu;vector<Order> orders;
};
2. 系統架構可視化
下圖展示了四個核心類之間的關系和協作模式:
3. 封裝性體現
每個類都嚴格遵循數據封裝原則:
- 私有數據成員:隱藏內部實現細節
- 公有接口方法:提供標準化的數據訪問方式
- 職責單一原則:每個類只負責自己領域的業務邏輯
class Order {
private:void generateOrderNumber(); // 私有方法:生成訂單號void generateOrderTime(); // 私有方法:生成時間戳public:void addItem(MenuItem item, int quantity); // 公有接口:添加商品void calculateTotal(); // 公有接口:計算總價
};
三、核心功能實現詳解
1. 點餐流程可視化
下圖詳細展示了用戶從查看菜單到完成訂單的完整流程:
2. 智能點餐邏輯
商品合并算法:當用戶重復點同一商品時,系統會自動合并數量而非創建重復記錄
void Order::addItem(MenuItem item, int quantity) {// 遍歷已有商品,檢查是否存在for(int i = 0; i < items.size(); i++) {if(items[i].item.id == item.id) {items[i].quantity += quantity; // 增加數量items[i].subtotal = items[i].item.price * items[i].quantity;calculateTotal(); // 重新計算總價return;}}// 如果是新商品,直接添加items.push_back(OrderItem(item, quantity));calculateTotal();
}
3. 訂單編號生成機制
3. 訂單編號生成機制
void Order::generateOrderNumber() {time_t now = time(0);stringstream ss;ss << "ORD" << now % 100000; // 基于時間戳生成唯一編號orderNumber = ss.str();
}
4. 菜單分類展示
系統采用動態分類顯示方式,根據商品類別自動分組:
void OrderSystem::showMenu() {string currentCategory = "";for(int i = 0; i < menu.size(); i++) {if(menu[i].category != currentCategory) {currentCategory = menu[i].category;cout << "\n【" << currentCategory << "】" << endl;}cout << menu[i].id << ". " << menu[i].name << " ¥" << menu[i].price << endl;}
}
四、智能優惠系統設計
1. 算法工作原理可視化
下圖詳細展示了智能優惠算法的完整工作流程:
2. 多重優惠策略
系統實現了雙重優惠機制,自動為用戶選擇最優方案:
滿額立減優惠:
- 滿100元減10元
- 滿200元減25元
- 滿300元減40元
數量折扣優惠:
- 單品數量≥5個,享受9折優惠
3. 優惠計算算法
void Order::calculateDiscount() {discount = 0.0;// 策略1:滿額優惠if(totalAmount >= 300) {discount = 40.0;} else if(totalAmount >= 200) {discount = 25.0;} else if(totalAmount >= 100) {discount = 10.0;}// 策略2:數量優惠(擇優選擇)for(int i = 0; i < items.size(); i++) {if(items[i].quantity >= 5) {double itemDiscount = items[i].subtotal * 0.1;if(itemDiscount > discount) {discount = itemDiscount; // 選擇更優惠的方案}}}
}
五、程序運行演示與測試
1. 主界面展示
========================================主菜單
========================================
1. 查看菜單
2. 開始點餐
3. 查看所有訂單
4. 查看優惠政策
5. 營業統計
0. 退出系統
========================================
2. 點餐流程演示
步驟1:選擇商品
============================================================快餐店菜單
============================================================【漢堡】
------------------------------
1 . 經典漢堡 ¥25.00
2 . 雞肉漢堡 ¥28.00
3 . 牛肉漢堡 ¥32.00
4 . 培根漢堡 ¥35.00【小食】
------------------------------
5 . 薯條(小) ¥12.00
6 . 薯條(大) ¥18.00
7 . 雞塊(6塊) ¥20.00
8 . 洋蔥圈 ¥15.00【飲品】
------------------------------
9 . 可樂(中) ¥8.00
10. 可樂(大) ¥12.00
11. 橙汁 ¥10.00
12. 咖啡 ¥15.00
============================================================請選擇商品編號: 1
請輸入數量: 2
步驟2:訂單匯總
==================================================訂單匯總
==================================================
訂單編號: ORD87432
下單時間: Thu Jun 05 14:30:25 2025
--------------------------------------------------
經典漢堡 x2 ¥50.00
--------------------------------------------------小計: ¥50.00總計: ¥50.00
==================================================
3. 優惠效果展示
當訂單滿足優惠條件時:
--------------------------------------------------小計: ¥120.00優惠: -¥10.00總計: ¥110.00
--------------------------------------------------
六、總結與學習拓展
通過本項目的開發,我們深入實踐了:
面向對象核心概念:
- 封裝:將數據和方法包裝在類中,隱藏實現細節
- 抽象:通過類的設計,將現實世界的概念映射到代碼中
- 模塊化設計:每個類承擔明確的職責,便于維護和擴展
C++編程技巧:
vector
容器的靈活使用- 字符串流
stringstream
的格式化輸出 - 時間處理函數
time()
的實際應用 - 輸出格式控制
setw()
、setprecision()
的美化效果
這個快餐點餐系統不僅是一個實用的小項目,更是面向對象編程的絕佳實踐案例。通過親自動手實現,你將對C++的類設計、對象交互、數據封裝等核心概念有更深刻的理解。
優秀的程序員不是天生的,而是通過一個個項目歷練出來的。從這個點餐系統開始,踏上你的C++進階之路吧! 🚀
📝 關注我:更多C++實戰項目和編程技巧,請關注我的CSDN博客,一起在代碼的海洋中探索前行!
創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊)