Bài 28: Thiết kế chương trình theo mô đun

Chủ đề 6. Kĩ thuật lập trình – Bài 28: Thiết kế chương trình theo mô đun – sách bài tập trang 81 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 28: Thiết kế chương trình theo mô đun

Câu 28.1

Phương pháp thiết kế chương trình theo mô đun là phương pháp làm mịn dần. Đúng hay sai?

Trả lời:

Đúng. Phương pháp thiết kế chương trình theo mô đun là phương pháp làm mịn dần.

Câu 28.2

Việc thiết kế chương trình theo mô đun có là duy nhất hay không? Có thể hay không có nhiều cách thiết lập các mô đun khác nhau cho một chương trình?

Trả lời:

Việc thiết kế chương trình theo mô đun không là duy nhất. Có thể có nhiều cách thiết lập mô đun khác nhau cho một chương trình.

Câu 28.3

Bài toán: Cho trước danh sách tên các bạn lớp em cùng với điểm trung bình cả năm học, được cho trong một tệp văn bản, mỗi dòng là thông tin của một học sinh. Cô giáo yêu cầu làm lại tệp dữ liệu này nhưng sắp xếp lại theo thứ tự giảm dần của điểm trung bình. Giả sử tập đầu vào có dạng Lop11A.inp, kết quả cần đưa ra tệp Lop11A.out. Nếu cần thiết kế bài toán trên theo phương pháp thiết kế theo mô đun thì sẽ tạo ra các mô đun, hàm hay thủ tục như thế nào? Không cần giải chi tiết bài toán, chỉ cần mô tả các hàm và ý nghĩa.

Trả lời:

Có thể thiết kế bài toán trên theo ba mô đun, hay ba hàm sau:

1) NhapDL().

2) sapxep().

3) GhiDL().

Sau đây là mô tả ý nghĩa của các hàm trên.

– Hàm NhapDL(fi) có tính năng đọc dữ liệu đầu vào từ tệp văn bản và trả về hai mảng dữ liệu quan trọng: Mảng DS chứa danh sách họ tên học sinh trong lớp và Diem lưu điểm trung bình của học sinh trong lớp. Hàm này sẽ được thực hiện đầu tiên của chương trình.

– Hàm sapxep(A,B) có chức năng sắp xếp đồng thời hai dãy A, B theo tiêu chí tăng dần của A.

– Hàm GhiDL(fo,DS,Diem) sẽ ghi dữ liệu các mảng DS, Diem ra tệp đầu ra, sau khi sắp xếp danh sách học sinh trong lớp theo thứ tự giảm dần của điểm trung bình.

Câu 28.4

Tiếp tục bài toánCâu 28.3, nhưng thêm các yêu cầu sau:

1) Tiện ích tra cứu: Nhập từ bàn phím một tên, thông báo tìm thấy số bạn có tên đó.

2) In thông tin ba bạn có điểm trung bình cao nhất lớp. Kết quả sẽ đưa ra tệp văn bản ketqua.out tên ba học sinh và điểm trung bình tương ứng.

Với các yêu cầu bổ sung trên em cần chỉnh sửa hay bổ sung thêm các mô đung hàm nào? Hãy mô tả các mô đun/hàm đó, không cần lập trình đầy đủ.

Trả lời:

Với yêu cầu bài toán, tất cả các hàm đã được xây dựng trong Câu 28.3 đều được giữ nguyên. Cần bổ sung thêm ba hàm sau:

1) BC1().

2) YC1().

3) tachten().

Sau đây là mô tả ý nghĩa của các hàm trên.

– Hàm BC1() sẽ thực hiện yêu cầu 2: In ra tên và điểm số của ba bạn trong lớp có điểm trung bình cao nhất.

– Hàm YC1() sẽ thực hiện yêu cầu 1: Hàm này phải sử dụng hàm tách tên tachten(hoten).

– Hàm tachten(hoten) sẽ thực hiện việc tách tên và trả lại tên của hoten là họ và tên đầy đủ.

Câu 28.5

Tiếp tục Câu 28.4, bổ sung các yêu cầu sau:

a) Thay đổi nội dung của tệp dữ liệu đầu vào Lop11A.inp, đổi tên tập thành DSHS.inp, bổ sung thêm dữ liệu ngày sinh của mỗi học sinh. Như vậy, mỗi dòng của tệp dữ liệu là thông tin của một học sinh có dạng như sau:

<Họ tên HS> <ngày sinh> <điểm trung bình

