需求:VC++ MFC 實作成績管理,含資料輸入/修改/刪除、GPA 計算排名、等第統計圖表、文字檔匯入匯出、15 筆以上測試資料。建議採用 **Document/View 架構 + SQLite + Chart 控制項** 快速落地。
| 模組 | 關鍵類別/技術 | 說明 |
|---|---|---|
| 資料層 | `CRecordset` / `CSqliteDB` (Wrapper) | 學生、課程、成績三表,支援交易 |
| 文件類 | `CStudentDoc` : `CDocument` | 管理資料集合、序列化、匯入匯出 CSV |
| 視圖類 | `CStudentView` : `CListView` / `CFormView` | 列表顯示、編輯對話框、右鍵選單 |
| 統計引擎 | `CGPAEngine`、`CGradeDist` | GPA 計算、排名、五等第統計、圓餅/長條圖 |
| 圖表 | MSChart ActiveX / `CChartCtrl` (CodeProject) | 動態繪製等第分佈圖 |
| 持久化 | `CArchive` (二進制) + CSV 匯出 | 雙格式備份,相容 Excel |
// GPA = Σ(學分 × 等級點數) / Σ學分
// 等級點數:A=4.0, B=3.0, C=2.0, D=1.0, F=0
double CalcGPA(const CArray& scores) {
double sumGP = 0, sumCredit = 0;
for (auto& s : scores) {
double gp = (s.score >= 90) ? 4.0 :
(s.score >= 80) ? 3.0 :
(s.score >= 70) ? 2.0 :
(s.score >= 60) ? 1.0 : 0.0;
sumGP += gp * s.credit;
sumCredit += s.credit;
}
return sumCredit > 0 ? sumGP / sumCredit : 0;
}
// 在 OnNewDocument 或專用按鈕中
void GenerateSampleData() {
const char* names[] = {"陳大文","林小美","王建國", ...}; // 20 筆
for (int i=0; i<20; ++i) {
Student s; s.id = 2024000+i; s.name = names[i]; s.dept = "資工系";
for (int c=0; c<5; ++c) {
Score sc; sc.course = courses[c]; sc.credit = 3;
sc.score = 50 + rand()%50; // 50-99
s.scores.Add(sc);
}
doc.AddStudent(s);
}
doc.UpdateAllViews(nullptr);
}
採用成熟開源專案為基礎,專注調整業務規則 (GPA 公式、等第區間) 與 UI 美化,即可在期限內交付高分作業。