XS-07 · Mỗi sinh viên là một dict; tìm và thống kê
Xem dạng PDFĐề
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_cknhư XS-06. - Dòng tiếp theo: số nguyên ~m~.
- ~m~ dòng lệnh, mỗi dòng là
TIM mahoặcTHONGKE.
Kết quả
Thực hiện các lệnh theo thứ tự:
TIM ma: một dòngma Ho Ten diem_hp loainhư 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ì inma 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.5hoặc6,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,malà 1–12 ký tự chữ/số) hoặcTHONGKE. 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 inKHONG 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.
THONGKEin năm dòng A 2, B 1, C 1, D 1, F 1.TIM 23010003tìm thấy Le Minh Duc, ~8{,}48 \to 8{,}5~, loại A.TIM 23010009khô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ùngtheo_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 svhỏ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)