C++零基礎實踐教程

模塊一:準備工作與第一個程序 (熱身)

在正式編寫代碼之前,我們需要了解為什么要學習 C++,并搭建好我們的開發環境。然后,我們將編寫并運行第一個簡單的 C++ 程序。

1. 為什么選擇 C++?

你可能聽說過很多編程語言,為什么選擇 C++ 呢?

  • 性能卓越: C++ 程序運行速度非常快,因為它接近底層硬件,能進行精細的優化。這使得它在游戲引擎 (如 Unreal Engine)、高性能計算、操作系統 (如 Windows 部分組件)、瀏覽器 (如 Chrome) 等領域備受青睞。
  • 功能強大: C++ 支持多種編程范式(過程式、面向對象、泛型編程),讓你能夠用靈活的方式解決復雜問題。
  • 應用廣泛: 從桌面應用到服務器后端,從嵌入式系統到金融交易系統,C++ 的身影無處不在。
  • 打好基礎: 學習 C++ 能讓你更深入地理解計算機的工作原理,如內存管理等,為學習其他語言打下堅實的基礎。

雖然 C++ 有一定的學習曲線,但掌握它將為你打開通往許多激動人心的技術領域的大門!

2. 準備你的武器庫:環境搭建

要編寫和運行 C++ 代碼,你需要兩樣東西:

  • 編譯器 (Compiler): 它能將你寫的 C++ 代碼(源代碼)翻譯成計算機能懂的機器指令。常見的編譯器有 GCC (Linux, macOS, Windows via MinGW/Cygwin), Clang (macOS, Linux, Windows), MSVC (Windows)。
  • 代碼編輯器或 IDE (Integrated Development Environment): 用于編寫代碼的工具。IDE 通常集成了編輯器、編譯器、調試器等功能,更加方便。

推薦方案:

  • Windows 用戶:

    • 推薦: 安裝 Visual Studio Community。這是一個功能強大的免費 IDE,自帶 MSVC 編譯器和調試器,安裝和配置相對簡單。
      • 訪問 Visual Studio 官網 下載安裝程序。
      • 在安裝器的 "工作負載" 選項卡中,勾選 "使用 C++ 的桌面開發",然后安裝。
      • 安裝完成后,啟動 Visual Studio,選擇 "創建新項目",然后選擇 "控制臺應用" (Console App),即可開始編寫代碼。
    • 備選: 安裝 VS Code + MinGW-w64。VS Code 是輕量級編輯器,MinGW-w64 提供了 GCC 編譯器。
      • 安裝 VS Code。
      • 安裝 MinGW-w64 (推薦通過 MSYS2 或直接下載預編譯包),確保將編譯器的 bin 目錄添加到系統環境變量 PATH 中
      • 在 VS Code 中安裝 Microsoft 的 "C/C++" 擴展。
      • 你需要配置 tasks.json (用于編譯) 和 launch.json (用于調試)。VS Code C++ 擴展通常會提供基礎模板。
  • macOS 用戶:

    • 推薦: 安裝 Xcode Command Line Tools。這會提供 Clang 編譯器和相關工具。
      • 打開 "終端" (Terminal) 應用。
      • 輸入命令 xcode-select --install 并按回車,按照提示安裝。
    • 編輯器: 使用 VS Code
      • 安裝 VS Code。
      • 安裝 "C/C++" 擴展。配置 tasks.jsonlaunch.json(通常 VS Code 能自動檢測到 Clang)。
  • Linux 用戶 (如 Ubuntu):

    • 推薦: 安裝 build-essential 包,它包含了 GCC 編譯器和常用工具。
      • 打開終端。
      • 運行命令 sudo apt update && sudo apt install build-essential gdb
    • 編輯器: 使用 VS Code
      • 安裝 VS Code (通常可以通過包管理器安裝,如 sudo apt install code)。
      • 安裝 "C/C++" 擴展。配置 tasks.jsonlaunch.json

重要提示: 環境搭建是初學編程時可能遇到的第一個挑戰。如果遇到困難,請耐心搜索相關教程或尋求幫助。確保你的編譯器能夠正常工作是后續學習的基礎。

3. 你好,世界!:你的第一個 C++ 程序

環境搭好了,讓我們來編寫第一個 C++ 程序。在你的 IDE 或編輯器中,創建一個新文件,命名為 hello.cpp (C++ 源文件的后綴通常是 .cpp),然后輸入以下代碼:

C++

