Bỏ qua để đến nội dung

Hướng dẫn chấm bài bằng bộ test

Trang này hướng dẫn thầy cô dùng bộ test đi kèm bộ đề ôn thi HSG Tin học THCS để chấm bài của học sinh. Phần “Lỗi hay gặp” ở cuối trang hữu ích cho cả các em tự luyện.

Sau khi giải nén, thư mục goi-test có dạng:

goi-test/
├── HUONG-DAN.html hướng dẫn từng bước cho giáo viên
├── MO-UNG-DUNG-CHAM.bat Windows: bấm đúp để mở ứng dụng chấm
├── mo-ung-dung-cham.sh Linux: sh mo-ung-dung-cham.sh
├── loi-giai/ code lời giải mẫu Python và C++ của từng bài
├── cham.py, ung_dung_cham.py ... phần mềm chấm
└── de-01/
├── XEDAP/
│ ├── problem.json điểm của bài, thời gian chạy tối đa
│ └── tests/ 01.inp, 01.out, 02.inp, 02.out, ...
└── ...

Mỗi bài có 12–20 test, chia đúng theo tỉ lệ ràng buộc ghi trong đề (ví dụ “Có 40% số test với n ≤ 1000”). Các test có điểm bằng nhau, nên học sinh chỉ làm được subtask nhỏ vẫn nhận được phần điểm tương ứng.

Cách này dành cho thầy cô không quen gõ lệnh.

  1. Cài Python 3.8 trở lên. Trên Windows, nhớ tích ô Add python.exe to PATH khi cài. Muốn chấm bài C++ thì máy cần có g++: ứng dụng tự tìm g++ đi kèm Dev-C++ hoặc Code::Blocks (bản có MinGW). Trên Linux, cài bằng sudo apt install g++.
  2. Giải nén gói test, bấm đúp file MO-UNG-DUNG-CHAM.bat (Linux: sh mo-ung-dung-cham.sh). Một cửa sổ lệnh hiện ra và trình duyệt tự mở trang chấm bài. Giữ cửa sổ lệnh mở trong lúc chấm.
  3. Mục Kiểm tra máy → Chạy thử: ứng dụng chấm lời giải mẫu để chắc máy đã sẵn sàng.
  4. Mục Chấm một bài: chọn đề, kéo file bài làm vào, bấm Chấm bài. Bấm vào một test sai để xem dữ liệu vào, đáp án và kết quả của học sinh cạnh nhau.
  5. Mục Chấm cả lớp: chọn thư mục bài làm của lớp (cấu trúc ở phần Chấm cả lớp), bấm Chấm cả lớp, rồi tải bảng điểm về mở bằng Excel.

Ứng dụng chạy ngay trên máy (địa chỉ 127.0.0.1), không cần Internet và không gửi bài làm đi đâu. Ứng dụng cũng tự cảnh báo các lỗi hay gặp ở cuối trang này (sai tên file, nhập từ bàn phím, in thừa câu thông báo).

cham.py chạy được trên Windows, macOS và Linux. Chỉ cần cài Python 3.8 trở lên. Muốn chấm bài C++ thì máy cần có g++: trên Windows cài MinGW (thường có sẵn nếu đã cài Dev-C++ hoặc Code::Blocks và thêm vào PATH), trên macOS chạy xcode-select --install.

Mở cửa sổ lệnh (Command Prompt / Terminal) tại thư mục goi-test rồi chạy:

Terminal window
# Chấm một bài làm
python cham.py de-01/XEDAP D:/baiLam/XEDAP.py
python cham.py de-01/TIACAY D:/baiLam/TIACAY.cpp

Kết quả hiện từng test và điểm của bài:

Bài TIACAY (Tỉa hàng cây), 6 điểm
Test 01: AC Đúng 0.02s
...
Test 20: TLE Quá thời gian 2.00s
=> Đúng 9/20 test, điểm: 2.70/6

Ý nghĩa các kết quả:

Kí hiệuViết tắt củaÝ nghĩa
ACAcceptedĐúng
WAWrong AnswerSai kết quả
TLETime Limit ExceededChạy quá thời gian cho phép
RERuntime ErrorChương trình bị lỗi khi chạy
CECompilation ErrorLỗi biên dịch (bài C++ viết sai cú pháp), cả bài 0 điểm
NONo OutputKhông tìm thấy file kết quả (thường do sai tên file). Mã riêng của bộ công cụ này

AC, WA, TLE, RE, CE là các mã chuẩn, hầu hết hệ thống chấm bài lập trình đều dùng.

Xếp bài làm của mỗi học sinh vào một thư mục riêng, file đặt tên theo mã bài:

bai-lam-lop-9a/
├── nguyen-van-an/ XEDAP.py CHUDAO.py TIACAY.cpp
├── tran-thi-binh/ XEDAP.cpp CHUDAO.cpp SOCHIA5.cpp TIACAY.cpp
└── ...

Rồi chạy:

Terminal window
python cham.py de-01 bai-lam-lop-9a --csv bang-diem.csv

cham.py chấm lần lượt từng học sinh, in bảng điểm và ghi ra file bang-diem.csv (mở được bằng Excel).

  • Sai tên file. Phải đọc đúng XEDAP.INP và ghi đúng XEDAP.OUT. Viết xedap.inp vẫn chạy được trên Windows nhưng sẽ lỗi trên hệ thống chấm chạy Linux, nên hãy viết đúng chữ hoa như đề.
  • In thêm câu thông báo. Các dòng như Nhap n = hay Ket qua la: làm kết quả sai. Chỉ ghi đúng những gì đề yêu cầu.
  • Vẫn nhập từ bàn phím. Dùng input() hay cin mà không mở file thì chương trình sẽ đứng chờ và bị tính quá thời gian.
  • Tràn số với C++. Khi đề cho giá trị tới 109 hoặc 1018, các phép nhân và tổng phải dùng long long.
  • Quá thời gian ở các test lớn. Hãy đọc kỹ phần ràng buộc để chọn thuật toán phù hợp. Thuật toán O(n2) với n = 105 không thể chạy kịp trong 1 giây.

Khung chương trình đọc/ghi file đúng cách:

with open("XEDAP.INP") as f:
m, n = map(int, f.read().split())
# ... tính toán ...
with open("XEDAP.OUT", "w") as f:
f.write(f"{x} {y}\n")
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("XEDAP.INP", "r", stdin);
freopen("XEDAP.OUT", "w", stdout);
long long m, n;
cin >> m >> n;
// ... tính toán ...
cout << x << " " << y << "\n";
return 0;
}