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 bài tập trang 82 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

Câu 29.1

Viết chương trình nhập từ bàn phím một dãy số nguyên, sau đó sắp xếp dãy này theo thứ tự tăng dần và in dãy đã sắp xếp ra màn hình, trên một hàng ngang.

Trả lời:

Chương trình sẽ có ba mô đun hàm sau:

1) NhapDL(). Hàm nhập dữ liệu dãy số từ bàn phím và trả lại dãy vừa nhập.

2) sapxep(A). Hàm sắp xếp dãy A theo thứ tự tăng dần.

3) Show(A). Hàm hiển thị dãy A trên màn hình.

Chương trình như sau:

def NhapDL():
    s = input("Nhập dãy số nguyên cách nhau bởi dấu cách: ")
    return [int(x) for x in s.split()]
    
def sapxep(A):
    for i in range(1,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 Show(A):
    for x in A:
        print(x, end = " ")
    print()
    
# chương trình chính
A = NhapDL()
sapxep(A)
Show(A)

Câu 29.2

Viết chương trình giải bài toán. Cho trước ma trận số A vuông bậc n. Tính giá trị trung bình của tất cả các phần tử của A.

Ma trận số A được cho trong tệp văn bản Matran.inp có cấu trúc như sau:

– Hàng đầu tiên là số tự nhiên n

− n hàng tiếp theo, mỗi hàng là một dãy n số (nguyên hoặc thực), cách nhau bởi dấu cách.

Chương trình sẽ đưa kết quả ra màn hình.

Trả lời:

def NhapDL(fi):
    f = open(fi)
    A = []
    n = int(f.readline())
    for i in range(n):
        s = f.readline()
        h = [float(x) for x in s.split()]
        A.append(h)
    f.close()
    return A
    
def mean(A):
    n = len(A[0])
    S = 0
    for i in range(n):
        S = S + sum(A[i]/n)
    return S/n
    
# chương trình chính
fi ="Matran.inp"
A = NhapDL(fi)
print(mean(A))

Câu 29.3

Cho trước n điểm trên mặt phẳng. Cần tìm ra hai điểm có khoảng cách ngắn nhất. Các điểm được đánh số từ 0 đến n – 1 và được cho trong tệp văn bản Points.inp có dạng như sau: Mỗi điểm được cho bởi một cặp toạ độ trên một dòng, các toạ độ này là số nguyên. Kết quả đưa ra màn hình ghi 2 chỉ số của 2 điểm có khoảng cách ngắn nhất.

Trả lời:

Chương trình sẽ có ba mô đun/hàm sau:

1) NhapDL(). Nhập dữ liệu từ tập đầu vào, trả về dãy các điểm.

2) kc(p,q). Hàm tính khoảng cách giữa hai điểm p, q.

3) mindistance(). Hàm tính và tìm hai điểm của P có khoảng cách bé nhất.

Chương trình như sau:

def NhapDL(fi):
    f = open(fi)
    P = []
    for line in f:
        A = tuple(int(x) for x in line.split())
        P.append(A)
    f.close()
    return P
    
def kc(p, q):
    return ((p[0] - q[0])**2 + (p[1] - q[1])**2)**0.5
    
def mindistance(P):
    n = len(P)
    if n <= 1:
        return 0, 0, 0
    else:
        dmin = kc(P[0], P[1])
        im, jm = 0, 1
        for i in range(n-1):
            for j in range(i+1, n):
                if kc(P[i], P[j]) < dmin:
                    dmin = kc(P[i], P[j])
                    im, jm = i, j
        return dmin, im, jm
        
# Chương trình chính
fi = "Points.inp"
P = NhapDL(fi)
dmin, im, jm = mindistance(P)
print("Khoảng cách giữa 2 điểm", im, "và", jm, "là:", dmin)

Câu 29.4

Chúng ta đã biết phương thức count() sẽ tính số lần lặp không chồng lẫn của một xâu con trong xâu mẹ (nếu không có thì trả về 0). Ví dụ: xấu con “aba” sẽ lặp không chồng lấn trong xâu “abababacdaba” 3 lần.

>> Str = "abababacdaba"

>> sub = "aba"

>> Str.count(sub)

3

Nhưng nếu tính theo cách cỏ chồng lần thi xâu con sub sẽ lặp 4 lần trong xâu me Str.

Bài toán: Dữ liệu đầu vào được cho trong tệp văn bản String.inp có dạng sau:

– Dòng đầu tiên ghi xâu con sub.

− n dòng tiếp theo, mỗi dòng là một xâu kí tự bất kì.

Kết quả được lưu trong tệp String.out bao gồm n dòng, mỗi dòng tương ứng là kết quả số lần lặp không chồng lấn của xâu con sub trong xâu tại dòng tương ứng.

Trả lời:

Hàm quan trọng nhất của chương trình là hàm scount(sub,Str) đếm số lần lặp không chồng lấn của xâu con sub trong xâu mẹ Str. Có rất nhiều cách viết hàm này, sau đây là một cách.

Chương trình như sau:

def scount(sub,Str):
    k = len(sub)
    count = 0
    for i in range(len(Str)-k+1):
        if Str[i : i+k] == sub:
            count = count + 1
    return count

Toàn bộ chương trình như sau:

def NhapDL(fi):
    f = open(fi, encoding="UTF-8")
    S = []
    sub = f.readline().strip()
    for line in f:
        S.append(line.strip())
    f.close()
    return sub, S

def scount(sub, Str):
    k = len(sub)
    count = 0
    for i in range(len(Str) - k + 1):
        if Str[i:i + k] == sub:
            count = count + 1
    return count

def GhiDL(fo, sub, S):
    f = open(fo, "w", encoding="UTF-8")
    for Str in S:
        print(scount(sub, Str), file=f)
    f.close()

# Chương trình chính
fi = "String.inp"
fo = "String.out"
sub, S = NhapDL(fi)
print(sub)
print(S)
GhiDL(fo, sub, S)

Câu 29.5

Viết chương trình bầu lớp trưởng với cách bầu như sau: Mỗi bạn sẽ đưa ra lựa chọn của mình, được phép đề cử từ 1 đến 3 ứng viên. Sau đó, ban kiểm phiếu sẽ tổng hợp kết quả, ứng viên nào được đề cử nhiều nhất sẽ được chọn làm lớp trưởng. Dữ liệu đầu vào là tệp văn bản Phieu.inp bao gồm nhiều dòng, mỗi dòng ứng với đề cử của một học sinh. Vậy, mỗi dòng sẽ ghi từ 1 đến 3 tên, cách nhau bởi dấu cách. Chương trình sẽ đưa ra kết quả là tên bạn được bầu làm lớp trưởng.

Trả lời:

Chương trình sẽ có hai mô đun/hàm sau:

1) NhapDL(). Hàm nhập dữ liệu đầu vào. Hàm trả lại dãy tên các bạn được bình chọn.

2) mode(A). Hàm tính giá trị mode của dãy A. Giá trị mode là giá trị được lặp lại nhiều nhất trong dãy A. Ở đây mode chính là tên của bạn HS được bầu chọn nhiều nhất.

Chương trình hoàn chỉnh như sau:

def NhapDL(fi):
    f = open(fi, encoding = "UTF-8")
    A = []
    for s in f:
        temp = s.split()
        A.extend(temp)
    f.close()
    return A

def mode(A):
    mode = A[0]
    lap = 1
    for i in range(len(A)):
        m = A.count(A[i])
        if lap < m:
            lap = m
            mode = A[i]
    return mode

#chương trình chính
fi = "Phieu.inp"
A = NhapDL(fi)
mode = mode(A)
print("Lớp trưởngg được bầu là bạn ", mode)

Câu 29.6

Một nhóm các bạn tình nguyện tham gia làm đồ chơi cho các bạn nhỏ vùng cao bằng cách ghép các thanh gỗ nhỏ để tạo thành một tam giác. Nhóm tình nguyện kêu gọi các bạn đóng góp các thanh gỗ nhỏ, tổng số thu được h thanh gỗ, đánh số từ 0 đến n – 1 và có độ dài tương ứng là A[0], A[1],… A[n-1]. Em hãy viết chương trình cho biết từ các thanh gỗ đó có thể tạo được bao nhiêu tam giác, chú ý các tam giác tạo thành từ một bộ 3 thanh được tính là một tam giác.

Dữ liệu được cho trong tệp văn bản Thanhgo.inp chứa n số tự nhiên lớn hơn 0. Kết quả đưa ra tệp Tamgiac.out chỉ chứa một số tự nhiên là số tam giác có thể tạo được từ dữ liệu ban đầu.

Trả lời:

Chương trình sẽ có bốn mô đun/hàm sau:

1) NhapDL(). Hàm nhập dữ liệu đầu vào, hàm sẽ trả lại dãy độ dài của các thanh gỗ.

2) istamgiac(a,b,c). Hàm kiểm tra xem bộ ba số a, b, c có tạo thành một tam giác hay không.

3) tamgiac(). Hàm tính và đếm số các tam giác có thể tạo được từ dãy độ dài các thanh gỗ.

4) GhiDL(). Hàm ghi kết quả ra tệp.

Chương trình hoàn chỉnh như sau:

def NhapDL(fi):
    f = open(fi)
    s = f.readline()
    return [int(x) for x in s.split()]

def istamgiac(a, b, c):
    return a > 0 and b > 0 and c > 0 and a + b > c and b + c > a and a + c > b

