C++課設:智能優惠快餐點餐系統

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》
創作者: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😊)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82656.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82656.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP的namespace

文章目錄 環境Java的packagepackage關鍵字包結構和目錄結構訪問權限import關鍵字總結 PHP的namespacenamespace關鍵字在同一個文件里使用資源限定&#xff0c;完全限定&#xff0c;非限定限定完全限定非限定 use關鍵字use VS 直接指定資源在不同的文件里使用總結 環境 Windows…

矩陣分解相關知識點總結(二)

文章目錄 三、矩陣的QR分解3.1、Givens矩陣與Givens變換3.2、Householder矩陣與Householder變換3.3、QR分解 書接上文矩陣分解相關知識點總結&#xff08;一&#xff09; 三、矩陣的QR分解 3.1、Givens矩陣與Givens變換 設非零列向量 x ∈ R n \bm{x}\in {\bf{R}}^n x∈Rn及單…

Chorme如何對于youtube視頻進行畫中畫背景播放?

畫中畫可以讓你小窗播放&#xff0c;然后瀏覽器放后臺還可以做點別的事情。 B站直接可以選擇小窗播放&#xff0c;游覽器最小化就可以&#xff0c;但是youtube的小窗播放游覽器一切換就不顯示了。 其實是因為youtube的小窗播放不是真的小窗播放。要想真的實現需要在youtube視…

14.AI搭建preparationのBERT預訓練模型進行文本分類

一、回顧&#xff1a; 對深度學習框架Python2.0進行自然語言處理有了一個基礎性的認識注意力模型編碼器(encoder_layer,用于分類的全連接層dense_layer)&#xff0c;拋棄了傳統的循環神經網絡和卷積神經網絡&#xff0c;通過注意力模型將任意位置的兩個單詞的距離轉換成1編碼器…

OD 算法題 B卷【最長公共前綴】

文章目錄 最長公共前綴 最長公共前綴 編寫一個函數來查找字符串數組 中的最長公共前綴&#xff0c;如果不存在公共前綴&#xff0c;返回字符串’Zero’字符串長度范圍【2,1000】&#xff0c;字符串中字符長度范圍為【1,126】 示例1 輸入&#xff1a; [“flower”, “flow”, …

pycharm F2 修改文件名 修改快捷鍵

菜單&#xff1a;File-> Setting&#xff0c; Keymap中搜索 Rename&#xff0c; 其中&#xff0c;有 Refactor-> Rename&#xff0c;右鍵添加快捷鍵&#xff0c;F2&#xff0c;刪除原有快捷鍵就可以了。

WEB安全--SQL注入--bypass技巧2

繼之前文章的補充&#xff1a; WEB安全--SQL注入--bypass技巧_sql注入過濾空格-CSDN博客 Q1&#xff1a;發現sql注入的時間盲注時&#xff0c;如果時間盲注的函數都被過濾了&#xff0c;怎么辦&#xff1f; 除了找其他函數替換、編碼等方式&#xff0c;還有以下方式繞過&…

自定義事件wpf

// 自定義控件 public class MyCustomControl : Control { public static readonly RoutedEvent MyCustomEvent EventManager.RegisterRoutedEvent( "MyCustom", RoutingStrategy.Bubbling, typeof(RoutedEventHandler), typeof(MyCustomControl) ); public event R…

【匯編逆向系列】一、無參數的函數調用- RSP,EAX寄存器,全局變量,INT類型和MOV,INC,SHL指令

給出一段簡單的匯編 no_params_function:0000000000000000: 40 57 push rdi0000000000000002: 8B 05 00 00 00 00 mov eax,dword ptr [global_counter]0000000000000008: FF C0 inc eax000000000000000A: 89 05 00 00 00 0…

知識蒸餾:從模型輸出到深層理解