Ví dụ: Trần Thu Hà 12-1-2006 8.6

b) In ra danh sách học sinh được xếp theo thứ tự ngày sinh tăng dần, tức là tuổi giảm dần. Kết quả đồng thời đưa ra màn hình và ra tệp văn bản DSHS.out.

Với các yêu cầu trên, em cần chỉnh sửa hay bổ sung các mô đun/hàm nào? Mô tả chức năng của các mô đun/hàm này.

Trả lời:

Câu 28.5 là một mở rộng khá phức tạp của Câu 28.3, Câu 28.4. Sau đây là mô tả các hàm cần nâng cấp và bổ sung mới.

1) Tệp dữ liệu đầu vào được đổi tên thành DSHS.inp và dữ liệu bổ sung thêm thông tin ngày sinh của học sinh dạng ngay-thang-nam, ví dụ như sau:

DSHS.inp.

Bùi Quang Hà 8-9-2004 9.5

Trần Quanh Vinh 1-12-2005 9.7

Nguyễn Thị Oanh 12-3-2004 8.5

Đỗ Thu An 6-3-2006 9

Lê Việt Khoa 2-07-2995 7.6

Nguyễn Thị An 1-1-2004 9.0

Phạm Thị Hà 30-4-2006 9.8

2) Nâng cấp NhapDL().

3) Nâng cấp sapxep().

4) GhiDL2().

5) YC2().

6) dayVN().

Sau đây là mô tả ý nghĩa của các hàm trên:

– Hàm NhapDL() được nâng cấp để đọc tệp dữ liệu mới và trả về ba mảng dữ liệu: DS, NSDiem. Trong đó các mảng DS, Diem có ý nghĩa giống trong Câu 28.3, riêng NS là dãy các thông tin ngày sinh của các bạn trong lớp. Mỗi bộ dữ liệu ngày sinh được biến đổi thành bộ ba số nguyên dạng (<năm, <tháng>, <ngày>). Ví dụ: Nếu dữ liệu gốc là “13-4-2005” sẽ được chuyển đổi sang dạng (2005,4, 13) và lưu trong NS.

– Hàm sapxep() được nâng cấp và có cú pháp như sau:

sapxep(A, B, C, reverse = False)

Ý nghĩa hàm này như sau: Sắp xếp đồng thời ba mảng A, B, C và theo tiêu chí so sánh của A. Nếu reverse = False (mặc định) thì sắp xếp theo tăng dần của A, ngược lại sắp xếp theo thứ tự giảm dần của A.

– Hàm GhiDL2() sẽ thực hiện yêu cầu thứ hai của bài toán, ghi dữ liệu ra tệp DSHS.out.

– Hàm YC2() thực hiện yêu cầu thứ hai, đưa thông tin DS học sinh ra màn hình.

– Hàm dayVN(ns) có tính năng biến đổi một bộ ba số (<năm>, <tháng <ngày>) sang xâu <ngày>-<tháng>-<năm> . Hàm này được dùng trong cả hai mô đun YC2()GhiDL2().

Câu 28.6

Tiếp tục Câu 28.5. Bổ sung yêu cầu in danh sách học sinh của lớp, họ và tên xếp theo thứ tự từ điển, tên trước, họ đệm sau. Kết quả sẽ đưa ra tệp HS.out. Em hãy mô tả các mô đun hàm cần bổ sung để giải quyết yêu cầu này.

Trả lời:

Câu này là một mở rộng của Câu 28.5, sẽ bổ sung thêm hai hàm sau:

1) sapxepTD().

2) YC3().

Sau đây là mô tả ý nghĩa của các hàm trên.

– Hàm sapxep() sắp xếp dãy các xấu theo thứ tự từ điển nhưng theo nguyên tắc tên trước, họ đệm sau. Cú pháp của hàm như sau:

sapxepTD (A,B,C)

Ý nghĩa của hàm là sắp xếp đồng thời cả ba mảng A, B, C nhưng theo tiêu chí sắp xếp của A. Riêng mảng A được sắp xếp theo thứ tự từ điển (tạm thời theo từ điển Unicode), ưu tiên xếp thứ tự theo tên trước, họ đệm sau.

– Hàm YC3() thực hiện yêu cầu chính của bài toán.

Câu 28.7

Viết và hoàn thiện chương trình cho Câu 28.3.

Trả lời:

Lời giải đầy đủ của Câu 28.3 như sau:

fi = "Lop11A.inp"
fo = "Lop11A.out"

def NhapDL(fi):
    f = open(fi,"r", encoding = "UTF-8")
    DS = []
    Diem = []
    for s in f:
        line = s.split()
        d = float(line[len(line)-1])
        ten = " ".join(line[ : len(line)-1])
        DS.append(ten)
        Diem.append(d)
    f.close()
    return DS,Diem
    
def sapxep(A,B):
    n = len(A)
    for i in range(1, n):
        j = i
        while j > 0 and A[j] > A[j-1]:
            A[j], A[j-1] = A[j-1], A[j]
            B[j], B[j-1] = B[j-1], B[j]
            j = j - 1
        
def GhiDL(fo,A,B):
    f = open(fo,"w", encoding = "UTF-8")
    for i in range(len(A)):
        print(A[i], B[i], file = f)
    f.close()

#chương trình chính
DS, Diem = NhapDL(fi)
sapxep(Diem,DS)
GhiDL(fo,DS,Diem)

Câu 28.8

Viết và hoàn thiện chương trình cho Câu 28.4.

Trả lời:

fi = "Lop11A.inp"
fo = "Lop11A.out"
fbc = "ketqua.out"

def NhapDL(fi):
    f = open(fi,"r",encoding = "UTF-8")
    DS = []
    Diem = []
    for s in f:
        line = s.split()
        d = float(line[len(line)-1])
        ten = " ".jon(line[ : len(line)-1])
        DS.append(ten)
        Diem.append(d)
    f.close()
    return DS,Diem

def sapxep(A,B):
    n = len(A)
    for i in range(1,n):
        j = i
        while j > 0 and A[j] > A[j-1]:
            A[j], A[j-1] = A[j-1], A[j]
            B[j], B[j-1] = B[j-1], B[j]
            j = j - 1
            
def GhiDL(fo,A,B):
    f = open(fp,"w", encoding = "UTF-8")
    for i in range(len(A)):
        print(A[i], B[i],fine = f)
    f.close()
    
def BC1():
    n = len(DS)
    print("Danh sách 3 bạn có dtb cao nhất: ")
    for i in range(3):
        print(DS[i], Diem[i])
        
def tachten(hoten):
    A = hoten.split()
    return A[len(A)-1]

def YC1():
    ten = input("Nhập tên bạn HS cần tim: ")
    count = 0
    for i in range(len(DS)):
        if ten == tachten(DS[i]):
            count = count + 1
    print("Lop có", count, " bạn tên ", ten)
    
#chương trình chính
DS, Diem = NhapDL(fi)
sapxep(Diem,DS)
GhiDL(fo,Ds,Diem)
BC1()
YC1()

Câu 28.9

Viết và hoàn thiện chương trình cho Câu 28.5.

Trả lời:

fi = "DSHS.inp"
fo = "Lop11A.out"
fbc = "ketqua.out"
fout = "DSHS.out"

def NhapDL(fi):
    f = open(fi,"r",encoding = "UTF-8")
    DS = []
    NS = []
    Diem = []
    for s in f:
        line = s.split()
        d = float(line[len(line)-1])
        s = line[len(line)-2]
        ns = [int(x) for x in s.split("-")]
        ten = " ".join(line[ : len(line)-2])
        DS.append(ten)
        ns.reverse()
        NS.append(ns)
        Diem.append(d)
        f.close()
        return DS,NS,Diem
        
def sapxep(A,B,reverse = Flase):
    n = len(A)
    for i in range(1,n):
        j = i
        while j > 0 and(reverse or A[j] < A[j-1]):
            A[j], A[j-1] = A[j-1], A[j]
            B[j], B[j-1] = B[j-1], B[j]
            C[j], C[j-1] = C[j-1], C[j]
            j = j -1
            
def GhiDL(fo,A,B):
    f = open(fo,"w",encoding="UTF-8")
    for i in range(len(A)):
        print(A[i], B[i], file = f)
    f.close()
    
def BC1():
    n = len(DS)
    print("Danh sách 3 bạn có DTB cao nhất: ")
    for i in range(3):
        print(DS[i],Diem[i])
        
def tachten(hoten):
    A = hoten.split()
    return A[len(A)-1]

def YC1():
    ten = input("Nhập tên bạn HS cần tim: ")
    count = 0
    for i in range(len(DS)):
        if ten == tachten(DS[i]):
            count = count + 1
    print("Lớp có", count, " bạn tên", ten)
    
