首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 數組下標越界與邏輯錯誤修正:從編譯報錯到正確統計大於平均值的個數

     編輯:程式設計綜合問答

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 donationdouble donation[10]題目要求 double,需分配空間
下標起始i=1; i<=10i=0; i<10C++ 數組 0-based
輸入判斷isdigit(donation)if(!(cin>>donation[i])) break流提取失敗即非數字/EOF
平均值計算循環內每次算循環後算一次需全部讀完再算
統計邏輯while(donation[i]>avg)for遍歷數組需檢查每個元素
變量初始化未初始化全部初始化避免未定義行為

進階:處理「最多 10 個」的語義

題目「最多將 10 個 donation 值讀入」暗示:

  • 用戶可輸入少於 10 個 (如輸入字母結束)
  • 統計基於實際讀入個數而非固定 10
  • 上述代碼通過 actual_count 正確處理

總結

核心錯誤在於未聲明數組導致編譯失敗,邏輯上下標越界、平均值計算時機錯誤、統計遍歷缺失。修正要點:正確聲明數組、0-based 下標、流狀態判斷輸入、循環後計算平均、完整遍歷統計。養成「聲明初始化、邊界檢查、單一職責」習慣可避免 90% 的初級錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved