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 giáo khoa trang 127 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

Khởi động

Em được giao việc quản lí cho cửa hàng bán thực phẩm của gia đình. Hằng ngày, em phải nhập danh sách các mặt hàng và doanh số bán hàng. Cuối ngày, em cần báo cáo ba mặt hàng có doanh số cao nhất và ba mặt hàng có doanh số thấp nhất trong ngày.

Các mặt hàng mới nhập sẽ được lưu trong tệp văn bản bao gồm nhiều dòng, mỗi dòng là tên mặt hàng và doanh số được ngăn cách bằng dấu phẩy. Tên tệp đầu vào là Data.inp.

Báo cáo cuối ngày là tệp văn bản Data.out gồm 6 dòng, ba dòng đầu tiên là tên ba mặt hàng có doanh số cao nhất, ba dòng cuối là tên ba mặt hàng có doanh số thấp nhất, cần có cả tên hàng và doanh số.

Em sẽ thiết kế chương trình như thế nào? Trao đổi với bạn về cách thiết kế chương trình sao cho hợp lí nhất.

Lời giải:

Em sẽ thiết kế chương trình theo mô đun:

  • Bước 1: Thiết kế chung.
  • Bước 2: Thiết kế công việc nhập dữ liệu.
  • Bước 3: Thiết kế công việc xử lí dữ liệu.
  • Bước 4: Thiết lập báo cáo, đưa ra dữ liệu.

1. Thiết kế chương trình theo mô đun

Hoạt động 1

Thực hiện các bước thiết kế giải bài toán trên theo phương pháp làm mịn dần, trao đổi và thảo luận để biết được cách thiết kế chương trình theo mô đun.

Lời giải:

Bước 1. Thiết kế chung

Từ yêu cầu của bài toán, ta thấy có thể chia bài toán đã cho thành ba công việc chính, các công việc này tương đối độc lập với nhau.

1) Công việc nhập dữ liệu: Dữ liệu được nhập vào tệp Data.inp và được đọc để

đưa vào chương trình.

2) Công việc xử lí dữ liệu. Các công việc chuẩn bị tính toán dữ liệu theo yêu cầu của bài toán.

3) Báo cáo, đưa dữ liệu ra theo yêu cầu.

Bước 2. Thiết lập công việc nhập dữ liệu

Thiết lập hàm NhapDL(fin) có tính năng đọc dữ liệu từ tệp Data.inp và đưa vào haimảng P (mặt hàng) và S (doanh số). Hàm được mô tả tổng quát đọc dữ liệu từ tệp fin.

Bước 3. Thiết lập công việc xử lí dữ liệu

Yêu cầu chính của báo cáo là lấy được thông tin của các mặt hàng có doanh số cao nhất và thấp nhất. Do vậy công việc xử lí dữ liệu chính là cần sắp xếp lại các mảng P. S theo thứ tự tăng dần của S (doanh số). Hàm Sapxep(A,B) được thiết kế tổng quát sẽ sắp xếp lại hai mảng A, B nhưng theo thứ tự tăng dần của A.

Bước 4. Thiết lập báo cáo, đưa dữ liệu ra

Cuối cùng là chức năng đưa dữ liệu ra tệp Data out sẽ được mô tả trong hàm GhiDL(P,S,fout). Hàm này lấy dữ liệu từ các mảng P. S và đưa dữ liệu ra tập fout.

Sau các bước trên, chúng ta đã thực hiện xong việc thiết kế các công việc chính được đặt ra ban đầu. Mỗi công việc đó được viết thành một hàm riêng biệt, độc lập với nhau. Các hàm này được gọi là các mô đun con của chương trình.

Chương trình chính sử dụng các chương trình con trên được mô tả đơn giản như sau:

