Bài F16. Kiểm thử và gỡ lỗi chương trình

Khởi động (SGK Chân trời sáng tạo - Trang 157)

Hướng dẫn giải

a) Chương trình có 1 lỗi: 

Dòng 2: gtLonNhat = 0. Giả sử mảng A chỉ chứa các số âm, chương trình sẽ trả về 0, trong khi giá trị lớn nhất thực sự phải là một số âm.

=> Để khắc phục lỗi này, ta nên gán gtLonNhat bằng phần tử đầu tiên của mảng A và bắt đầu vòng lặp từ phần tử thứ hai.

b)

*Trường hợp A = [12, 17]: Chương trình sẽ chạy đúng sau khi sửa lỗi cú pháp. Kết quả sẽ là 17, vì đó là giá trị lớn nhất trong mảng.

Kết quả in ra: Giá trị lớn nhất là 17.

*Trường hợp A = []: Nếu mảng A là rỗng, chương trình sẽ gặp lỗi khi cố gắng truy cập vào A[i] trong vòng lặp for. Do đó, chương trình sẽ không thể in ra giá trị lớn nhất và sẽ báo lỗi.

Kết quả in ra: IndexError: list index out of range

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Khám phá 1 mục 1 (SGK Chân trời sáng tạo - Trang 159)

Hướng dẫn giải

A.  SyntaxError (Lỗi cú pháp). Cú pháp không hợp lệ vì 2.x không phải là một biểu thức hợp lệ.

B.Lỗi: ZeroDivisionError (Lỗi thời gian chạy). Khi a bằng 0, phép chia nguyên b//a sẽ gây ra lỗi.

C. Lỗi: TypeError (Lỗi thời gian chạy). Không thể cộng một số thực với một chuỗi.

D. Lỗi: NameError (Lỗi cú pháp). Hàm Printf không tồn tại trong Python, đúng cú pháp là print

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Khám phá 2 mục 1 (SGK Chân trời sáng tạo - Trang 159)

Hướng dẫn giải

- Lỗi cú pháp: là lỗi xảy ra khi mã nguồn không tuân thủ quy tắc ngữ pháp của ngôn ngữ lập trình.

*Ví dụ: 

print("Hello World"  # Thiếu dấu đóng ngoặc

=> Kết quả: SyntaxError: unexpected EOF while parsing.

- Lỗi thời gian chạy: là lỗi xảy ra khi chương trình chạy đến một điểm mà không thể thực hiện được thao tác nào đó.

*Ví dụ:

a = 5 / 0  # Chia cho 0

Kết quả: ZeroDivisionError: division by zero.

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Khám phá 3 mục 1 (SGK Chân trời sáng tạo - Trang 159)

Hướng dẫn giải

- Lỗi thời gian chạy: Dễ phát hiện hơn vì chương trình sẽ dừng lại và thông báo lỗi.

- Lỗi logic: Khó phát hiện hơn vì chương trình vẫn chạy nhưng kết quả không đúng.

- Ví dụ: 

def tinh_tong(a, b):

    return a - b  # Lỗi logic: nên là a + b

print(tinh_tong(5, 3))  # Kết quả sai: 2 thay vì 8

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Khám phá 4 mục 1 (SGK Chân trời sáng tạo - Trang 159)

Hướng dẫn giải

Hàm sum() tính tổng các phần tử trong danh sách A. Nếu A chứa các số, nó sẽ trả về tổng của chúng.

A = [1, 2, 3, 4]

print(sum(A))  # Kết quả: 10

Nếu A chứa các phần tử không phải số, sẽ gây ra lỗi.

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Khám phá mục 2 (SGK Chân trời sáng tạo - Trang 161)

Hướng dẫn giải

- Đảm bảo độ bao phủ: Kiểm thử với nhiều bộ dữ liệu giúp phát hiện lỗi trong các tình huống khác nhau.

- Kiểm tra tính chính xác: Đảm bảo chương trình hoạt động đúng với các loại dữ liệu khác nhau (dương, âm, số nguyên, số thực).

- Phát hiện lỗi tiềm ẩn: Một số lỗi chỉ xuất hiện với dữ liệu cụ thể, vì vậy cần kiểm thử đa dạng.

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Khám phá 1 mục 3 (SGK Chân trời sáng tạo - Trang 163)

Hướng dẫn giải

Tùy từng trường hợp: 

- Có: Nếu các lệnh print() cung cấp thông tin hữu ích cho việc gỡ lỗi hoặc theo dõi hoạt động của chương trình.

- Không: Nếu chúng gây rối hoặc không cần thiết, có thể xóa hoặc thay thế bằng logging.

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Khám phá 2 mục 3 (SGK Chân trời sáng tạo - Trang 163)

Hướng dẫn giải

- Theo dõi biến: Giúp theo dõi giá trị của các biến trong quá trình thực thi.

- Đặt điểm dừng: Cho phép đặt điểm dừng để dừng chương trình tại một vị trí cụ thể, dễ dàng kiểm tra trạng thái.

- Thực thi từng bước: Có thể thực thi chương trình từng bước, giúp phát hiện lỗi dễ dàng hơn.

- Phân tích lỗi: Giúp phân tích lỗi và tìm hiểu nguyên nhân gốc rễ của vấn đề.

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Luyện tập (SGK Chân trời sáng tạo - Trang 164)

Hướng dẫn giải

*Các lỗi cần khắc phục:

+ Lỗi cú pháp (Syntax Error): Thiếu dấu đóng ngoặc sau list(map(int, input().split())). (Dòng 1)

+ Lỗi IndentationError: Cần được căn chỉnh đúng để đảm bảo cấu trúc của khối lệnh. (Dòng 2 và các dòng tiếp theo)

+ Lỗi NameError:  In ra biến a, nhưng biến này không được định nghĩa. Nên in ra biến A thay vì a. (Dòng 6)

*Chương trình đã sửa

Dưới đây là phiên bản đã sửa của chương trình:

A = list(map(int, input("Nhập danh sách A: ").split()))  # Sửa lỗi cú pháp

i = 0

while i < len(A):  # Sử dụng vòng lặp while để duyệt danh sách

    if A[i] < 0:

        A.remove(A[i])  # Sửa lỗi NameError

    else:

        i += 1 # Chỉ tăng i khi không xóa phần tử

print(A)  # In ra danh sách A đã được xóa các phần tử âm

*Giải thích về các sửa đổi:

- Dòng 1: Thêm dấu đóng ngoặc để hoàn tất cú pháp của hàm list().

- Vòng lặp: Sử dụng vòng lặp while để có thể kiểm soát chỉ số i khi xóa phần tử trong danh sách. Khi xóa một phần tử, chỉ số i không được tăng lên để kiểm tra phần tử tiếp theo.

- Dòng 6: In ra biến A thay vì a để hiển thị danh sách đã sửa đổi.

*Kết quả: Chương trình sẽ nhận đầu vào là danh sách các số nguyên và in ra danh sách đã xóa tất cả các phần tử âm

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)

Vận dụng 1 (SGK Chân trời sáng tạo - Trang 164)

Hướng dẫn giải

- Điểm ngắt (Breakpoint) là một công cụ hữu ích trong quá trình gỡ lỗi, cho phép lập trình viên dừng chương trình tại một vị trí cụ thể để kiểm tra trạng thái của nó. Dưới đây là cách sử dụng điểm ngắt trong Debug Control:

B1- Đặt điểm ngắt:

+ Mở tệp mã nguồn trong IDE (như PyCharm, Visual Studio Code).

+ Nhấp chuột vào lề bên trái của dòng mã nơi em muốn dừng chương trình. Một điểm ngắt sẽ xuất hiện (thường là một chấm đỏ).

 

B2 - Chạy chương trình trong chế độ gỡ lỗi:

Thay vì chạy chương trình bình thường, chọn "Run Debug" từ menu hoặc thanh công cụ.

B3 - Bỏ qua các lệnh không cần kiểm tra:

+ Khi chương trình dừng tại điểm ngắt, bạn có thể kiểm tra giá trị của các biến, trạng thái của chương trình.

+ Sử dụng các nút điều khiển trong Debug Control để thực hiện các hành động như "Step Over" (bỏ qua lệnh hiện tại), "Step Into" (vào hàm) hoặc "Continue" (tiếp tục chạy đến điểm ngắt tiếp theo).

B4 - Kiểm tra và phân tích:

+ Em có thể xem giá trị của các biến trong cửa sổ Locals hoặc Watch.

+ Điều này giúp bạn xác định vấn đề mà không cần phải chạy toàn bộ chương trình.

(Trả lời bởi Nguyễn Quốc Đạt)
Thảo luận (1)