// 我的第一個 C++ 程序
// 日期: 2025-04-16 (請替換為當前日期)#include <iostream> // 包含輸入輸出流庫int main() { // 程序入口點:main 函數// 使用 std::cout 輸出文本到控制臺std::cout << "Hello, World!" << std::endl; return 0; // 表示程序成功結束
} 

代碼解釋:

  • // 我的第一個 C++ 程序: 這是單行注釋,以 // 開頭,后面的內容會被編譯器忽略,用于解釋代碼。
  • #include <iostream>: 這是預處理指令。它告訴編譯器把 <iostream> 這個頭文件包含進來。<iostream> 提供了標準輸入輸出的功能,比如在屏幕上顯示文字 (std::cout)。
  • int main(): 這是主函數 (main function)。每個 C++ 程序都必須有一個 main 函數,它是程序的入口點,代碼從這里開始執行。int 表示這個函數執行完畢后會返回一個整數值給操作系統。
  • { ... }: 這對花括號定義了 main 函數的代碼塊范圍。函數的所有代碼都寫在花括號里面。
  • std::cout << "Hello, World!" << std::endl;: 這是執行輸出操作的語句。
    • std: 是 "standard" (標準) 的縮寫,它是一個命名空間 (namespace),C++ 標準庫里的很多功能都在這個空間里。
    • ::: 是范圍解析運算符,用來指明我們要使用的是 std 命名空間里的 cout
    • cout: 是 "character output" 的縮寫,代表標準輸出流,通常連接到你的屏幕(控制臺)。
    • <<: 是流插入運算符。它把右邊的內容 "插入" 到左邊的輸出流 (std::cout) 中。
    • "Hello, World!": 這是字符串字面量,就是要輸出的文本內容。
    • std::endl: 這也是 std 命名空間里的一個特殊東西,叫做操縱符 (manipulator)。它的作用是輸出一個換行符,并刷新輸出緩沖區(確保文字立刻顯示出來)。你也可以直接用換行符 \n (std::cout << "Hello, World!\n";),通常更簡潔。
  • return 0;: 這條語句結束 main 函數,并向操作系統返回 0。通常,返回 0 表示程序正常結束

編譯和運行:

  • 如果你使用 Visual Studio: 點擊頂部菜單的 "調試" -> "開始執行(不調試)" (或按 Ctrl + F5)。Visual Studio 會自動編譯并運行程序,彈出一個控制臺窗口顯示 "Hello, World!"。
  • 如果你使用 VS Code + 編譯器 (如 GCC/Clang):
    1. 編譯 (Compile): 打開 VS Code 的終端 (Terminal -> New Terminal),輸入類似命令:g++ hello.cpp -o hello (如果是 Clang,用 clang++)。這會讀取 hello.cpp 文件,進行編譯和鏈接,生成一個名為 hello (Windows 下可能是 hello.exe) 的可執行文件。-o hello 指定輸出文件的名字。
    2. 運行 (Run): 在同一個終端里,輸入 ./hello (Linux/macOS) 或 .\hello.exe (Windows) 并按回車。你就能看到輸出結果了。
    • 提示: 配置好 tasks.json 后,你可以通過 VS Code 的任務菜單 (Terminal -> Run Build Task...) 來執行編譯命令。

4. 動手試試看:實戰練習

