原代碼缺陷
- 輸入循環與統計循環混淆,導致
i 索引越界。
- 最小值邏輯錯誤:
if (score[i] < score[i+1]) 僅比較相鄰元素,且未初始化 min。
- 未重置累加變量,導致多次運行結果疊加。
重構方案:面向對象封裝
#include <iostream>
#include <iomanip>
using namespace std;
class Student {
string name;
double scores[4];
public:
void input() {
cout << "輸入學生姓名: "; cin >> name;
for (int i = 0; i < 4; ++i) {
cout << "第" << i+1 << "門成績: "; cin >> scores[i];
}
}
double average() const {
double sum = 0;
for (double s : scores) sum += s;
return sum / 4;
}
double minScore() const {
double m = scores[0];
for (double s : scores) if (s < m) m = s;
return m;
}
void print() const {
cout << name << " 平均分: " << fixed << setprecision(2) << average()
<< " 最低分: " << minScore() << endl;
}
};
int main() {
const int N = 4;
Student stu[N];
for (int i = 0; i < N; ++i) {
cout << "--- 第 " << i+1 << " 位學生 ---\n";
stu[i].input();
}
cout << "\n=== 統計結果 ===\n";
for (int i = 0; i < N; ++i) stu[i].print();
return 0;
}
核心改進
- 封裝學生數據與操作,職責清晰。
- 獨立計算平均值、最小值,邏輯正確且可復用。
- 使用
fixed << setprecision(2) 格式化輸出。