def tamgiac(A):
    n = len(A)
    count = 0
    for i in range(n - 2):
        for j in range(i + 1, n - 1):
            for k in range(j + 1, n):
                if istamgiac(A[i], A[j], A[k]):
                    count = count + 1
    return count

def GhiDL(fo, count):
    f = open(fo, "w")
    print(count, file=f)
    f.close()

# Chương trình chính
fi = "Thanhgo.inp"
fo = "Tamgiac.out"
A = NhapDL(fi)
count = tamgiac(A)
GhiDL(fo, count)

Câu 29.7*

Một công trình xây dựng đến giai đoạn lát sàn nhà cho các căn hộ theo yêu cầu của khách hàng. Do yêu cầu của người dùng đa dạng nên chủ đầu tư phải thu thập yêu cầu của khách hàng và tập hợp, đưa vào các tệp dữ liệu để chuyển cho bộ phận tính chi phí. Dữ liệu đầu vào được cho trong tệp có tên Data.inp bao gồm nhiều dòng, mỗi dòng là một yêu cầu của một khách hàng, dữ liệu trên một dòng có dạng như sau:

– Hai thông số đầu tiên là chiều ngang và chiều dài của căn phòng cần hoàn – thiện. Dữ liệu là số thập phân theo đơn vị đo là mét.

– Giá trị tiếp theo là đơn giá lát mỗi mét vuông, giá trị là số thập phân. Dữ liệu tính toán được đưa ra tệp văn bản có tên Data.out với định dạng mỗi dòng như sau:

− Phần đầu của dữ liệu được đưa ra giống với dữ liệu đầu vào, đó là thông tin của từng căn hộ với chiều ngang, chiều dài, đơn giả và bên cạnh là chi phí lát sàn cho căn hộ này.

– Dòng cuối của tệp dữ liệu ra có ghi tổng toàn bộ chi phí lát sàn nhà của cả công trình.

Em hãy thiết lập chương trình giải bài toán trên theo phương pháp thiết kế theo mô đun.

Trả lời:

Bước 1. Phân tích tổng quát.

Chương trình sẽ bao gồm ba mô đun chức năng chính:

– Chức năng nhập dữ liệu từ tập đầu vào.

– Chức năng xử lí dữ liệu chính đã được nhập từ bước trên.

– Chức năng đưa dữ liệu ra.

Bước 2. Thiết lập chi tiết chức năng đọc dữ liệu.

Kết quả của mô đun này là trả về mảng dữ liệu A, mỗi phần tử của A là bộ ba dữ liệu chiều ngang, chiều dài và đơn giá (kí hiệu bộ ba này là (n, d, g)). Hàm đọc dữ liệu có tên là nhapDL(finp) với tham số finp là tên của tệp dữ liệu.

Bước 3. Bước tiếp theo là xử lí dữ liệu.

Chức năng này sẽ nhận dữ liệu đầu vào là mảng A và thực hiện tính chi phí cho từng bộ dữ liệu của mảng A, kết quả tính toán sẽ đưa ra mảng C. Chú ý hàm tinh_cp(n, d, g) sẽ tính theo biểu thức n*d*g.

def xuly_tinh_cp(A):
    C = []
    for n, d, g in A:
        C.append(tinh_cp(n, d, g))
    return C

Bước 4. Thiết kế chức năng đưa dữ liệu kết quả ra.

Dựa trên các mảng đã thu được là A – danh sách các bộ ba dữ liệu (n, d, g) và C là danh sách các chi phí sẽ thiết lập hàm ghiDL(fout,A,C) để đưa dữ liệu ra tệp.

def ghiDL(fout, A, C):
    f = open(fout, "w", encoding="UTF-8")
    for i in range(len(A)):
        d = A[i]
        print(d[0], d[1], d[2], file=f, end=" ")
        print(C[i], file=f)
    print("Tổng chi phí:", sum(C), file=f)
    f.close()

Bước 5. Tổng hợp thu được chương trình hoàn chỉnh như sau:

finp = "Data.inp"
fout = "Date.out"

def tinh_cp(n, d, g):
    return n * d * g

def nhapDL(finp):
    A = []
    f = open(finp)
    for line in f:
        line = [float(x) for x in line.split()]
        A.append(line)
    f.close()
    return A
    
def xuly_tinh_cp(A):
    C = []
    for n, d, g in A:
        C.append(tinh_cp(n, d, g))
    return C

def ghiDL(fout, A, C):
    f = open(fout, "w", encoding="UTF-8")
    for i in range(len(A)):
        d = A[i]
        print(d[0], d[1], d[2], file=f, end=" ")
        print(C[i], file=f)
    print("Tổng chi phí:", sum(C), file=f)
    f.close()
    
# Chương trình chính
A = nhapDL(finp)
C = xuly_tinh_cp(A)
ghiDL(fout, A, C)

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