Giải Tin Học 10 trang 146

Lời giải chi tiết SGK Lớp 10 · Môn Tin Học · Trang 146–147

Hai trang này là phần mở đầu của Bài 30: Kiểm thử và gỡ lỗi chương trình. Nội dung chủ yếu là lý thuyết, có một hoạt động thảo luận nhóm và một ví dụ minh họa. Cô tóm tắt và phân tích chi tiết cho em nhé.

Mục tiêu bài học

Sau bài này em sẽ:

  • Biết một vài phương pháp đơn giản để kiểm thử (test) chương trình.
  • Biết một vài cách gỡ lỗi (debug) đơn giản một chương trình.

Khái niệm mở đầu: Lỗi và bug

Em cần phân biệt rõ hai loại lỗi:

LoạiĐặc điểm
Lỗi ngoại lệ (Runtime)Làm chương trình dừng lại khi chạy, dễ phát hiện vì có thông báo lỗi.
Lỗi "bug"Chương trình vẫn chạy bình thường nhưng cho kết quả sai. Khó phát hiện và khó sửa hơn nhiều.

Điểm mấu chốt: chương trình chạy không báo lỗi không có nghĩa là chương trình đúng. Đây chính là lý do ta cần kiểm thử và gỡ lỗi.

1. Một vài phương pháp kiểm thử chương trình

Hoạt động: Tìm hiểu một số phương pháp kiểm thử

Đề yêu cầu: Đọc và thảo luận nhóm các phương pháp, công cụ sau để biết chức năng, tác dụng của từng công cụ trong việc kiểm thử chương trình.

Trả lời gợi ý: Có nhiều công cụ khác nhau, mục đích không chỉ tìm ra lỗi (bug) mà còn phòng ngừangăn chặn lỗi phát sinh trong tương lai. Bốn nhóm phương pháp chính được trình bày ở phần a, b, c, d dưới đây.

a) Quan sát mã lỗi Runtime và bắt lỗi ngoại lệ

Khi chương trình bị dừng do lỗi Runtime, ta quan sát mã lỗi ngoại lệ để biết vị trí dòng lệnh sinh ra lỗi, từ đó phân tích, tìm và sửa.

b) Kiểm thử với các bộ dữ liệu test

Chương trình cần được thử với nhiều bộ dữ liệu test (đầu vào tiêu biểu và kết quả đầu ra đã biết trước). Ba lưu ý quan trọng:

  • Cần có nhiều bộ test theo các tiêu chí khác nhau như độ lớn, tính đa dạng của dữ liệu.
  • Cần có bộ test ngẫu nhiên: sinh ngẫu nhiên dữ liệu đầu vào trong miền xác định làm tăng khả năng tìm ra lỗi.
  • Cần có bộ test ở vùng biên: ví dụ dữ liệu là cặp $(x, y)$ trên miền $0 \le x, y \le 1$ thì cần kiểm tra tại các điểm biên $(0;0)$, $(0;1)$, $(1;0)$, $(1;1)$. Thực tế lỗi hay phát sinh ở vùng biên hoặc lân cận biên.

c) In các thông số trung gian

Chèn thêm các lệnh print() vào giữa chương trình để in ra các biến trung gian, qua đó kiểm tra quy trình/thuật toán có đúng không.

Nếu đầu vào là $(x_1, x_2, ..., x_n)$, đầu ra là $(a_1, a_2, ..., a_m)$ và có các biến trung gian $(y_1, y_2, ..., y_k)$ thì ta in ra cả ba nhóm giá trị. Nhờ vậy nếu kết quả cuối sai, ta dễ lần ra lỗi nằm ở đâu.

d) Sử dụng công cụ break point (điểm dừng)

Công cụ break point tạo ra các "điểm dừng" bên trong chương trình. Khi chạy đến đó chương trình tạm dừng, cho phép người kiểm thử quan sát thông tin bên trong. Trên thực tế, kết hợp điểm dừng với in giá trị trung gian sẽ hiệu quả hơn.

Một số ghi nhớ

  • Sử dụng công cụ in các biến trung gian.
  • Sử dụng công cụ sinh các bộ dữ liệu test.
  • Sử dụng công cụ điểm dừng trong phần mềm soạn thảo lập trình.
  • Quan sát các mã lỗi của chương trình nếu phát sinh.

2. Ví dụ minh họa

Bài toán: Nhập từ bàn phím hai số tự nhiên m, n, tính ƯCLN của hai số này.

Thuật toán dựa trên ba tính chất của gcd(m, n):

  1. $\gcd(m, m) = m$
  2. Nếu $n > m$ thì $\gcd(m, n) = \gcd(m, n - m)$
  3. Nếu $n < m$ thì $\gcd(m, n) = \gcd(m - n, n)$

Ý tưởng: liên tục lấy số lớn trừ số nhỏ. Vòng lặp while kết thúc khi $m = n$, khi đó giá trị chung chính là ƯCLN.

Chương trình:

# Tính ƯCLN của m, n
m = int(input("Nhập số tự nhiên m: "))
n = int(input("Nhập số tự nhiên n: "))
while m != n:
    if m < n:
        n = n - m
    else:
        m = m - n
print("Đáp số:", m)

Giải thích từng bước với ví dụ $m = 12$, $n = 8$:

Lần lặpmnSo sánhPhép tính
Bắt đầu128$m > n$$m = 12 - 8 = 4$
148$m < n$$n = 8 - 4 = 4$
244$m = n$Dừng vòng lặp

Kết quả in ra: Đáp số: 4 — đúng vì ƯCLN(12, 8) = 4.

Ghi chú nhỏ: thuật toán này dùng phép trừ liên tiếp (thuật toán Euclid dạng trừ). Nó hoạt động đúng với số tự nhiên dương; đây cũng là một chương trình tốt để áp dụng các phương pháp kiểm thử ở phần 1, ví dụ in giá trị trung gian của m, n trong vòng lặp để theo dõi.

Hai trang này không có bài tập trắc nghiệm hay tự luận để giải riêng, em nhé. Phần trọng tâm cần nhớ là 4 phương pháp kiểm thử (a, b, c, d) và biết đọc hiểu chương trình ví dụ tính ƯCLN.

Chế độ đọc sách →