C++ 初學者常犯數組聲明缺失、下標從 1 開始、邏輯判斷錯位等錯誤。本文通過一個「讀入 10 個數計算平均值並統計大於平均值個數」的案例,逐步修正編譯錯誤與邏輯缺陷。
int main() {
int donation; // 錯誤:未聲明為數組
double average;
int sum;
int c, i;
for(i=1; i<=10; i++) { // 錯誤:下標從 1 開始,C++ 數組從 0 開始
while(isdigit(donation)) // 錯誤:donation 未初始化,isdigit 參數需字符
cout << "Enter " << i << " number:\n";
cin >> donation[i]; // 編譯錯誤:invalid types 'int[int]' for array subscript
sum += donation[i];
average = sum / i; // 邏輯錯誤:每次循環算平均值,應循環後算
}
while(donation[i] > average) // 錯誤:i=11 越界,邏輯應遍歷數組
c++;
// ...
}
donation聲明為int,非數組,故donation[i]嘗試對整數使用下標運算符 →invalid types 'int[int]' for array subscript
#include <iostream>
using namespace std;
int main() {
const int MAX = 10;
double donation[MAX]; // 1. 聲明 double 數組,題目要求 donation 值
double sum = 0; // 2. 初始化為 0
int count_above = 0; // 3. 計數器初始化
int i;
// 4. 讀入循環:下標 0~9,最多 10 個,遇非數字提前結束
for (i = 0; i < MAX; i++) {
cout << "Enter value " << (i+1) << " (non-digit to stop): ";
if (!(cin >> donation[i])) { // 5. 直接用流提取判斷輸入有效性
break; // 非數字輸入導致流失效,退出循環
}
sum += donation[i];
}
int actual_count = i; // 實際讀入個數
if (actual_count == 0) {
cout << "No valid input.\n";
return 0;
}
double average = sum / actual_count; // 6. 循環後計算平均值
// 7. 遍歷實際讀入的元素統計
for (i = 0; i < actual_count; i++) {
if (donation[i] > average) {
count_above++;
}
}
cout << "平均值 = " << average << endl;
cout << "大於平均值的個數 = " << count_above << endl;
return 0;
}
| 問題 | 原代碼 | 修正代碼 | 說明 |
|---|---|---|---|
| 數組聲明 | int donation | double donation[10] | 題目要求 double,需分配空間 |
| 下標起始 | i=1; i<=10 | i=0; i<10 | C++ 數組 0-based |
| 輸入判斷 | isdigit(donation) | if(!(cin>>donation[i])) break | 流提取失敗即非數字/EOF |
| 平均值計算 | 循環內每次算 | 循環後算一次 | 需全部讀完再算 |
| 統計邏輯 | while(donation[i]>avg) | for遍歷數組 | 需檢查每個元素 |
| 變量初始化 | 未初始化 | 全部初始化 | 避免未定義行為 |
題目「最多將 10 個 donation 值讀入」暗示:
actual_count 正確處理核心錯誤在於未聲明數組導致編譯失敗,邏輯上下標越界、平均值計算時機錯誤、統計遍歷缺失。修正要點:正確聲明數組、0-based 下標、流狀態判斷輸入、循環後計算平均、完整遍歷統計。養成「聲明初始化、邊界檢查、單一職責」習慣可避免 90% 的初級錯誤。