Nhiệm vụ. Tính điểm tổng hợp của vận động viên
– Trong một cuộc thi đấu thể thao khu vực dạng Sea Games, các cầu thủ tham gia thi đấu ở các bộ môn khác nhau và do sự phức tạp của truyền tin nên ban tổ chức (BTC) đã quyết định nhập thông tin kết quả thi đấu của các vận động viên vào các tệp văn bản, sau đó các tệp này được chuyển về trung tâm để xử lí.
– Mỗi bộ môn thể thao sẽ có số lượng ban giám khảo khác nhau. Mỗi tập dữ liệu lưu thông tin sẽ có khuôn dạng gồm nhiều dòng, mỗi dòng là thông tin của một vận động viên thi đấu tại một bộ môn nào đó. Mỗi dòng của tệp thông tin sẽ bao gồm:
+ Mã số động viên.
+ Điểm cho của các giám khảo, giữa các điểm số đều có dấu cách.
+ Điểm số được cho có thể là số nguyên hoặc số thập phân, thang điểm 10.
– Theo quy định của BTC, quy định tính điểm chung cho mỗi vận động viên như sau: Điểm tổng hợp của mỗi vận động viên là trung bình cộng điểm của ban giám khảo.
– Tuy nhiên trong mỗi ban giám khảo luôn có hai giám khảo đặc biệt, hai giám khảo này có hệ số tổng hợp là 2, trong khi các giám khảo khác có hệ số 1. Theo quy định của BTC thì các giám khảo đặc biệt sẽ ở vị trí đầu tiên và cuối cùng của danh sách. Ở tất cả các bộ môn thể thao số lượng thành viên ban giám khảo phải lớn hơn 2.
– Nhiệm vụ của em là tính điểm tổng hợp của các vận động viên từ tệp văn bản SeaGames.inp. Kết quả ghi ra tệp ketqua.out có dạng như sau:
+ Tệp sẽ có nhiều dòng, số dòng bằng đúng số dòng của tệp đầu vào.
+ Trên mỗi dòng ghi mã của vận động viên và điểm tổng hợp tương ứng. Yêu cầu ghi điểm tổng hợp với hai chữ số sau dấu phẩy.
Hướng dẫn:
a. Phân tích tổng quát
Từ yêu cầu của bài toán, dễ thấy chương trình có thể chia thành ba công việc, hay mô đun con, tương đối độc lập như sau:
– Mô đun 1: Đọc dữ liệu từ tệp.
– Mô đun 2: Xử lí dữ liệu đã đọc ở mô đun 1.
– Mô đun 3: Ghi dữ liệu đã xử lí ra tệp theo yêu cầu.
Các mô đun sẽ được thiết kế một cách độc lập. Chương trình chính sẽ tổng hợp và kết nối các mô đun.
b. Thiết kế mô đun nhập dữ liệu
Dữ liệu sẽ được nhập từ tệp SeaGames.inp và được đưa vào hai mảng:
– Mảng thứ nhất là danh sách mã số của các vận động viên.
– Mảng thứ hai có ý nghĩa như sau: Tương ứng với mỗi vận động viên từ mảng thứ nhất, mỗi phần tử của mảng thứ hai là dãy các điểm số mà ban giám khảo chấm cho
vận động viên này.
Hai mảng này sẽ được đặt tên lần lượt là DS và Diem.
Mô đun này được thiết lập bằng hàm nhapDL() với tham số đầu vào là tên tệp dữ liệu. Hàm sẽ trả lại hai mảng DS và Diem.
Chú ý: Khi đọc dữ liệu từ tệp, với mỗi dòng, phần tử đầu tiên chính là mã số của vận động viên, sẽ được đưa vào mảng DS, dãy các giá trị còn lại chính là dãy điểm và được đưa vào mảng Diem.
Hàm nhapDL(fin) được mô tả như sau:
c. Thiết kế mô đun xử lí dữ liệu chính
Mục đích của mô đun này là tính điểm tổng hợp cho mỗi vận động viên.
Mỗi vận động viên sẽ tương ứng với một dãy các điểm số được lấy từ mảng Diem. Từ dãy này sẽ tính được điểm tổng hợp theo cách tính đặc biệt của BTC. Mô đun này
sẽ cần hai hàm.
– Hàm diem_gk() sẽ tính điểm tổng hợp các giám khảo từ dãy các điểm.
Chú ý: theo yêu cầu thì các giám khảo đầu tiên và cuối cùng có hệ số 2 nên cần tinh điểm các giám khảo này 2 lần. Điều này được mô tả tại dòng lệnh 2. Hàm này được thiết kế chi tiết như sau:
– Hàm Xuly() sẽ tính toán điểm tổng hợp cho tất cả các vận động viên với đầu vào là dãy Diem. Hàm này sẽ sử dụng hàm diem_gk() đã thiết lập ở phần trên. Kết quả tính toán là một dãy điểm tổng hợp và là giá trị trả lại của hàm này. Kết quả của hàm Xuly() là dãy kq.
d. Thiết kế mô đun đưa kết quả ra
Cuối cùng là mô đun đưa kết quả ra tệp đầu ra theo yêu cầu của bài toán.
Hàm ghiDL() sẽ có ba tham số đầu vào là tên tệp dữ liệu ra, hai mảng DS và kq. Khai báo của hàm này là ghiDL(fout, / , trong đó fout là tên tệp dữ liệu đầu ra, A là mảng danh sách các mã số của hạt, A. Dàn viên, B là mảng ghi kết quả điểm tổng hợp của các vận động viên. Kết quả đưa ra màn hình.
e. Tổng hợp chương trình chính
Sau đây là toàn bộ chương trình: