Cho chương trình tìm giá trị lớn nhất trong mảng A:

a) Theo em, chương trình trên có lỗi không?
b) Cho A = [12, 17] hay A = []. Em hãy cho biết kết quả được in trên màn hình có đúng với yêu cầu của bài toán không.
Cho chương trình tìm giá trị lớn nhất trong mảng A:

a) Theo em, chương trình trên có lỗi không?
b) Cho A = [12, 17] hay A = []. Em hãy cho biết kết quả được in trên màn hình có đúng với yêu cầu của bài toán không.
Theo em, khi biên dịch các đoạn chương trình sau, sẽ xuất hiện các lỗi nào?
A. a = 2.x
B. a = 0
b = 1
c = b // a
C. a = 1.0 + "2.0"
D. printf("Xin chào")
Thảo luận (1)Hướng dẫn giảiA. 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)
Em hãy trình bày và cho ví dụ về sự khác biệt giữa lỗi cú pháp và lỗi thời gian chạy.
Thảo luận (1)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)
Theo em, giữa lỗi thời gian chạy và lỗi logic, em hãy cho biết lỗi nào khó phát hiện hơn. Cho ví dụ minh hoạ.
Thảo luận (1)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)
Cho A là một danh sách bất kì, câu lệnh print(sum(A)) có thể gặp thông báo lỗi nào? Cho ví dụ minh hoạ.
Thảo luận (1)Hướng dẫn giảiHà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)
Vì sao cần có nhiều bộ dữ liệu khác nhau để kiểm thử chương trình?
Thảo luận (1)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)
Có nên giữ các lệnh print() được chèn thêm sau khi hoàn thành kiểm thử chương trình hay không?
Thảo luận (1)Hướng dẫn giảiTù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)
Em hãy cho biết ưu điểm khi sử dụng công cụ Debugger để kiểm thử và gỡ lỗi.
Thảo luận (1)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)
Cho chương trình xoá tất cả các phần tử có giá trị âm trong danh sách A như sau:

Chương trình này đang gặp lỗi SyntaxError, IndentationError và NameError. Em hãy tìm và khắc phục các lỗi trên để chương trình có thể thực thi được.
Thảo luận (1)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)
Tìm hiểu và sử dụng chức năng đặt điểm ngắt (Breakpoint) trong Debug Control để bỏ qua các lệnh không cần kiểm tra và thực hiện nhanh đến dòng lệnh quan tâm.
Thảo luận (1)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)