XS-07 · Mỗi sinh viên là một dict; tìm và thống kê

Xem dạng PDF

Gửi bài giải

Điểm: 1,00
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
Sách "Lập trình cơ sở với Python"
Dạng bài
Ngôn ngữ cho phép
Python

Đề

Phần 7 của bài toán xuyên suốt "Điểm học phần". Mang theo: tinh_diem_hp, xep_loai (XS-04, mục 5.7); chuan_hoa_ho_ten, ma_sv_hop_le, tach_dong (XS-06, mục 7.7).

Đọc danh sách sinh viên theo dạng của XS-06, nhưng dòng có mã sai chỉ bị bỏ qua, không in gì (khác XS-06: kết quả bây giờ chỉ in theo lệnh). Lưu mỗi sinh viên hợp lệ thành một dict gồm 4 khóa ma, ho_ten, diem_qt, diem_ck. Sau đó thực hiện lần lượt các lệnh:

  • TIM ma — in thông tin sinh viên có mã đó;
  • THONGKE — in số sinh viên của từng loại A, B, C, D, F.

Kiến thức dùng (Chương 8): dict, get(), danh sách các dict, dict làm chỉ mục tra theo mã, đếm tần suất; vòng lặp đọc lệnh.

Dữ liệu vào

  • Dòng đầu: số nguyên ~n~.
  • ~n~ dòng sinh viên, mỗi dòng dạng ma ho ten diem_qt diem_ck như XS-06.
  • Dòng tiếp theo: số nguyên ~m~.
  • ~m~ dòng lệnh, mỗi dòng là TIM ma hoặc THONGKE.

Kết quả

Thực hiện các lệnh theo thứ tự:

  • TIM ma: một dòng ma Ho Ten diem_hp loai như XS-06 (họ tên đã chuẩn hóa, điểm học phần 1 chữ số thập phân); nếu không có sinh viên hợp lệ nào mang mã đó thì in ma KHONG TIM THAY (mã in đúng như trong lệnh).
  • THONGKE: năm dòng theo thứ tự A, B, C, D, F; mỗi dòng gồm chữ loại, một dấu cách, số sinh viên loại đó (kể cả 0).

Ràng buộc

  • ~1 \le n \le 100~, ~1 \le m \le 100~.
  • Dòng sinh viên đúng như ràng buộc của XS-06: không có khoảng trắng đầu/cuối dòng, các phần cách nhau một hoặc nhiều dấu cách; mã 1–12 ký tự chữ/số ASCII, hợp lệ khi gồm đúng 8 chữ số; họ tên ≥ 1 từ chữ cái không dấu; điểm trong ~[0; 10]~ dạng 5, 6.5 hoặc 6,5.
  • Các mã hợp lệ đôi một khác nhau.
  • Dòng lệnh viết đúng TIM ma (một dấu cách, ma là 1–12 ký tự chữ/số) hoặc THONGKE. Mã trong lệnh có thể không có trong danh sách, có thể là mã của một dòng mã sai (khi đó cũng in KHONG TIM THAY).

Ví dụ

Dữ liệu vào:

6
23010001 Nguyen Van An 7.5 8.0
23010002 Tran Thi Binh 6.5 7.0
23010003 Le Minh Duc 8.0 8.8
23010004 Pham Quoc Dung 4.0 4.0
23010005 Hoang Gia Han 5.0 3.0
23010006 Vu Ngoc Khanh 10.0 10.0
3
THONGKE
TIM 23010003
TIM 23010009

Kết quả:

A 2
B 1
C 1
D 1
F 1
23010003 Le Minh Duc 8.5 A
23010009 KHONG TIM THAY

Giải thích ví dụ

Sáu sinh viên (Ca 1–6 của bộ mẫu) có điểm học phần ~7{,}8;\ 6{,}8;\ 8{,}5;\ 4{,}0;\ 3{,}8;\ 10{,}0~, tức loại B, C, A, D, F, A.

  • THONGKE in năm dòng A 2, B 1, C 1, D 1, F 1.
  • TIM 23010003 tìm thấy Le Minh Duc, ~8{,}48 \to 8{,}5~, loại A.
  • TIM 23010009 không có trong danh sách → 23010009 KHONG TIM THAY.

Các ca nên tự thử:

Dữ liệu vào Kết quả Ý nghĩa
2 / 2301002 Tran Thi Binh 6.5 7.0 / 23010007 do HOANG bach 6,5 7 / 3 / TIM 2301002 / TIM 23010007 / THONGKE 2301002 KHONG TIM THAY / 23010007 Do Hoang Bach 6.8 C / A 0 / B 0 / C 1 / D 0 / F 0 dòng mã sai bị bỏ (không in gì); loại không có ai vẫn in 0
1 / 23010008 Nguyen Hoai Nam 9.0 7.0 / 2 / TIM 23010001 / TIM 23010008 23010001 KHONG TIM THAY / 23010008 Nguyen Hoai Nam 7.8 B mã không có trong dữ liệu

(dấu / ngăn cách các dòng)

Lưu ý khi nộp

  • Tạo dict mới cho mỗi sinh viên (bên trong vòng lặp hoặc trong hàm tao_sinh_vien); một dict dùng chung sẽ làm mọi phần tử mang dữ liệu người cuối.
  • Tra mã có thể không tồn tại: dùng theo_ma.get(ma), không dùng theo_ma[ma] (KeyError).
  • Hệ thống so từng dòng, từng ký tự (chỉ bỏ qua khoảng trắng ở cuối dòng và dòng trống): giữa các từ của họ tên, giữa các phần trên một dòng phải đúng một dấu cách — title() mà quên gộp khoảng trắng (Le Minh Duc) sẽ bị Wrong Answer.
  • Đếm bằng dem[loai] = dem.get(loai, 0) + 1; in theo chuỗi "ABCDF" để đủ năm dòng, đúng thứ tự.
  • ma in sv hỏi khóa của dict ("ma", "ho_ten"…), không hỏi giá trị.

Nguồn trong sách: Bài XS-07, mục 8.6, giáo trình Lập trình cơ sở với Python — TS. Nguyễn Quốc Long · Mức: XS (bài toán xuyên suốt, phần 7/8)


Đang tải...