Phương pháp thiết kế chương trình theo mô đun sẽ tách bài toán lớn thành các bài toán nhỏ hơn, hay thành các mô đun, tương đối độc lập với nhau, sau đó tiến hành thiết kế thuật toán và chương trình cho từng mô đun con. Mỗi mô đun có thể là một số hàm hoặc thủ tục độc lập. Chương trình chính là một bản ghép nối các hàm và thủ tục con.

Câu hỏi

Câu 1. Chương trình trên được thiết kế có bao nhiêu mô đun?

Lời giải:

Chương trình trên được thiết kế có 4 mô đun.

Câu 2. Các mô đun của chương trình trên có quan hệ với nhau như thế nào?

Lời giải:

Phương pháp thiết kế chương trình như trên được gọi là thiết kế theo mô đun. Mỗi mô đun thường là các chức năng độc lập, riêng biết theo yêu cầu của chương trình. Tuỳ thuộc vào từng bài toán và quan điểm thiết kế có thể tạo các mô đun này theo nhiều cách khác nhau. Chương trình chính là một bản ghép nối các hàm và thủ tục con.

2. Lợi ích của phương pháp thiết kế theo mô đun

Hoạt động 2

Với chương trình đã có trong Hoạt động 1, em sẽ làm gì nếu có các yêu cầu bổ sung như sau:

1. Yêu cầu thay đổi thông tin trong báo cáo: Ghi hai mặt hàng có doanh số cao nhất và bốn mặt hàng có doanh số thấp nhất.

2. Cập nhật, bổ sung các mặt hàng mới và doanh số trong ngày.

3. Yêu cầu làm thêm một báo cáo trong đó ghi doanh số bán trung bình trong ngày và danh sách các mặt hàng có doanh số lớn hơn doanh số trung bình này, kết quả đưa ra tệp Data2.out.

Em có nhận xét gì về công việc thực hiện các công việc bổ sung này?

Lời giải:

Công việc bổ sung 1

Đây là công việc cần nâng cấp hàm GhiDL() và độc lập với các mô đun khác. Việc nâng cấp này rất đơn giản và được mô tả trong chương trình sau. Thay đổi chỉ ở hai lệnh tại dòng 4 và 6.

Công việc bổ sung 2

Công việc này rất đơn giản là mở tệp Data.inp và bổ sung thêm thông tin các mặt hàng mới và doanh số, không cần phải sửa chương trình.

Công việc bổ sung 3

Công việc này mới và độc lập hoàn toàn với các công việc khác của bài toán, nên có thể tách thành một hàm (mô đun) độc lập, có thể giao cho một nhóm khác thực hiện. Hàm mới sẽ đặt tên là BC2() và có nội dung đơn giản như sau:

Nhận xét:

Vì chương trình được thiết kế theo mô đun nên:

– Các mô đun được thiết lập một lần và sử dụng nhiều lần.

– Dễ dàng nâng cấp, thay đổi, chỉnh sửa mà không mất công sửa lại toàn bộ chương trình.

– Dễ dàng bổ sung các mô đun mới.

Câu hỏi

Câu 1. Phân loại các công việc bổ sung trên vào ba loại sau:

– Công việc mới hoàn toàn.

– Công việc nâng cấp một mô đun cũ.

– Công việc không liên quan đến thuật toán và lập trình.

Lời giải:

Dưới đây là phân loại các công việc bổ sung vào ba loại:

1. Công việc mới hoàn toàn: Công việc bổ sung 3

– Xây dựng một tính năng hoàn toàn mới.

– Tạo một mô đun mới trong dự án.

– Thực hiện một dự án mới mà không liên quan đến bất kỳ mã nguồn nào đã có.

2. Công việc nâng cấp một mô đun cũ: Công việc bổ sung 1

– Cải tiến mã nguồn hiện tại của một mô đun.

– Tối ưu hóa mã nguồn hiện tại để cải thiện hiệu suất hoặc độ tin cậy.

– Cải thiện giao diện người dùng hoặc trải nghiệm người dùng của một tính năng hoặc mô đun đã tồn tại.

