模塊一:準備工作與第一個程序 (熱身)
在正式編寫代碼之前,我們需要了解為什么要學習 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++ 擴展通常會提供基礎模板。
- 推薦: 安裝 Visual Studio Community。這是一個功能強大的免費 IDE,自帶 MSVC 編譯器和調試器,安裝和配置相對簡單。
-
macOS 用戶:
- 推薦: 安裝 Xcode Command Line Tools。這會提供 Clang 編譯器和相關工具。
- 打開 "終端" (Terminal) 應用。
- 輸入命令
xcode-select --install
并按回車,按照提示安裝。
- 編輯器: 使用 VS Code。
- 安裝 VS Code。
- 安裝 "C/C++" 擴展。配置
tasks.json
和launch.json
(通常 VS Code 能自動檢測到 Clang)。
- 推薦: 安裝 Xcode Command Line Tools。這會提供 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.json
和launch.json
。
- 安裝 VS Code (通常可以通過包管理器安裝,如
- 推薦: 安裝 build-essential 包,它包含了 GCC 編譯器和常用工具。
重要提示: 環境搭建是初學編程時可能遇到的第一個挑戰。如果遇到困難,請耐心搜索相關教程或尋求幫助。確保你的編譯器能夠正常工作是后續學習的基礎。
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):
- 編譯 (Compile): 打開 VS Code 的終端 (Terminal -> New Terminal),輸入類似命令:
g++ hello.cpp -o hello
(如果是 Clang,用clang++
)。這會讀取hello.cpp
文件,進行編譯和鏈接,生成一個名為hello
(Windows 下可能是hello.exe
) 的可執行文件。-o hello
指定輸出文件的名字。 - 運行 (Run): 在同一個終端里,輸入
./hello
(Linux/macOS) 或.\hello.exe
(Windows) 并按回車。你就能看到輸出結果了。
- 提示: 配置好
tasks.json
后,你可以通過 VS Code 的任務菜單 (Terminal -> Run Build Task...) 來執行編譯命令。
- 編譯 (Compile): 打開 VS Code 的終端 (Terminal -> New Terminal),輸入類似命令:
4. 動手試試看:實戰練習
現在,輪到你來實踐了!
- 確保成功: 完整輸入上面的
Hello, World!
代碼,并成功編譯、運行它。看到輸出結果了嗎?恭喜! - 修改輸出: 嘗試修改
std::cout
語句中的字符串,讓它輸出你自己的名字或者其他你想說的話。例如:std::cout << "My name is [你的名字]!\n";
。重新編譯并運行,看看效果。 - 制造錯誤 (學習調試): 故意在代碼里制造一些小錯誤,看看編譯器會給你什么提示。這非常重要!學會看懂錯誤信息是編程的關鍵技能之一。
- 嘗試一: 刪除
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 scope
或error: '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): 如果你想讓一個變量的值在程序運行期間不能被修改,可以使用
C++const
關鍵字來定義常量。常量名通常用全大寫字母表示(約定俗成)。const double PI = 3.14159; const int MAX_USERS = 100; // PI = 3.14; // 錯誤!不能修改常量的值
使用常量可以提高代碼的可讀性和安全性。
2. 與程序互動:基本輸入輸出
我們已經用過 std::cout
來向屏幕輸出信息。現在來看看如何從用戶那里獲取輸入。
-
C++std::cout
(輸出): 使用流插入運算符<<
將數據發送到控制臺。可以連續輸出多個內容。int apples = 5; double weight = 1.2; std::cout << "我有 " << apples << " 個蘋果." << std::endl; std::cout << "總重量是: " << weight << " 公斤。\n"; // \n 也是換行符
-
C++std::cin
(輸入): 使用流提取運算符>>
從鍵盤讀取用戶輸入,并存儲到變量中。std::cin
通常會忽略輸入前的空白字符(空格、制表符、換行符),并以空白字符作為輸入的分隔。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 / 2
或5 / 2.0
或5.0 / 2.0
結果都是2.5
)。%
(取模/求余): 計算整數除法的余數 (5 % 2
結果是1
)。
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;
。
int score = 0; score += 10; // score 現在是 10 score *= 2; // score 現在是 20
-
關系運算符 (Relational Operators): 用于比較兩個值,結果是
bool
類型 (true
或false
)。==
(等于)!=
(不等于)>
(大于)<
(小于)>=
(大于等于)<=
(小于等于)
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
)。
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;
}
動手試試:
- 將以上代碼輸入到你的 IDE 或編輯器中,保存為
calculator.cpp
。 - 編譯并運行它。
- 按照提示輸入兩個數字(可以是整數或小數),觀察輸出結果。
- 嘗試輸入第二個數字為
0
,看看除法部分會發生什么。(根據上面的代碼,它應該會提示錯誤信息,而不是嘗試計算)。 - 思考: 如果用戶輸入的不是數字而是字母,程序會怎樣?(通常會導致
cin
出錯,后續的輸入和計算可能都不會按預期進行)。
模塊三:控制流程 (讓程序更智能)
之前的程序都是按順序執行的。現在我們要學習如何讓程序根據不同的條件執行不同的代碼(選擇),以及如何讓程序重復執行某段代碼(循環)。
1. 讓程序做決定:條件語句
條件語句允許程序根據一個或多個條件的真假來選擇執行哪部分代碼。
-
C++if
語句: 如果條件為true
,則執行if
后面的代碼塊。int temperature = 15; if (temperature < 20) {std::cout << "天氣有點冷,多穿點衣服。\n"; } // 如果 temperature >= 20,上面 {} 里的代碼就不會執行
-
C++if-else
語句: 如果條件為true
,執行if
塊;否則 (為false
),執行else
塊。兩者必居其一。int age = 16; if (age >= 18) {std::cout << "你已成年。\n"; } else {std::cout << "你還未成年。\n"; }
-
C++if-else if-else
語句: 用于檢查多個互斥的條件。程序會按順序檢查if
和else if
的條件,一旦找到第一個為true
的條件,就執行對應的代碼塊,然后跳過整個if-else if-else
結構。如果所有條件都為false
,則執行最后的else
塊(else
是可選的)。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 不會再被檢查或執行
-
C++switch
語句: 當你需要根據一個整數或字符類型變量的具體值來執行不同操作時,switch
語句通常比一長串if-else if
更清晰。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
的代碼,直到遇到break
或switch
結束,這被稱為“穿透 (fallthrough)”,通常不是我們想要的行為。default
子句是可選的,用于處理所有其他未明確列出的情況。
2. 重復的力量:循環語句
循環語句讓程序可以重復執行一段代碼,直到滿足某個停止條件。
-
C++while
循環: 先判斷條件,如果條件為true
,則執行循環體內的代碼;執行完畢后再次判斷條件,如此反復,直到條件變為false
才停止。如果一開始條件就為false
,循環體一次也不會執行。int count = 1; while (count <= 5) { // 條件:count 小于等于 5std::cout << "Count is: " << count << std::endl;count = count + 1; // 更新 count 的值,否則會無限循環! } std::cout << "循環結束。\n";
-
C++for
循環: 非常適合已知循環次數或需要按規律遞增/遞減的場景。它將初始化、條件判斷、更新這三個部分集中寫在一起,結構更清晰。// 打印 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
循環的執行順序:- 執行初始化部分 (只執行一次)。
- 判斷條件部分。
- 如果條件為
true
,執行循環體代碼。 - 執行更新部分。
- 回到第 2 步,重復判斷條件。
- 如果條件為
false
,循環結束。
-
C++do-while
循環: 先執行一次循環體,然后再判斷條件。如果條件為true
,則繼續循環;否則停止。保證循環體至少執行一次。#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
) 中,用于立即終止整個循環,程序將跳轉到循環體之后的第一條語句。
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
循環,會先執行更新部分再判斷條件;對于while
和do-while
,會直接判斷條件)。
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 到 100)作為秘密數字。
- 循環提示用戶輸入猜測的數字。
- 比較用戶猜測的數字和秘密數字:
- 如果猜對了,顯示祝賀信息并結束游戲。
- 如果猜低了,提示 "太低了!"。
- 如果猜高了,提示 "太高了!"。
- (可選)記錄用戶猜測了多少次。
- 涉及知識點: 隨機數生成 (
rand
,srand
,time
)、循環 (while
或do-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;
}
動手試試:
- 將代碼輸入 IDE,保存為
guessing_game.cpp
。 - 編譯并運行。
- 根據提示開始猜測數字,看看程序的反饋是否符合預期。
- 嘗試玩幾次,看看你最快能用多少次猜對。
- 思考與擴展:
- 如果用戶輸入的不是數字怎么辦?(目前程序可能會出錯)。
- 能不能限制用戶的猜測次數?(比如最多猜 7 次)。
- 能不能讓用戶自己決定秘密數字的范圍?