現在,輪到你來實踐了!

  1. 確保成功: 完整輸入上面的 Hello, World! 代碼,并成功編譯、運行它。看到輸出結果了嗎?恭喜!
  2. 修改輸出: 嘗試修改 std::cout 語句中的字符串,讓它輸出你自己的名字或者其他你想說的話。例如:std::cout << "My name is [你的名字]!\n";。重新編譯并運行,看看效果。
  3. 制造錯誤 (學習調試): 故意在代碼里制造一些小錯誤,看看編譯器會給你什么提示。這非常重要!學會看懂錯誤信息是編程的關鍵技能之一。
    • 嘗試一: 刪除 return 0; 后面的分號 ;,然后編譯。看看編譯器報什么錯?(可能會提示 error: expected ';' before '}' token
    • 嘗試二:std::cout 錯寫成 std::Cout (注意大小寫),然后編譯。編譯器會告訴你什么?(可能會提示 error: 'Cout' is not a member of 'std'
    • 嘗試三: 刪除 #include <iostream> 這一行,然后編譯。會發生什么?(可能會提示 error: 'cout' was not declared in this scopeerror: 'endl' was not declared in this scope

關鍵點: 不要害怕錯誤!編譯器是你的朋友,它會盡力告訴你哪里出了問題。仔細閱讀錯誤信息,定位到提示的行號,嘗試理解并修正它。


模塊二:基礎語法與數據 (打地基)

我們已經成功運行了第一個程序。現在,讓我們學習 C++ 的基礎語法,了解如何存儲和處理數據。

1. 程序的基石:變量與數據類型

程序需要處理數據,比如數字、文字等。變量 (Variable) 就像一個帶標簽的盒子,你可以給它起個名字,并用它來存儲特定類型的數據。

  • 數據類型 (Data Type): 決定了變量可以存儲什么樣的數據,以及能對這些數據進行哪些操作。C++ 有多種內置的基本數據類型:

    • int: 存儲整數 (integers),如 -10, 0, 100
    • float: 存儲單精度浮點數 (floating-point numbers),即帶小數點的數,精度有限,如 3.14, -0.5
    • double: 存儲雙精度浮點數,比 float 更精確,能表示更大范圍的小數。推薦在需要小數時優先使用 double
    • char: 存儲單個字符 (character),用單引號括起來,如 'A', 'a', '5', ' ' (空格也是字符)。
    • bool: 存儲布爾值 (boolean),只有兩個可能的值:true (真) 或 false (假)。常用于表示條件判斷的結果。
  • 變量聲明 (Declaration): 告訴編譯器你要創建一個什么類型的變量,并給它起個名字。語法:數據類型 變量名;

    C++

    int age;
    double price;
    char grade;
    bool isFinished;
    
  • 變量初始化 (Initialization): 在聲明變量的同時給它一個初始值。強烈推薦在聲明時就初始化變量,避免使用未定義的值。

    C++

    int age = 25;             // C-like initialization
    double price = 99.9;
    char grade = 'A';
    bool isFinished = false;// C++11 推薦的統一初始化方式 (使用花括號)
    int score {100};          
    double temperature {26.5}; 
    char initial {'J'};
    bool loggedIn {true}; 
    
  • 變量賦值 (Assignment): 在變量聲明后,使用賦值運算符 = 來改變變量存儲的值。

    C++

    int count;      // 聲明
    count = 10;     // 賦值
    count = count + 5; // 賦值,新值是 15
    
  • 常量 (Constant): 如果你想讓一個變量的值在程序運行期間不能被修改,可以使用 const 關鍵字來定義常量。常量名通常用全大寫字母表示(約定俗成)。

    C++

    const double PI = 3.14159;
    const int MAX_USERS = 100;
    // PI = 3.14; // 錯誤!不能修改常量的值
    

    使用常量可以提高代碼的可讀性和安全性。

2. 與程序互動:基本輸入輸出

我們已經用過 std::cout 來向屏幕輸出信息。現在來看看如何從用戶那里獲取輸入。

  • std::cout (輸出): 使用流插入運算符 << 將數據發送到控制臺。可以連續輸出多個內容。

    C++

    int apples = 5;
    double weight = 1.2;
    std::cout << "我有 " << apples << " 個蘋果." << std::endl;
    std::cout << "總重量是: " << weight << " 公斤。\n"; // \n 也是換行符
    
  • std::cin (輸入): 使用流提取運算符 >> 從鍵盤讀取用戶輸入,并存儲到變量中。std::cin 通常會忽略輸入前的空白字符(空格、制表符、換行符),并以空白字符作為輸入的分隔。

    C++

    int userAge;
    double userHeight;std::cout << "請輸入你的年齡: ";
    std::cin >> userAge; // 讀取用戶輸入的整數,存入 userAgestd::cout << "請輸入你的身高 (米): ";
    std::cin >> userHeight; // 讀取用戶輸入的浮點數,存入 userHeightstd::cout << "你的年齡是 " << userAge << " 歲,身高是 " << userHeight << " 米。\n"; 
    

    注意: 如果用戶輸入的類型與 std::cin 期望讀取的變量類型不匹配(比如期望數字卻輸入了字母),可能會導致程序出錯或行為異常。

3. 讓程序計算:運算符

運算符是執行特定操作(如計算、比較)的符號。

  • 算術運算符 (Arithmetic Operators):

    • + (加), - (減), * (乘)
    • / (除): 注意整數除法會丟棄小數部分 (5 / 2 結果是 2)。如果希望得到精確結果,至少有一個操作數應為浮點數 (5.0 / 25 / 2.05.0 / 2.0 結果都是 2.5)。
    • % (取模/求余): 計算整數除法的余數 (5 % 2 結果是 1)。
    C++

    int a = 10, b = 3;
    std::cout << "a + b = " << (a + b) << std::endl; // 13
    std::cout << "a / b = " << (a / b) << std::endl; // 3 (整數除法)
    std::cout << "a % b = " << (a % b) << std::endl; // 1double x = 10.0, y = 3.0;
    std::cout << "x / y = " << (x / y) << std::endl; // 3.333...
    
  • 賦值運算符 (Assignment Operators):

    • = (簡單賦值): variable = value;
    • 復合賦值: +=, -=, *=, /=, %=。例如 a += 5; 等價于 a = a + 5;
    C++

    int score = 0;
    score += 10; // score 現在是 10
    score *= 2;  // score 現在是 20
    
  • 關系運算符 (Relational Operators): 用于比較兩個值,結果是 bool 類型 (truefalse)。

    • == (等于)
    • != (不等于)
    • > (大于)
    • < (小于)
    • >= (大于等于)
    • <= (小于等于)
    C++

    int temp = 25;
    bool isHot = (temp > 30); // isHot 是 false
    bool isEqual = (temp == 25); // isEqual 是 true
    
  • 邏輯運算符 (Logical Operators): 用于組合多個布爾表達式,結果也是 bool 類型。

    • && (邏輯與 AND): 兩個操作數都為 true 時,結果才為 true
    • || (邏輯或 OR): 至少一個操作數為 true 時,結果就為 true
    • ! (邏輯非 NOT): 將操作數的布爾值取反 (!true 結果是 false, !false 結果是 true)。
    C++

    int age = 20;
    bool hasLicense = true;
    bool canDrive = (age >= 18) && hasLicense; // canDrive 是 truebool isWeekend = false;
    bool hasTicket = true;
    bool canGoToMovie = isWeekend || hasTicket; // canGoToMovie 是 true 
    
  • 運算符優先級 (Operator Precedence): 運算符有執行的先后順序(類似數學中的先乘除后加減)。例如,*/ 優先于 +-。如果不確定或想改變優先級,請使用圓括號 ()

    C++

    int result1 = 5 + 2 * 3; // 結果是 11 (先算 2 * 3)
    int result2 = (5 + 2) * 3; // 結果是 21 (先算 5 + 2)
    

4. 代碼的說明書:注釋

注釋是寫給看的,編譯器會忽略它們。良好的注釋能讓你的代碼更容易被他人(以及未來的你)理解。

  • 單行注釋 (Single-line comment):// 開始,直到該行結束。 C++

    // 這是計算圓面積的公式
    double area = PI * radius * radius; 
    
  • 多行注釋 (Multi-line comment):/* 開始,以 */ 結束,可以跨越多行。 C++

    /*
    這是一個多行注釋的例子。
    這里可以寫下更詳細的說明。
    */
    int x = 10; 
    
    用途: 解釋復雜的代碼段、說明函數的用途、暫時禁用某段代碼進行測試等。

5. 實戰項目一:打造簡易計算器

現在,運用我們剛學的知識,來做一個簡單的計算器吧!

  • 目標: 程序能接收用戶輸入的兩個數字,然后計算并顯示它們的加、減、乘、除結果。
  • 涉及知識點: 變量聲明 (double)、基本輸入輸出 (std::cin, std::cout)、算術運算符 (+, -, *, /)。

代碼實現 (calculator.cpp):

C++

#include <iostream> // 需要用到 cin 和 coutint main() {// 1. 聲明變量存儲用戶輸入的數字和計算結果//    使用 double 類型可以處理小數double num1 {}, num2 {}; double sum {}, difference {}, product {}, quotient {};// 2. 提示用戶輸入第一個數字std::cout << "歡迎使用簡易計算器!\n";std::cout << "請輸入第一個數字: ";std::cin >> num1; // 讀取用戶輸入并存入 num1// 3. 提示用戶輸入第二個數字std::cout << "請輸入第二個數字: ";std::cin >> num2; // 讀取用戶輸入并存入 num2// 4. 執行計算sum = num1 + num2;difference = num1 - num2;product = num1 * num2;// 5. 處理除法:檢查除數是否為 0//    (為模塊三的 if 語句做準備,這里先簡單處理)//    注意:直接比較浮點數是否等于 0 可能有精度問題,//    但對于入門教程,這樣寫比較直觀。if (num2 != 0) { quotient = num1 / num2;} // else { // 如果除數是 0,這里可以不做除法或者給提示//     std::cout << "錯誤:除數不能為零!\n";// }// 6. 輸出結果std::cout << "\n--- 計算結果 ---\n";std::cout << num1 << " + " << num2 << " = " << sum << std::endl;std::cout << num1 << " - " << num2 << " = " << difference << std::endl;std::cout << num1 << " * " << num2 << " = " << product << std::endl;// 只在除數不為 0 時輸出除法結果if (num2 != 0) {std::cout << num1 << " / " << num2 << " = " << quotient << std::endl;} else {std::cout << num1 << " / " << num2 << " = (錯誤:除數不能為零)" << std::endl;}return 0;
}

動手試試:

  1. 將以上代碼輸入到你的 IDE 或編輯器中,保存為 calculator.cpp
  2. 編譯并運行它。
  3. 按照提示輸入兩個數字(可以是整數或小數),觀察輸出結果。
  4. 嘗試輸入第二個數字為 0,看看除法部分會發生什么。(根據上面的代碼,它應該會提示錯誤信息,而不是嘗試計算)。
  5. 思考: 如果用戶輸入的不是數字而是字母,程序會怎樣?(通常會導致 cin 出錯,后續的輸入和計算可能都不會按預期進行)。

模塊三:控制流程 (讓程序更智能)

之前的程序都是按順序執行的。現在我們要學習如何讓程序根據不同的條件執行不同的代碼(選擇),以及如何讓程序重復執行某段代碼(循環)。

1. 讓程序做決定:條件語句

條件語句允許程序根據一個或多個條件的真假來選擇執行哪部分代碼。

  • if 語句: 如果條件為 true,則執行 if 后面的代碼塊。

    C++

    int temperature = 15;
    if (temperature < 20) {std::cout << "天氣有點冷,多穿點衣服。\n"; 
    }
    // 如果 temperature >= 20,上面 {} 里的代碼就不會執行
    
  • if-else 語句: 如果條件為 true,執行 if 塊;否則 (為 false),執行 else 塊。兩者必居其一。

    C++

    int age = 16;
    if (age >= 18) {std::cout << "你已成年。\n";
    } else {std::cout << "你還未成年。\n";
    }
    
  • if-else if-else 語句: 用于檢查多個互斥的條件。程序會按順序檢查 ifelse if 的條件,一旦找到第一個為 true 的條件,就執行對應的代碼塊,然后跳過整個 if-else if-else 結構。如果所有條件都為 false,則執行最后的 else 塊(else 是可選的)。

    C++

    int score = 75;
    if (score >= 90) {std::cout << "優秀 (A)\n";
    } else if (score >= 80) {std::cout << "良好 (B)\n";
    } else if (score >= 60) {std::cout << "及格 (C)\n"; // score 是 75,這個條件滿足,執行這句
    } else {std::cout << "不及格 (D)\n";
    } 
    // 后面的 else 不會再被檢查或執行
    
  • switch 語句: 當你需要根據一個整數或字符類型變量的具體值來執行不同操作時,switch 語句通常比一長串 if-else if 更清晰。

    C++

    char grade = 'B';
    switch (grade) { // 檢查 grade 的值case 'A': // 如果 grade 等于 'A'std::cout << "非常棒!\n";break; // 執行完 case 'A' 的代碼后,跳出 switchcase 'B': // 如果 grade 等于 'B'std::cout << "做得好!\n";break; // 跳出 switchcase 'C':std::cout << "還需要努力。\n";break;case 'D':std::cout << "要加油了!\n";break;default: // 如果 grade 不匹配上面任何一個 casestd::cout << "無效的等級。\n";break; // default 通常也需要 break
    }
    

    注意 break;! 如果省略了 case 后面的 break;,程序會繼續執行下一個 case 的代碼,直到遇到 breakswitch 結束,這被稱為“穿透 (fallthrough)”,通常不是我們想要的行為。default 子句是可選的,用于處理所有其他未明確列出的情況。

2. 重復的力量:循環語句

循環語句讓程序可以重復執行一段代碼,直到滿足某個停止條件。

  • while 循環: 先判斷條件,如果條件為 true,則執行循環體內的代碼;執行完畢后再次判斷條件,如此反復,直到條件變為 false 才停止。如果一開始條件就為 false,循環體一次也不會執行。

    C++

    int count = 1;
    while (count <= 5) { // 條件:count 小于等于 5std::cout << "Count is: " << count << std::endl;count = count + 1; // 更新 count 的值,否則會無限循環!
    }
    std::cout << "循環結束。\n";
    
  • for 循環: 非常適合已知循環次數或需要按規律遞增/遞減的場景。它將初始化、條件判斷、更新這三個部分集中寫在一起,結構更清晰。

    C++

    // 打印 0 到 4
    for (int i = 0; i < 5; i = i + 1) { // 初始化: int i = 0; 條件: i < 5; 更新: i = i + 1std::cout << "i = " << i << std::endl;
    }
    // 更常見的寫法 (i++ 等價于 i = i + 1)
    for (int j = 10; j >= 1; j = j - 1) { // 倒數std::cout << "j = " << j << std::endl;
    }
    

    for 循環的執行順序:

    1. 執行初始化部分 (只執行一次)。
    2. 判斷條件部分。
    3. 如果條件為 true,執行循環體代碼。
    4. 執行更新部分。
    5. 回到第 2 步,重復判斷條件。
    6. 如果條件為 false,循環結束。
  • do-while 循環: 先執行一次循環體,然后再判斷條件。如果條件為 true,則繼續循環;否則停止。保證循環體至少執行一次

    C++

    #include <string> // 需要用到 string 類型std::string password;
    do {std::cout << "請輸入密碼: ";std::cin >> password; 
    } while (password != "123456"); // 條件:密碼不等于 "123456"std::cout << "密碼正確!\n";
    

3. 改變路徑:跳轉語句

有時候我們需要在循環或 switch 內部改變正常的執行流程。

  • break;:

    • switch 語句中,用于跳出當前的 case
    • 在循環 (while, for, do-while) 中,用于立即終止整個循環,程序將跳轉到循環體之后的第一條語句。
    C++

    for (int i = 1; i <= 10; ++i) {if (i == 5) {std::cout << "遇到 5,跳出循環!\n";break; // 當 i 等于 5 時,終止 for 循環}std::cout << "i = " << i << std::endl; 
    }
    // 程序會繼續執行這里的代碼
    
  • continue;:

    • 只能用在循環中。它會立即結束當前這次循環迭代,跳過循環體中 continue 后面的所有語句,然后直接開始下一次迭代(對于 for 循環,會先執行更新部分再判斷條件;對于 whiledo-while,會直接判斷條件)。
    C++

    for (int i = 1; i <= 5; ++i) {if (i == 3) {std::cout << "(跳過 3)\n";continue; // 當 i 等于 3 時,跳過本次循環后面的 cout}std::cout << "當前數字: " << i << std::endl; 
    }
    // 輸出會是:當前數字: 1, 當前數字: 2, (跳過 3), 當前數字: 4, 當前數字: 5
    

4. 實戰項目二:挑戰數字猜謎游戲

讓我們來做一個經典的小游戲:程序想一個秘密數字,讓用戶來猜,并給出提示!

  • 目標:
    1. 程序隨機生成一個范圍內的整數(比如 1 到 100)作為秘密數字。
    2. 循環提示用戶輸入猜測的數字。
    3. 比較用戶猜測的數字和秘密數字:
      • 如果猜對了,顯示祝賀信息并結束游戲。
      • 如果猜低了,提示 "太低了!"。
      • 如果猜高了,提示 "太高了!"。
    4. (可選)記錄用戶猜測了多少次。
  • 涉及知識點: 隨機數生成 (rand, srand, time)、循環 (whiledo-while)、條件判斷 (if-else if-else)、輸入輸出 (std::cin, std::cout)、變量、關系運算符。

代碼實現 (guessing_game.cpp):

C++

#include <iostream>
#include <cstdlib> // 需要 rand() 和 srand()
#include <ctime>   // 需要 time()int main() {// 1. 生成隨機數種子//    通常在程序開始時調用一次 srand()//    time(0) 返回當前時間,用它作為種子可以保證每次運行的隨機數不同srand(time(0)); // 2. 生成秘密數字 (例如 1 到 100 之間)//    rand() % 100 會生成 0 到 99 之間的數//    所以 + 1 就得到 1 到 100int secretNumber = rand() % 100 + 1; int guess {}; // 存儲用戶猜測的數字,初始化為 0int attempts = 0; // 記錄猜測次數std::cout << "歡迎來到數字猜謎游戲!\n";std::cout << "我已經想好了一個 1 到 100 之間的秘密數字。\n";// 3. 使用 do-while 循環,因為至少要猜一次do {std::cout << "請輸入你猜測的數字: ";std::cin >> guess;attempts++; // 每次猜測,次數加 1// 4. 比較并給出提示if (guess < secretNumber) {std::cout << "太低了!再試試看。\n";} else if (guess > secretNumber) {std::cout << "太高了!再試試看。\n";} else {// 猜對了!std::cout << "\n恭喜你!猜對了!秘密數字就是 " << secretNumber << "。\n";std::cout << "你總共嘗試了 " << attempts << " 次。\n";}} while (guess != secretNumber); // 只要沒猜對,就繼續循環std::cout << "游戲結束,感謝參與!\n";return 0;
}

動手試試:

  1. 將代碼輸入 IDE,保存為 guessing_game.cpp
  2. 編譯并運行。
  3. 根據提示開始猜測數字,看看程序的反饋是否符合預期。
  4. 嘗試玩幾次,看看你最快能用多少次猜對。
  5. 思考與擴展:
    • 如果用戶輸入的不是數字怎么辦?(目前程序可能會出錯)。
    • 能不能限制用戶的猜測次數?(比如最多猜 7 次)。
    • 能不能讓用戶自己決定秘密數字的范圍?

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

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

相關文章

6 CMD 與 PowerShell 指令大全、C 程序終端運行、字符編碼切換指南

1 CMD 與 PowerShell 常用指令 在命令行環境中高效運行程序&#xff0c;掌握終端的基本操作命令至關重要。無論是 Windows 系統下的 CMD&#xff08;命令提示符&#xff09;還是 PowerShell&#xff0c;它們都配備了一系列實用的命令&#xff0c;助力我們管理文件、執行程序以及…

Linux——共享內存

目錄 一、共享內存概念 二、共享內存的一些函數 2.1 shmget 創建共享內存 2.2 shmat 訪問共享內存 2.3 shmdt 解除共享內存的映射 2.4 shnctl 刪除共享內存段 三、共享內存 3.1 創建測試進程 3.2 使用循環測試 ?編輯 3.3 共享內存寫入程序 3.4 帶有信號量的共享內…

數啟新疆,智領未來!2025新疆數字經濟發展戰略研討會在烏市啟幕

2025年4月20日&#xff0c;由新疆維吾爾自治區數字經濟聯合會主辦、中鈞科技有限公司承辦的"2025新疆數字經濟發展戰略研討會"將在烏魯木齊水磨溝區金正大廈三層會議中心隆重召開。 作為本年度新疆數字經濟領域規格最高的行業盛會&#xff0c;會議將匯聚自治區14個廳…

Nginx:輕量級高性能的Web服務器與反向代理服務器

目錄 一.引言 二.Nginx的核心特點 2.1高性能與高并發 2.2低資源消耗 2.3功能豐富 2.4高度擴展性 三.Nginx的應用場景 3.1靜態資源服務器 3.2反向代理服務器 3.3API網關 3.4Nginx的配置與使用 四.總結 一.引言 在互聯網高速發展的今天&#xff0c;Web服務器的性能與…

嵌入式Linux設備使用Go語言快速構建Web服務,實現設備參數配置管理方案探究

本文探討&#xff0c;利用Go語言及gin框架在嵌入式Linux設備上高效搭建Web服務器&#xff0c;以實現設備參數的網頁配置。通過gin框架&#xff0c;我們可以在幾分鐘內創建一個功能完善的管理界面&#xff0c;方便對諸如集中器&#xff0c;集線器等沒有界面的嵌入式設備的管理。…

KALI搭建log4j2靶場及漏洞復現全流程

這里使用了兩臺KALI虛擬機&#xff0c;一臺用于安裝靶場環境&#xff0c;一臺用于攻擊 一、Docker的安裝&#xff08;靶機&#xff09; 1、Linux內核版本查看 #安裝docker要求內核版本kerner>3.10 #為此&#xff0c;先檢查當前Linux系統的內核版本 uname -a 2、Linux apt…

學習筆記—C++—模板初階

目錄 模板初階 泛型編程 函數模板 模版概念 函數模版格式 模版的原理 函數模板的實例化 模版參數的匹配規則 類模板 模板初階 泛型編程 使用函數重載雖然可以實現&#xff0c;但是有一下幾個不好的地方&#xff1a; 1. 重載的函數僅僅是類型不同&#xff0c;代碼復…

Docker 中多個容器之間的通信

在 Docker 中&#xff0c;多個容器之間的通信可以通過以下幾種主要方式實現&#xff0c;具體選擇取決于網絡需求、隔離性及管理復雜度&#xff1a; 一、自定義 Bridge 網絡&#xff08;推薦&#xff09; 通過創建自定義的 Docker 網絡&#xff0c;容器可以加入同一網絡并通過容…

Day1-初次接觸UFS

經過導師初次介紹&#xff0c;了解工作以芯片測試為主&#xff0c;需堅持學習&#xff0c;小白大致需3-6月入門。整體學習應分為3大塊&#xff0c;UFS協議占40%&#xff08;3-4h&#xff09;,C技能占40%&#xff08;3-4h&#xff09;,工具或業務占20%&#xff08;1-2h&#xff…

【LeetCode 熱題100】二叉樹構造題精講:前序 + 中序建樹 有序數組構造 BST(力扣105 / 108)(Go語言版)

&#x1f331; 二叉樹構造題精講&#xff1a;前序 中序建樹 & 有序數組構造 BST 本文圍繞二叉樹的兩類構造類題目展開解析&#xff1a; 從前序與中序遍歷序列構造二叉樹 將有序數組轉換為二叉搜索樹 我們將從「已知遍歷構造樹」和「平衡構造 BST」兩個角度&#xff0c;拆…

JMeter重要的是什么

重要特性 支持多種協議&#xff1a; JMeter支持對多種協議進行性能測試&#xff0c;包括HTTP、HTTPS、FTP、JDBC&#xff08;數據庫&#xff09;、LDAP、JMS、SOAP、REST等。這使得它能夠適應各種不同的測試場景。強大的負載模擬能力&#xff1a; JMeter能夠模擬大量的虛擬用戶…

一文讀懂WPF系列之MVVM

WPF MVVM 什么是MVVMWPF為何使用MVVM機制WPFMVVM 的實現手段 INotifyPropertyChanged?數據綁定的源端通知??原理 PropertyChanged事件雙向綁定的完整條件常見疑惑問題 什么是MVVM 翻譯全稱就是 model-view-viewmodel 3部分內容 以wpf的概念角度來解釋就是 數據庫數據源模型…

OCR API識別對比

OCR 識別DEMO OCR識別 demo 文檔由來 最開始想使用百度開源的 paddlepaddle大模型 研究了幾天&#xff0c;發現表格識別會跨行&#xff0c;手寫識別的也不很準確。最終還是得使用現成提供的api。。 文檔說明 三個體驗下來 騰訊的識別度比較高&#xff0c;不論是手寫還是識別表…

嵌入式MCU常用模塊

日后填坑。 無線通信模塊 2.4G 基本介紹 以NRF24L01為例。 NRF24L01是一款2.4GHz的無線收發模塊&#xff0c;支持SPI通信協議&#xff0c;具有低功耗、高數據速率&#xff08;250kbps-2Mbps&#xff09;和多設備通信能力。 它可以同時與最多6個其他模塊通信&#xff0c;適合…

記一次InternVL3- 2B 8B的部署測驗日志

測試效果&#xff1a; 問題和耗時如圖 5、資源占用 不釋放資源會一直漲顯存。總體還算滿意&#xff0c;我試了好多個圖理解大模型&#xff0c;就屬它牛一點 附圖一張 補充&#xff0c;測試InternVL3-2B的結果 1、模型下載魔搭社區 2、運行環境&#xff1a; 1、硬件 RTX 30…

Java版本對應關系表

Java版本對應關系表 以下Java主要版本&#xff08;Major Version&#xff09;與公開大版本號的對應關系 公開大版本名稱Major 版本號內部版本號格式示例&#xff08;java -version輸出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

2025最新版flink2.0.0安裝教程(保姆級)

Flink支持多種安裝模式。 local&#xff08;本地&#xff09;——本地模式 standalone——獨立模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 standaloneHA—獨立集群高可用模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 yarn——計算資源統一…

android11 配置默認電池優化白名單

目錄 1.介紹 2.讀取配置文件 3.默認配置一個白名單列表 1.介紹 在 Android 11 中,DeviceIdleController 是負責控制設備進入 Doze 模式(閑置模式) 的核心系統服務,其內部方法 readConfigFileLocked() 負責從配置文件中讀取 Doze 模式的行為參數,包括 idle 階段的時間間…

java中的Future的設計模式 手寫一個簡易的Future

案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一個蛋糕有點儀式感&#xff0c;于是去蛋糕店預定&#xff0c;預定完之后&#xff0c;店老板說蛋糕做好了&#xff0c;到時電話通知你&#xff0c;不可能在這傻傻的等著吧&#xff0c;還有其他事情要做啊&#xff0c;于…

【Redis】Redis C++使用

一、Redis的自定義網絡協議 1.1 為什么可以編寫出一個自定義的Redis客戶端 為什么我們可以編寫出一個自定義的Redis客戶端&#xff1f;因為Redis公開了自己的自定義協議。而對于一些其他軟件的客戶端&#xff0c;我們無法編寫出一個自定義的Redis客戶端&#xff0c;因為他們沒…