Giải Tin học 10 – Bài 30. Kiểm thử và gỡ lỗi chương trình – KNTT
1. Một vài phương pháp kiểm thử chương trình
Câu hỏi: Theo em, làm thế nào để kiểm tra (test) và gỡ lỗi (bug) một chương trình? Môi trường lập trình có công cụ nào hỗ trợ việc đó không?
Hướng dẫn giải: Để kiểm tra (test) và gỡ lỗi (debug) một chương trình có nhiều phương pháp, tiêu biểu như:
– Quan sát mã lỗi Runtime và bắt ngoại lệ
– Sử dụng nhiều bộ test dữ liệu
– In các thông số trung gian
– Tạo các điểm dừng để quan sát thông tin khác bên trong chương trình
Môi trường lập trình có công cụ hỗ trợ: Hiển thị mã lỗi và bắt ngoại lệ và tạo các điểm dừng để quan sát thông tin bên trong chương trình.
2. Ví dụ minh họa
Học sinh tự thực hiện theo yêu cầu của đề bài.
Luyện tập
Câu 1. Chương trình của em khi chạy phát sinh lỗi ngoại lệ ZeroDivisionError. Đó là lỗi gì và em xử lí lỗi này như thế nào?
Câu 2. Chương trình sau có lỗi không? Nếu có thì tìm và sửa lỗi.
m = input("Nhập số tự nhiên m: ")
n = input("Nhập số tự nhiên n: ")
print("Tổng hai số đã nhập là:",m+n)
Hướng dẫn giải:
Câu 1: Khi chạy phát sinh lỗi ngoại lệ ZeroDivisionError – Lỗi chia cho 0. Nếu gặp lỗi này cần tìm ra vị trí gây lỗi để biết phép tính nào tạo ra phép chia cho 0. Sau đó tiến hành các biện pháp xử lí lỗi này trong chương trình, ví dụ chỉ cho phép thực hiện phép chia khi mẫu số khác 0.
Câu 2: Chương trình không phát sinh lỗi ngoại lệ nhưng có lỗi logic vì đưa ra kết quả sai, không chính xác (chương trình tính tổng 2 số nhưng kết quả đưa ra phép ghép xâu), sửa lỗi như sau:
m = int(input("Nhập số tự nhiên m: "))
n = int(input("Nhập số tự nhiên n: "))
print("Tổng hai số đã nhập là:",m+n)
Vận dụng
Câu 1. Chương trình sau có chức năng sắp xếp một dãy số cho trước. hãy kiểm tra xem chương trình có lỗi không? Nếu có thì tìm và sửa lỗi.
A = [10,1,5,2,8,0,4]
for i in range(len(A)-1):
j = i
while j>1 and A[j]<A[j-1]:
A[j],A[j-1] = A[j-1], A[j]
j = j - 1
print(A)
Câu 2. Để kiểm thử một chương trình, nếu chỉ bằng việc kiểm tra thông qua các bộ dữ liệu test thì có đảm bảo tìm ra hết lỗi của chương trình hay không? Vì sao?
Hướng dẫn giải:
Câu 1: Chương trình có lỗi logic: Chương trình chạy không lỗi ngoại lệ nhưng kết quả đưa sai, không chính xác. Cụ thể cần sửa lại:
– Dòng lệnh thứ 2: range(len(A) – 1) → range(len(A))
– Dòng lệnh thứ 4: j > 1 → j > 0
– Chương trình chính xác như sau:
A = [10,1,5,2,8,0,4]
for i in range(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
print(A)
Câu 2: Để kiểm thử một chương trình, nếu chỉ bằng việc kiểm tra thông qua các bộ dữ liệu test thì không thể đảm bảo tìm ra hết lỗi của chương trình. Việc kiểm tra chương trình bằng các bộ dữ liệu test càng nhiều sẽ càng làm tăng độ tin cậy của chương trình nhưng vẫn chưa đảm bảo tìm ra hết lỗi của chương trình.
Vì lỗi có thể phát sinh tại các bộ dữ liệu khác ngoài các bộ dữ liệu test, do đó cần tuỳ theo yêu cầu, đặc thù của từng bài toán để chọn bộ test cho phù hợp.
Xem thêm Bài 31. Thực hành viết chương trình đơn giản – KNTT