Môn Tin họcQuản lý học tập Tin học

Bắt lỗi chương trình kiểm tra mã báo danh phòng thi

Lớp 11Lập trìnhpythonGiải quyết vấn đề với máy tínhVận dụng cao

Thang điểm 10 · 6 test case chấm tự động · 3 tiêu chí chấm

Một bạn học sinh viết chương trình kiểm tra xem danh sách mã báo danh (đọc từ máy quét) của một phòng thi có hợp lệ hay không — nghĩa là dãy đó phải trùng khít với dãy 1, 2, ..., n sau khi sắp xếp (không thiếu, không trùng mã nào). Bạn ấy dựa theo đúng ý tưởng làm mịn dần đã học (sắp xếp dãy rồi so sánh với 1..n), nhưng chương trình dưới đây lại cho kết quả sai với một số bộ dữ liệu:

def sapxep(A):
    for i in range(len(A)):
        j = i
        while j > 0 and A[j] < A[j-1]:
            A[j], A[j-1] = A[j-1], A[j]
            j = j - 1

def kt_maso(A):
    sapxep(A)
    kq = True
    for i in range(len(A)):
        if A[i] != i:
            kq = False
            break
    return kq

n = int(input())
A = list(map(int, input().split()))
if kt_maso(A):
    print("HỢP LỆ")
else:
    print("KHÔNG HỢP LỆ")

Em hãy tìm ra chỗ sai trong chương trình trên (gợi ý: so sánh chỉ số i với giá trị cần có tại vị trí đó sau khi sắp xếp), sửa lại cho đúng, rồi viết lại toàn bộ chương trình hoàn chỉnh.

Định dạng input: dòng 1 là số nguyên n; dòng 2 gồm n số nguyên cách nhau bởi dấu cách, là danh sách mã báo danh.

Định dạng output: in ra HỢP LỆ nếu dãy là hoán vị của 1..n, ngược lại in ra KHÔNG HỢP LỆ.

InputOutputGiải thích
5
3 1 5 2 4
HỢP LỆSau khi sắp xếp: 1 2 3 4 5, đúng là dãy 1..5
5
3 1 5 2 2
KHÔNG HỢP LỆMã 2 lặp lại, thiếu mã 4
10
2 1 9 10 8 6 5 2 3 1
KHÔNG HỢP LỆMã 1, 2 lặp lại, thiếu mã 4, 7
#làm mịn dần#hàm con#off-by-one#sắp xếp#gỡ lỗi#category:tu_duy_phan_bien#difficulty:analyzing

Giáo viên giao bài này cho lớp, học sinh nộp bài trực tuyến và được chấm tự động.

Giáo viên đăng nhập để giao bài