1. 概念闡釋: 還記得上次說的“老師教你畫畫,不只教‘貓’,還教‘像狗像樹葉’的細微感覺”嗎?那是最初的蒸餾。 后來大家發現,老師不僅僅通過“最后畫出來像什么”來教你。 有時候,老師是教你“他畫畫時,哪里用了力氣,哪里畫得特別認真”(這叫基于特征的蒸餾,學習…

vue-18(使用 Vuex 插件實現高級功能)

使用 Vuex 插件實現高級功能 Vuex 插件提供了一種強大的方式來擴展 Vuex 存儲的功能。它們為存儲的變更過程提供了鉤子&#xff0c;允許你攔截變更、執行副作用以及添加自定義邏輯。本章將探討如何利用 Vuex 插件實現持久化、日志記錄和時間旅行調試等高級功能。我們將深入研究…

【Java】CopyOnWriteArrayList

一&#xff0c;概述 CopyOnWriteArrayList作為List接口的實現之一&#xff0c;它區分于ArrayList在于它是線程安全的。如它名字一樣&#xff0c;所有的寫操作均復制了原數組的值&#xff0c;雖說代價較大&#xff0c;但讀多寫少的環境下&#xff0c;是可接受的。筆者在此簡單看…

【高等數學】函數項級數

目錄 函數項級數收斂域的定義收斂域的判定方法常見冪級數展開&#xff08;麥克勞林級數&#xff09;冪級數的應用 傅里葉級數傅里葉級數的基本概念傅里葉級數的主要性質奇偶函數的簡化周期延拓奇延拓偶延拓 函數項級數 函數項級數是指由一系列函數構成的無窮級數&#xff0c;形…

基于cornerstone3D的dicom影像瀏覽器 第二十八章 LabelTool文字標記,L標記,R標記及標記樣式設置

文章目錄 前言一、L標記、R標記二、修改工具樣式1. 樣式的四種級別2. 導入annotation3. 示例1 - 修改toolGroup中的樣式4. 示例2 - 修改viewport中的樣式 三、可配置樣式 前言 cornerstone3D 中的文字標記工具LabelTool&#xff0c;在添加文字標記時會彈出對話框讓用戶輸入文字…

PPT轉圖片拼貼工具 v4.3

軟件介紹 這個軟件就是將PPT文件轉換為圖片并且拼接起來。 效果展示 支持導入文件和支持導入文件夾&#xff0c;也支持手動輸入文件/文件夾路徑 軟件界面 這一次提供了源碼和開箱即用版本&#xff0c;exe就是直接用就可以了。 軟件源碼 import os import re import sys …

新版NANO下載燒錄過程

一、序言 搭建 Jetson 系列產品燒錄系統的環境需要在電腦主機上安裝 Ubuntu 系統。此處使用 18.04 LTS。 二、環境搭建 1、安裝庫 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建環境的過程需要這個應用庫來將某些 NVIDIA 軟件組件安裝到 Je…

神經網絡-Day45

目錄 一、tensorboard的基本操作1.1 發展歷史1.2 tensorboard的原理 二、tensorboard實戰2.1 cifar-10 MLP實戰2.2 cifar-10 CNN實戰 在神經網絡訓練中&#xff0c;為了幫助理解&#xff0c;借用了很多的組件&#xff0c;比如訓練進度條、可視化的loss下降曲線、權重分布圖&…

設計模式之單例模式(二): 心得體會

設計模式之單例模式(一)-CSDN博客 目錄 1.背景 2.分析 2.1.違背面向對象設計原則&#xff0c;導致職責混亂 2.2.全局狀態泛濫&#xff0c;引發依賴與耦合災難 2.3.多線程場景下風險放大&#xff0c;性能與穩定性受損 2.4.測試與維護難度指數級上升 2.5.違背 “最小知識原…

windows10 php報錯

參考這個&#xff0c; 實際解決了問題&#xff0c; 主要是repair c 然后重啟 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu_php warning: vcruntime140.dll 14.0 is not compat-CSDN博客

GPU顯存的作用和如何選擇

核心定義與作用 首先&#xff0c;顯存的全稱是顯示內存&#xff0c;英文是Video RAM或VRAM&#xff0c;是顯卡上的專用內存。 顯存的主要作用是用來存儲圖形處理單元&#xff08;GPU&#xff09;需要處理的數據&#xff0c;比如紋理、頂點數據、幀緩沖區等。 數據中轉站 GPU…