3. Công việc không liên quan đến thuật toán và lập trình: Công việc bổ sung 2

– Thiết kế giao diện người dùng hoặc trải nghiệm người dùng.

– Xây dựng tài liệu hướng dẫn hoặc tài liệu kỹ thuật cho dự án.

– Tương tác với khách hàng hoặc người dùng cuối để thu thập thông tin phản hồi hoặc yêu cầu thay đổi.

– Kiểm thử và đảm bảo chất lượng sản phẩm.

– Quản lý dự án, quản lý nhóm, hoặc các công việc quản lý dự án khác.

Câu 2. Công việc sau đây, nếu có sẽ thuộc nhóm công việc nào?

Nhập một giá trị số nào đó, ví dụ K, cần tìm trong danh sách các mặt hàng có doanh số xấp xỉ K (hơn kém nhau không quá hằng số C=1).

Lời giải:

Công việc này sẽ thuộc vào nhóm công việc mới hoàn toàn liên quan đến tìm kiếm và lọc dữ liệu.

Luyện tập

Câu 1. Nếu công việc bổ sung 3 có thêm yêu cầu in ra số lượng mặt hàng đã bán trong ngày thì cần thêm hay sửa lệnh nào của chương trình BC2().

Lời giải:

Thêm lệnh:

sold_items = sum(1 for sale in S if sale > average)

print("Số lượng mặt hàng đã bán trong ngày:", sold_items, file=f)

Bài BC2() hoàn chỉnh:

def BC2(P, S, fout):
    f = open(fout, "w", encoding="UTF-8")
    n = len(P)
    average = sum(S) / n
    print("Doanh số trung bình:", average, file=f)

    # Tính số lượng mặt hàng đã bán trong ngày
    sold_items = sum(1 for sale in S if sale > average)
    print("Số lượng mặt hàng đã bán trong ngày:", sold_items, file=f)

    for i in range(n):
        if S[i] > average:
            print(P[i], S[i], file=f)

    f.close()

Câu 2. Viết thêm một chương trình cho công việc bổ sung 4 như sau: Cần in ra danh sách 1⁄3 số mặt hàng có doanh số thấp nhất trong ngày.

Lời giải:

def in_danh_sach_1_3_so_mat_hang_thap_nhat(s, p):
    # Sắp xếp danh sách mặt hàng theo doanh số tăng dần
    p.sort(key=lambda x: x[s])

    # Tính số lượng mặt hàng cần in (1/3 tổng số mặt hàng)
    so_luong_can_in = len(p) // 3

    # In ra danh sách 1/3 số mặt hàng có doanh số thấp nhất
    print("Danh sách 1/3 số mặt hàng có doanh số thấp nhất:")
    
    for i in range(so_luong_can_in):
        print(f"{i + 1}. Mặt hàng {p[i][0]} - Doanh số: {p[i][s]}")

Vận dụng

Câu 1. Thiết lập chương trình cho công việc thường làm vào cuối giờ bán hàng: Cho trước số K (một doanh số giả định), cần tìm ra mặt hàng có doanh số nhỏ hơn K nhưng gần với K nhất. Bài toán này có thể sử dụng thuật toán tìm kiếm nào để giải?

Lời giải:

Chương trình sử dụng thuật toán tìm kiếm nhị phân để tìm mặt hàng có doanh số nhỏ hơn K nhưng gần với K nhất trong danh sách mặt hàng đã được sắp xếp theo thứ tự tăng dần của doanh số.

