Bài 29. Thực hành thiết kế chương trình theo mô đun

Chủ đề 6. Kĩ thuật lập trình – Bài 29. Thực hành thiết kế chương trình theo mô đun – sách giáo khoa trang 132 lớp 11 Khoa học máy tính – Kết Nối Tri Thức, mời các em tham khảo cùng Bumbii.

Chủ đề 6. Kĩ thuật lập trình – Bài 29. Thực hành thiết kế chương trình theo mô đun

Luyện tập

Câu 1. Hãy chỉnh sửa lại chương trình trên nêu bổ sung thêm điều kiện sau vào nhiệm vụ:

Trong tệp kết quả đầu ra, thứ tự các vận động viên được ghi theo thứ tự giảm dần của điểm đánh giá.

Lời giải:

def nhapDL(finp):
    f = open(finp)
    A = []
    B = []
    for line in f:
        s = line.split()
        A.append(s[0])
        temp = s[1:len(s)]
        temp = [float(x) for x in temp]
        B.append(temp)
    f.close()
    return A, B

def diem_gk(d):
    diem = sum(d) + d[0] + d[len(d) - 1]
    diem = diem / (len(d) + 2)
    return round(diem, 2)

def xuly(B):
    kq = []
    for i in range(len(B)):
        diem = diem_gk(B[i])
        kq.append(diem)
    return kq

def ghiDL(fout, A, B):
    f = open(fout, "w")
# sắp xếp theo thứ tự giảm dần của điểm đánh giá
    A, B = zip(*sorted(zip(A, B), key=lambda x: x[1], reverse=True))
    for i in range(len(A)):
        print(A[i], B[i], file=f)
    f.close()

# Chương trình chính
finp = "seagames.inp"
fout = "ketqua.out"
DS, Diem = nhapDL(finp)
Kq = xuly(Diem)
ghiDL(fout, DS, Kq)

Danh sách các vận động viên trong tệp kết quả đầu ra được sắp xếp theo thứ tự giảm dần của điểm đánh giá trong hàm ghiDL()

Dòng : A, B = zip(*sorted(zip(A, B), key=lambda x: x[1], reverse=True))

  • Sử dụng hàm zip để ghép cặp tên vận động viên từ danh sách A và điểm đánh giá từ danh sách B thành một danh sách chứa các cặp (tên vận động viên, điểm đánh giá).
  • Sau đó, sử dụng hàm sorted để sắp xếp danh sách này dựa trên điểm đánh giá (phần tử thứ 1 trong mỗi cặp) theo thứ tự giảm dần (reverse=True).
  • Kết quả của việc này là danh sách các vận động viên được sắp xếp theo thứ tự giảm dần của điểm đánh giá, và chúng được ghi vào tệp kết quả đầu ra.

Câu 2. Trong nhiệm vụ trên, nếu công thức tính điểm tổng hợp của Sea Games thay đổi thì chúng ta có phải sửa lại toàn bộ chương trình hay không? Nếu cần thì chỉ phải sửa mô đun nào? Hàm nào?

Lời giải:

Nếu công thức tính điểm tổng hợp của Sea Games thay đổi thì chúng ta không cần phải sửa lại toàn bộ chương trình. Nếu cần thì chỉ phải sửa mô đun xử lý dữ liệu chính và hàm diem_gk(d):

  • Hàm diem_gk(d) là hàm tính điểm tổng hợp dựa trên công thức hiện tại đã được định nghĩa trong đoạn mã.
  • Nếu công thức tính điểm tổng hợp thay đổi, cần thay đổi logic tính toán trong hàm diem_gk(d) để phản ánh công thức mới.
  • Các phần khác của chương trình không thay đổi, vì sử dụng hàm diem_gk(d) để tính điểm tổng hợp, do đó khi hàm này được sửa, kết quả đầu ra cũng sẽ được cập nhật theo công thức mới.

Vận dụng

Thiết lập chương trình thiết kế theo mô đun cho các bài toán sau:

Câu 1. Cho trước số tự nhiên n, cần in ra trên màn hình dãy n số nguyên tố đầu tiên. Ví dụ nếu n = 5 thì dãy cần in ra sẽ là 2, 3, 5, 7, 11.

Lời giải:

Bài toán này sẽ cần hai mô đun con (hàm):

– Hàm prime(n) kiểm ra xem số tự nhiên n có là nguyên tố hay không.

– Hàm print_prim(n) sẽ in ra màn hình n số nguyên số đầu tiên.

Toàn bộ chương trình có thể như sau:

def prime(n):
    if n < 2:
        return False
    for k in range(2, int(n**0.5) + 1):  
        if n % k == 0:
            return False
    return True

def print_prime(n):
    P = 2
    k = 0
    while True:
        if prime(P):  
            k = k + 1
            print(P, end=" ")
            if k == n:
                break
        P = P + 1  
    print()

# Chương trình chính
n = 5
print_prime(n)

Câu 2. Trong một kì thi Tin học trẻ, mỗi học sinh sẽ phải làm 3 bài thi. Với mỗi bài, nêu học sinh làm sẽ được ban giám khảo chấm và cho điểm, nếu không làm thì sẽ không tính điểm. Sau khi thi, dữ liệu điểm thi của học sinh sẽ được lưu trong một tệp văn bản và gửi về ban tổ chức. Mẫu một tệp điểm thi có dạng sau:

Quy định ghi trong tệp trên như sau:

– Mỗi dòng sẽ bắt đầu bằng số báo danh của thí sinh, tiếp theo là ba giá trị điểm tương ứng với ba bài thì.

– Điểm thi sẽ là một số tự nhiên từ 0 đến 20.

– Nếu học sinh không làm thì bài đó ghi -1.

Em có nhiệm vụ tính toán tổng só điểm thi của các bạn học sinh và đưa dữ liệu ra tệp ketqua.out là danh sách ba bạn có tổng điểm cao nhất được sắp xếp giảm dần từ trên xuống đưới. Khuôn dạng dữ liệu đưa ra bao gồm: số báo danh, các điểm thi từng bài và cuối cùng là tổng điểm cả ba bài.

Ví dụ với dữ liệu trên thì kết quả như sau:

Lời giải:

Bài này được thiết kế và chia thành 4 mô đun chính:

– Hàm NhapDL() sẽ đọc dữ liệu từ tệp dữ liệu đầu vào “Diemthi.inp” và trả lại hai dãy: Dãy A là số báo danh các HS, dãy B là điểm thi của các HS tương ứng trong dãy A.

– Hàm Tinh_tong(B) trả lại đây là các tổng điểm các bài thi của các HS tương ứng. Để tính tổng điểm, ta sẽ cần thêm hàm tính tổng đặc biệt_sum().

– Hàm sapxep(A,B,C) sẽ sắp xếp đồng thời ba dãy nhưng theo tiêu chí giảm dần của dãy số C.

– Hàm GhiDL() sẽ đưa kết quả ra tệp “ketqua.out” theo đúng yêu cầu của bài toán.

Toàn bộ chương trình có thể như sau:

fi = "Diemthi.inp"
fo = "ketqua.out"

def NhapDL(fi):
    f = open(fi)  
    A = []
    B = []
    for s in f:
        line = s.split()
        A.append(line[0])
        B.append([int(x) for x in line[1:]])
    f.close()
    return A, B

def _sum(A):
    S = 0
    for x in A:
        if x > 0:
            S = S + x  
    return S

def Tinh_tong(B):
    C = []
    for p in B:
        C.append(_sum(p))
    return C

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

def GhiDL(fo, A, B, C):  
    f = open(fo, "w")
    for i in range(3):
        print(A[i], *B[i], C[i], file=f)
    f.close()

# Chương trình chính
A, B = NhapDL(fi)
C = Tinh_tong(B)
sapxep(A, B, C)
GhiDL(fo, A, B, C)  

Xem các bài giải khác: Giải bài tập SGK lớp 11 định hướng Khoa học máy tính – NXB Kết nối tri thức với cuộc sống

Thông tin liên hệ & mạng xã hội:
Website: https://bumbii.com/
Facebook: https://www.facebook.com/bumbiiapp
Pinterest: https://www.pinterest.com/bumbiitech

0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest

0 Bình luận
Phản hồi nội tuyến
Xem tất cả bình luận
0
Cùng chia sẻ bình luận của bạn nào!x