def dayVN(ns):
    ns = ns.copy()
    ns.reverse()
    ns = [str(x) for x in ns]
    return "-".join(ns)
    
def GhiDL2(fout,DS, NS):
    f = open(fout,"w", encoding = "UTF-8")
    for i in range(len(DS)):
        print(DS[i], dayVN(NS[i], file = f))
    f.close()
    
def YC2(): # Yêu cầu bổ sung của câu 28.5
    sapxep(NS,DS,Diem)
    GhiDL2(fout,DS,NS)
    print("Danh sách lớp: ")
    for i in range(len(DS)):
        print(DS[i], dayVN(NS[i]))
        
# Chương trình chính
DS,NS,Diem = NhapDL(fi)
sapxep(Diem,DS,NS,reverse = True)
GhiDL(fo,DS,Diem)
BC1()
YC1()
YC2()

Câu 28.10

Viết và hoàn thiện chương trình cho Câu 28.6.

Trả lời:

fi = "DSHS.inp"
fo = "Lop11A.out"
fbc = "ketqua.out"
fout = "DSHS.out"
fo_ = "HS.out"

def NhapDL(fi):
    f = open(fi,"r",encoding = "UTF-8")
    DS = []
    NS = []
    Diem = []
    for s in f:
        line = s.split()
        d = float(line[len(line)-1])
        s = line[len(line)-2]
        ns = [int(x) for x in s.split("-")]
        ten = " ".join(line[ : len(line)-2])
        DS.append(ten)
        ns.reverse()
        NS.append(ns)
        Diem.append(d)
        f.close()
        return DS,NS,Diem
        
def sapxep(A,B,reverse = Flase):
    n = len(A)
    for i in range(1,n):
        j = i
        while j > 0 and (A[j] < A[j-1] if vervese else A[j] > A[j-1]):
            A[j], A[j-1] = A[j-1], A[j]
            B[j], B[j-1] = B[j-1], B[j]
            C[j], C[j-1] = C[j-1], C[j]
            j = j -1
            
def GhiDL(fo,A,B):
    f = open(fo,"w",encoding="UTF-8")
    for i in range(len(A)):
        print(A[i], B[i], file = f)
    f.close()
    
def BC1():
    n = len(DS)
    print("Danh sách 3 bạn có DTB cao nhất: ")
    for i in range(3):
        print(DS[i],Diem[i])
        
def tachten(hoten):
    A = hoten.split()
    return A[len(A)-1]
    
def sapxepTD(A,B,C):
    T = [(tachten(x),x) for x in A]
    for i in range(len(A)):
        for i in range(len(A)):
            j = i
            while j > 0 and T[j] < T[j-1]:
                T[j], T[j-1] = T[j-1], T[j]
                A[j], A[j-1] = A[j-1], A[j]
                B[j], B[j-1] = B[j-1], B[j]
                C[j], C[j-1] = C[j-1], C[j]
                j = j - 1
                
def YC1():
    ten = input("Nhập tên bạn HS cần tim: ")
    count = 0
    for i in range(len(DS)):
        if ten == tachten(DS[i]):
            count = count + 1
    print("Lớp có", count, " bạn tên", ten)
    
def dayVN(ns):
    ns = ns.copy()
    ns.reverse()
    ns = [str(x) for x in ns]
    return "-".join(ns)
    
def GhiDL2(fout,DS, NS):
    f = open(fout,"w", encoding = "UTF-8")
    for i in range(len(DS)):
        print(DS[i], dayVN(NS[i], filr = f))
    f.close()
    
def YC2(): # Yêu cầu bổ sung của câu 28.5
    sapxep(NS,DS,Diem)
    GhiDL2(fout,DS,NS)
    print("Danh sách lớp: ")
    for i in range(len(DS)):
        print(DS[i], dayVN(NS[i]))
        
def YC3(): # Bổ sung yêu cầu của câu 28.6
    sapxepTB(DS,NS,Diem)
    f = open(fo_,"w",encoding = "UTF-8")
    for i in range(len(DS)):
        print(DS[i], dayVN(NS[i]), Diem[i], file = f)
    f.close()
    
# chương trình chính
DS,NS,Diem = NhapDL(fi)
sapxep(Diem,DS,NS,reverse = True)
GhiDL(fo,DS,Diem)
BC1()
YC1()
YC2()
YC3()

Xem các bài giải khác: Giải Sách Bài Tập Lớp 11 Khoa Học Máy Tính 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