def find_nearest_item(arr, K):

    # Sắp xếp danh sách mặt hàng theo thứ tự tăng dần của doanh số
    arr.sort()

    low, high = 0, len(arr) - 1
    result = None

    while low <= high:
        mid = (low + high) // 2

        if arr[mid] < K:
            # Nếu giá trị doanh số của mặt hàng ở vị trí mid nhỏ hơn K
            # Đặt low = mid + 1 để tìm phần tử lớn hơn K
            low = mid + 1
        elif arr[mid] > K:
            # Nếu giá trị doanh số của mặt hàng ở vị trí mid lớn hơn K
            # Đặt high = mid - 1 để tìm phần tử nhỏ hơn K
            high = mid - 1
        else:
            # Nếu giá trị doanh số của mặt hàng ở vị trí mid bằng K
            # Trả về mid làm kết quả
            return arr[mid]

        # Cập nhật giá trị gần K nhất
        if result is None or abs(arr[mid] - K) < abs(arr[result] - K):
            result = mid

    return arr[result]

nearest_item = find_nearest_item(arr, K)
print("Mặt hàng có doanh số nhỏ hơn K nhưng gần với K nhất là:", nearest_item)

Câu 2.  

Thiết kế thuật toán và chương trình theo mô đun cho bài toán sau.

Một công ti du lịch có n địa điểm tham quan được đánh số theo thứ tự 0, 1, 2,…, n – 1. Công ti này luôn tổ chức các tour du lịch đi lần lượt từ vị trí 0, 1, 2, … và kết – thúc tại vị trí cuối cùng n − 1. Để thuận tiện cho việc quảng bá du lịch công ti đã lấy ý kiến khách hàng đánh giá bằng điểm số cho từng địa điểm du lịch trên, các đánh giá có thể là các số dương, 0 hoặc số âm bất kì. Số lớn hơn 0 biểu thị đánh giá tốt, số nhỏ hơn 0 biểu thị đánh giá xấu về địa điểm đó. Mỗi khách hàng sẽ gửi lên công ti du lịch bảng đánh giá của mình, được biểu thị bằng một dãy n số, ví dụ như sau:

1, -3, 4, 10, 0, -5, -8, 2, -1, 7, 2

Công ti du lịch hứa sẽ tổ chức một tour riêng cho mỗi khách hàng, bảo đảm sự hài lòng cao nhất của khách hàng. Tour du lịch riêng của khách hàng sẽ là một dãy các vị trí liên tục các địa điểm, ví dụ từ vị trí i đến j, tức là xuất phát từ i, khách hàng sẽ lần lượt đi qua các vị trí i, j + 1, i+ 2,… và kết thúc tại j. Công ti du lịch bảo đảm rằng tổng các đánh giá của khách hàng trên tour riêng của mình là lớn nhất.

Em hãy giúp công ti du lịch thiết lập tour du lịch tối ưu cho khách hàng nếu biết trước các đánh giá của khách hàng đó.

Lời giải:

Sau đây là hướng dẫn các bước thiết kế chương trình theo mô đun:

Bước 1: Thiết kế chung

Trong bước này, chúng ta sẽ xác định cách các mô đun tương tác với nhau và cách chương trình chính sẽ thực hiện luồng làm việc.

Bước 2: Thiết kế công việc nhập dữ liệu

Chúng ta xây dựng các hàm để nhập dữ liệu đánh giá từ khách hàng.

# data_input.py

def input_feedback_data():
    # Hàm nhập dữ liệu đánh giá từ khách hàng và trả về danh sách
    pass

Bước 3: Thiết kế công việc xử lý dữ liệu

Chúng ta xây dựng các hàm để xử lý dữ liệu đánh giá và tìm tour tối ưu.

# data_processing.py

def find_optimal_tours(feedback_data):
    # Hàm tìm tour du lịch tối ưu dựa trên đánh giá từ khách hàng
    pass

Bước 4: Thiết lập báo cáo, đưa ra dữ liệu

Chúng ta xây dựng các hàm để hiển thị kết quả và báo cáo.

# report_generation.py

def generate_reports(optimal_tours):
    # Hàm hiển thị kết quả và báo cáo
    pass

Các mô đun trên có thể được xây dựng độc lập và sau đó được nhập vào mô đun chương trình chính (main.py) để thực hiện luồng làm việc chính của chương trình. Điều này giúp chương trình dễ bảo trì và tái sử dụng.

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