課程作業要求用 C++ 實作學生成績管理系統,功能含:成績輸入/存檔/輸出、排序、區間統計、使用者驗證、友善介面、容錯。與其從零手寫鏈表/檔案 I/O,不如採用 Qt + SQLite 成熟框架,專注業務邏輯,快速產出高品質專案。
| 層級 | 技術選型 | 職責 |
|---|---|---|
| 資料層 | SQLite (本地檔案資料庫) | 學生基本資料、成績、用戶帳號持久化 |
| 資料存取層 | Qt Sql 模組 (QSqlDatabase, QSqlQuery) | 封裝 CRUD、交易、參數綁定防注入 |
| 業務邏輯層 | C++ 類別 (StudentService, ScoreService) | 驗證規則(0~100 分)、排序演算法、區間統計 |
| 表現層 | Qt Widgets / QML | 登入對話框、主視窗(表格檢視、圖表統計)、匯入匯出 CSV |
CREATE TABLE users (
id INTEGER PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL
);
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
dept TEXT
);
CREATE TABLE scores (
id INTEGER PRIMARY KEY,
student_id INTEGER REFERENCES students(id),
course TEXT NOT NULL,
score INTEGER CHECK(score BETWEEN 0 AND 100),
semester TEXT
);
SELECT password_hash FROM users WHERE username=?,用 QCryptographicHash::hash(pwd, QCryptographicHash::Sha256) 比對。QSpinBox(0,100) 強制限制;後端再 if (score < 0 || score > 100) throw。ORDER BY score DESC 直接回傳;或記憶體 std::sort(vec.begin(), vec.end(), [](a,b){return a.score > b.score;}) 展示多種演算法。SELECT COUNT(*), GROUP_CONCAT(id) FROM scores WHERE score BETWEEN ? AND ?,配合 QChart 畫長條圖/圓餅圖。QFile + QTextStream 處理 CSV,編碼用 UTF-8 with BOM 相容 Excel。GitHub 搜尋 Qt SQLite student management 可找到多個開源專案,例如:
https://github.com/username/student-management-qt(示例連結)
下載後用 Qt Creator 開啟 .pro,安裝 Qt 5.15+、SQLite driver 即可編譯執行,依需求調整 UI 與業務規則。
QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("data.db"); 路徑用 QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) 避免權限問題。QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"))。Qt Test 覆蓋 Service 層邏輯,確保排序、統計正確性。採用 Qt + SQLite 架構,不只能滿足作業所有功能需求,更能練習企業級分層設計、資料庫操作與跨平台 GUI 開發,一舉多得。