Khi thực hiện chương trình Python xảy ra một số lỗi dẫn đến kết quả thực hiện chương trình sai hoặc không thực hiện được. Vậy, làm thế nào để phát hiện lỗi? Có những cách nào để xác định lỗi trong chương trình? Đây là nội dung Bài 16: Kiểm thử và gỡ lỗi chương trình trong chương trình Tin học 10 Cánh diều Chủ đề F. Cùng DapAnHay tham khảo nội dung bài giảng dưới đây để hiểu rõ các kiến thức này!
- Gỡ lỗi: là quá trình xác định lỗi và sửa lỗi.
- Khi lập trình thường gặp các lỗi sau:
+ Lỗi cú pháp: là lỗi câu lệnh viết không theo đúng quy định của ngôn ngữ.
+ Lỗi ngoại lệ: (Exceptions Error) còn gọi là lỗi Runtime, là lỗi xảy ra khi chương trình đang chạy, một lệnh nào đó không thể thực hiện được
+ Lỗi ngữ nghĩa (lỗi logic): là lỗi mặc dù các câu lệnh viết đúng quy định của ngôn ngữ nhưng sai thao tác xử lí nào đó. Đây là loại lỗi rất khó phát hiện.
- Ví dụ:
+ Xét chương trình ở Hình 1a, chương trình này thực hiện yêu cầu nhập vào hai số nguyên p, q và danh sách a gồm các số nguyên, sau đó đưa ra max{│ai│, i = p, p + 1, …, q}. Biết rằng các phần tử của danh sách a được đánh chỉ số bắt đầu từ 0 và 0 ≤ p ≤ q < len(a)
Hình 1a. Chương trình cần kiểm thử và tìm lỗi | |
Hình 1b. Kết quả đúng | Hình 1c. Kết quả sai |
+ Giải thích:
. Với đầu vào p = 1, q = 4 (Hình 1b), dãy con được xét là 7 1 5 -6, nên 7 là đáp án đúng, là số có giá trị tuyệt đối lớn nhất trong dãy con đó
. Với đầu vào p = 2, q = 4 (Hình 1c), dãy con được xét là 1 5 -6, đáp án đúng phải là 6
- Việc đọc kĩ lại chương trình để tìm lỗi chỉ thích hợp với các chương trình ngắn, đơn giản
- Môi trường lập trình của những ngôn ngữ lập trình bậc cao có công cụ hỗ trợ cho người dùng tìm lỗi
- Các lỗi ngữ nghĩa chỉ có thể phát hiện thông qua quan sát kết quả thực hiện chương trình với các bộ dữ liệu vào (các bộ test) khác nhau
- Để kiểm tra tính đúng đắn của chương trình so với yêu cầu của đề bài, trước hết cần chuẩn bị các bộ dữ liệu vào. Dữ liệu kiểm thử phải phù hợp với các ràng buộc đã cho và chia thành 3 nhóm:
+ Kiểm thử những trường hợp thường gặp trong thực tế
+ Kiểm thử những trường hợp đặc biệt (ví dụ, khi danh sách chỉ bao gồm một phần tử)
+ Kiểm thử những trường hợp các tham số nhận giá trị lớn nhất có thể
- Cách tìm lỗi ngữ nghĩa:
+ Bổ sung vào chương trình những câu lệnh đưa ra các kết quả trung gian nhằm truy vết các xử lí của chương trình. => dự đoán và khoanh vùng được phần chương trình chứa các câu lệnh đưa đến kết quả sai và sửa lại
Chú ý: Sau khi sửa xong chương trình cần xóa đi các câu lệnh đã thêm vào để truy vết hoặc biến chúng thành chú thích
- Ví dụ: Xét lại ví dụ ở mục 1.1
Hình 2a. Chương trình ở Hình 1a đã thêm câu lệnh để truy vết | |
Hình 2a. Kết quả đúng | Hình 2a. Kết quả sai |
=> Ta thấy lỗi ở việc xác định miền tìm max và cần phải sửa lại câu lệnh for i in range(p,q): thành for i in range(p,q+1):
- Dựa vào ví dụ, ta thấy cách truy vết này phải can thiệp vào chương trình nguồn, thêm các câu lệnh mới và sau đó phải xóa các câu lệnh truy vết không còn cần thiết.
=> Nhược điểm: Bất tiện vì câu lệnh mới đưa vào có thể có lỗi hoặc đưa nhầm vào vị trí không thích hợp.
Để kích hoạt chế độ gỡ lỗi (Debug), ta thực hiện lần lượt các thao tác sau:
- Mở file chương trình cần gỡ lỗi
- Chọn Debug => chọn Debugger (Hình 3) => xuất hiện cửa sổ Debug Control (Hình 4)
- Chọn Run Module (Hoặc F5)
- Chọn Step (hoặc Over)
* Kết luận:
- Để tìm và sửa lỗi ngữ nghĩa cần dùng biện pháp truy vết
- Muốn truy vết để tìm lỗi:
+ Có thể đưa thêm các câu lệnh xuất ra kết quả trung gian của quá trình tính toán
+ Có thể sử dụng công cụ gỡ lỗi của môi trường lập trình
⇒ Truy vết để tìm lỗi là một quá trình khá khó khăn và phức tạp, đôi khi mất khá nhiều thời gian
⇒ Python còn trang bị một thư viện riêng cung cấp các dịch vụ gỡ lỗi, đó là thư viện PDB
Xét bài toán: Cho a là danh sách các số nguyên. Em hãy tạo danh sách b có các phần tử ở vị trí lẻ bằng phần tử ở vị trí tương ứng của a, các phần tử ở vị trí chẵn bằng phần tử ở vị trí tương ứng của a cộng thêm 1, tức là:
\({b_i} = \left\{ \begin{array}{l}
{a_i} + 1,i = 0,2,4,...\\
{a_i},i = 1,3,5,...
\end{array} \right.\)
- So sánh số lượng các phần tử từ giá trị chẵn ở a với số lượng các phần tử giá trị chẵn ở b, đưa ra thông báo.
- Gọi p là số lượng các phần tử giá trị chẵn ở a, q là số lượng các phần tử giá trị chẵn ở b và đưa ra thông báo “a ít hơn” nếu p < q, “b ít hơn” nếu p > q và “Bằng nhau” trong trường hợp còn lại
Nhiệm vụ: Áp dụng truy vết để xác định lỗi và đề xuất cách sửa một số ít nhất các câu lệnh để có chương trình đúng
Hình 6. Chương trình cần được gỡ lỗi
Hướng dẫn:
- Phương pháp dùng công cụ Gỡ lỗi (Debug)
+ Chuẩn bị danh sách số nguyên, ví dụ [5, 3, 2, 2, 1, 2]
+ Chọn Debugger, chọn Step, quan sát giá trị hai danh sách a và b. Sau một vài lần thực hiện câu lệnh trong vòng lặp:
for i in range(0,n,2):
b[i] = b[i] + 1
Ta thấy: a và b đồng thời thay đổi giá trị, mặc dù trong vòng lặp chỉ chứa câu lệnh thay đổi giá trị của danh sách b.
- Ví dụ:
- Sau khi i = 2 ta có kết quả như Hình 7
⇒ Chương trình chưa tạo ra bản sao của danh sách a mà chỉ tạo một tên mới cho cùng một danh sách a
⇒ Câu lệnh sai trong chương trình là b = a
⇒ sửa là: b = [] + a
Hình 7. Minh họa kết quả của phương pháp gỡ lỗi
- Phương pháp bổ sung vào chương trình các câu lệnh truy vết
+ Thêm câu lệnh print(a) và print(b) để xuất ra giá trị các danh sách a và b sau mỗi vòng lặp
⇒ Dễ dàng nhận thấy a và b cùng đồng thời thay đổi
⇒ Kết luận: Câu lệnh sai trong chương trình là b = a
⇒ sửa là: b = [] + a
- Có ba loại bộ dữ liệu vào cần tạo để kiềm tra, đánh giá chương trình. - Lỗi ngữ nghĩa khó phát hiện. - Để tìm và sừa lỗi ngữ nghĩa cần dùng biện pháp truy vết - Muốn truy vết để tìm lỗi: + Có thể đưa thêm các câu lệnh xuất ra kết quả trung gian của quá trinh tính toán. + Có thể sử dụng công cụ gỡ lỗi của môi trường lập trình. - Trên cửa sổ Debug Control có phần hiển thị thông tin về giá trị các biến trong chương trình. |
---|
Bài tập 1: Có những chương trình còn lỗi vì khi thực hiện cho ra kết qua sai. Theo em, việc biết giá trị của một số biến ngay sau khi mỗi câu lệnh được thực hiện có thể giúp tìm ra lỗi của chương trình hay không?
Hướng dẫn giải:
Việc biết giá trị của một số biến ngay sau khi mỗi câu lệnh được thực hiện có thể giúp tìm ra lỗi.
Bài tập 2: Cho đoạn chương trình sau:
a=int(input()
print(a)
Lỗi trong chương trình trên là lỗi gì?
Hướng dẫn giải:
Đoạn chương trình trên sai do thiếu dấu ngoặc ở câu lệnh 1. Vì vậy đây là lỗi cú pháp.
Bài tập 3: Để kiểm thử chương trình có bao nhiêu nhóm dữ liệu khác nhau cần tạo ra
Hướng dẫn giải:
Có 3 nhóm dữ liệu khác nhau cần tạo ra để kiểm thử chương trình:
- Kiểm thử những trường hợp thường gặp trong thực tế.
- Kiểm thử những trường hợp đặc biệt.
- Kiểm thử những trường hợp các tham số nhận giá trị lớn nhất có thể.
Qua bài học các em cần nắm được các về:
- Biết và khắc phục được một số lỗi thường gặp khi viết chương trình
- Bước đầu thực hiện được một số truy vết đơn giản để tìm và gỡ lỗi cho chương trình Python
Các em có thể hệ thống lại nội dung kiến thức đã học được thông qua bài kiểm tra Trắc nghiệm Tin học 10 Cánh diều Chủ đề F Bài 16 cực hay có đáp án và lời giải chi tiết.
Phát biểu nào sau đây là đúng về lỗi cú pháp?
Phát biểu nào sau đây là đúng về lỗi ngoại lệ?
Phát biểu nào sau đây là đúng về lỗi ngữ nghĩa?
Câu 4-10: Mời các em đăng nhập xem tiếp nội dung và thi thử Online để củng cố kiến thức về bài học này nhé!
Các em có thể xem thêm phần hướng dẫn Giải bài tập Tin học 10 Cánh diều Chủ đề F Bài 16để giúp các em nắm vững bài học và các phương pháp giải bài tập.
Khởi động trang 110 SGK Tin học 10 Cánh diều - CD
Hoạt động 1 trang 110 SGK Tin học 10 Cánh diều - CD
Hoạt động 2 trang 112 SGK Tin học 10 Cánh diều - CD
Vận dụng trang 116 SGK Tin học 10 Cánh diều - CD
Câu hỏi tự kiểm tra 1 trang 116 SGK Tin học 10 Cánh diều - CD
Câu hỏi tự kiểm tra 2 trang 116 SGK Tin học 10 Cánh diều - CD
Câu hỏi tự kiểm tra 3 trang 116 SGK Tin học 10 Cánh diều - CD
Câu hỏi tự kiểm tra 4 trang 116 SGK Tin học 10 Cánh diều - CD
Trong quá trình học tập nếu có thắc mắc hay cần trợ giúp gì thì các em hãy comment ở mục Hỏi đáp, Cộng đồng Tin học DapAnHay sẽ hỗ trợ cho các em một cách nhanh chóng!
Chúc các em học tập tốt và luôn đạt thành tích cao trong học tập!
-- Mod Tin Học 10 DapAnHay
Phát biểu nào sau đây là đúng về lỗi cú pháp?
Phát biểu nào sau đây là đúng về lỗi ngoại lệ?
Phát biểu nào sau đây là đúng về lỗi ngữ nghĩa?
Điều gì sẽ xảy ra nếu bạn cố mở một file không tồn tại?
Để xem giá trị các biến sau khi thực hiện một câu lệnh ta dùng lệnh gì?
Khẳng định nào sau đây là sai về lỗi chương trình?
Để kiêm thử những trường hợp thường gặp trong thực tế ta chọn bộ dữ liệu như thể nào?
Thư viện PDB là thư viện dùng để làm gì?
Lỗi nào khó phát hiện nhất?
Để kiểm thử chương trình có bao nhiêu nhóm dữ liệu khác nhau cần tạo ra?
Có những chương trình còn lỗi vì khi thực hiện cho ra kết qua sai. Theo em, việc biết giá trị của một số biến ngay sau khi mỗi câu lệnh được thực hiện có thể giúp tìm ra lỗi của chương trình hay không?
Trong những phần trước, các bài tập và bài thực hành không quá phức tạp. Đã lần nào em soạn chương trình và thực hiện được ngay từ lần đầu tiên chưa?
Tại sao rất khó phát hiện lỗi nếu chỉ dùng biện pháp đọc kĩ lại chương trình?
Em hãy soạn thảo và thực hiện từng bước chương trình ở hình sau:
Em hãy nêu một vài lỗi thuộc nhóm lỗi cú pháp và một vài lỗi thuộc nhóm lỗi ngữ nghĩa.
Tại sao phải tạo nhiều bộ dữ liệu vào khác nhau để kiểm thử chương trình?
Có bao nhiêu nhóm dữ liệu khác nhau cần tạo ra để kiểm thử chương trình?
Có thể xem giá trị các biến sau khi thực hiện một câu lệnh ở đâu?
Họ và tên
Tiêu đề câu hỏi
Nội dung câu hỏi
Câu trả lời của bạn
Bổ sung vào chương trình những câu lệnh đưa ra các kết quả trung gian nhằm truy vết các xử lí của chương trình. => dự đoán và khoanh vùng được phần chương trình chứa các câu lệnh đưa đến kết quả sai và sửa lại.
Câu trả lời của bạn
Lỗi ngữ nghĩa (lỗi logic): là lỗi mặc dù các câu lệnh viết đúng quy định của ngôn ngữ nhưng sai thao tác xử lí nào đó. Đây là loại lỗi rất khó phát hiện.
Câu trả lời của bạn
Lỗi ngoại lệ: (Exceptions Error) còn gọi là lỗi Runtime, là lỗi xảy ra khi chương trình đang chạy, một lệnh nào đó không thể thực hiện được
Câu trả lời của bạn
Lỗi cú pháp: là lỗi câu lệnh viết không theo đúng quy định của ngôn ngữ.
Câu trả lời của bạn
Việc biết giá trị của một số biến ngay sau khi mỗi câu lệnh được thực hiện có thể giúp tìm ra lỗi.
0 Bình luận
Để lại bình luận
Địa chỉ email của hạn sẽ không được công bố. Các trường bắt buộc được đánh dấu *