原代碼三大錯誤:
int a[11]; int n; ... for(i=1;i —— 下標從 1 開始,a[0] 未初始化,輸入 n 個數只存 n-1 個。 for(j=1;j<=n-1;j++) for(i=0;i<=n-j;i++) —— 內層 i<=n-j 導致 a[i+1] 訪問 a[n] 越界。n=5 在數組定義**之後**,VLA(可變長數組)非標準 C++,行為未定義。#include
using namespace std;
int main() {
int n;
cout << "請輸入數組長度 (≤10): ";
cin >> n;
if (n <= 0 || n > 10) return 1;
int a[10]; // 固定最大長度,或用 vector
cout << "請輸入 " << n << " 個整數:\n";
for (int i = 0; i < n; i++) cin >> a[i];
// 冒泡排序:外層 n-1 趟,內層遞減
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
}
}
}
cout << "排序後:\n";
for (int i = 0; i < n; i++) cout << a[i] << ' ';
cout << '\n';
return 0;
}
| 原代碼 | 問題 | 修正 |
|---|---|---|
for(i=1;i<n;i++) | 跳過 a[0] | for(i=0;i<n;i++) |
i<=n-j | a[i+1] 越界 | i<n-1-j 即 j<n-1-i |
int a[11]; n=5; | VLA 非標準 | 定義固定大小或用 vector |
cout<<a[i]<<\"\\n\" | 每行一個數 | cout<<a[i]<<' ' 同行空格分隔 |
#include
#include
#include
int main() {
int n; cin >> n;
vector a(n);
for (int &x : a) cin >> x;
sort(a.begin(), a.end()); // 標準庫 O(n log n)
for (int x : a) cout << x << ' ';
}
記住:C++ 下標從 0 開始,循環邊界寬嚴慎(< 而非 ≤),優先用標準庫算法,手寫排序僅供教學驗證。