Trắc nghiệm Tin học 10 Bài 30 Kết nối tri thức có đáp án (20 câu)

Trả lời nhanh

Đáp án 20 câu: 1-A, 2-D, 3-C, 4-B, 5-D, 6-A, 7-C, 8-A, 9-C, 10-A, 11-B, 12-C, 13-D, 14-B, 15-A, 16-C, 17-A, 18-B, 19-D, 20-A. Mỗi câu đều có lời giải bên dưới. Hãy tự làm trước rồi đối chiếu, vì phần giải thích cho biết cả lí do các phương án còn lại bị loại.

Cần nhớ gì trước khi làm trắc nghiệm Bài 30?

Bài 30 gồm hai việc nối tiếp nhau. Kiểm thử là chạy chương trình với các bộ dữ liệu test để tìm ra lỗi. Gỡ lỗi là tìm vị trí, nguyên nhân gây lỗi rồi sửa. Muốn gỡ lỗi thì phải kiểm thử trước, vì chưa chạy thử thì chưa biết lỗi nằm ở đâu.

  • Bộ test gồm đầu vào tiêu biểu và kết quả đầu ra đã biết trước. Chương trình chạy xong, em so kết quả thực tế với kết quả dự kiến.
  • Tiêu chí chọn test: độ lớn của dữ liệu, tính đa dạng, dữ liệu ngẫu nhiên trong miền xác định, và đặc biệt là các giá trị ở biên hoặc gần biên, nơi lỗi hay xuất hiện.
  • Công cụ hỗ trợ: in biến trung gian bằng print(), công cụ sinh bộ test, điểm dừng (breakpoint) trong phần mềm soạn thảo.

Ôn kĩ hơn ở phần lý thuyết: Lý thuyết Tin học 10 Bài 30.

Phân biệt nhanh các loại lỗi hay gặp

Loại lỗi Khi nào xuất hiện Ví dụ trong Python Cách xử lí
Lỗi cú pháp (SyntaxError) Trước khi chạy, do viết sai ngữ pháp Thiếu dấu : sau if Đọc thông báo, sửa đúng dòng báo lỗi
Lỗi ngoại lệ (lúc chạy) Trong khi chạy, chương trình dừng đột ngột 1/0 → ZeroDivisionError; a[10] → IndexError; s + i (chuỗi + số) → TypeError Kiểm tra số chia, chỉ số, kiểu dữ liệu
Lỗi logic Chạy bình thường nhưng kết quả sai Tính tổng 1..n mà viết range(1, n) Kiểm thử bằng bộ test, in biến trung gian

Mẹo nhớ: lỗi cú pháp thì “máy chê ngay”, lỗi ngoại lệ thì “máy dừng giữa chừng”, lỗi logic thì “máy chạy êm nhưng kết quả sai”. Lỗi logic khó nhất vì không có thông báo nào, nên phải nhờ kiểm thử.

Phần 1. 10 câu bám sát đề cơ bản

Câu 1. Chương trình chạy phát sinh lỗi ngoại lệ ZeroDivisionError thì nên xử lí thế nào?

  • A. Kiểm tra lại giá trị số chia.
  • B. Kiểm tra lại chỉ số trong danh sách.
  • C. Kiểm tra giá trị của số bị chia.
  • D. Kiểm tra kiểu dữ liệu nhập vào.

Đáp án: A. Lỗi này xảy ra khi chia cho 0, nên phải xem số chia đang bằng bao nhiêu. Số bị chia bằng 0 vẫn chia được (0 / 5 = 0), vì vậy C sai. B là của IndexError, D thường gắn với TypeError hoặc ValueError.

Câu 2. Đoạn lệnh sau có lỗi ở dòng nào?

fruits = ['Banana', 'Apple', 'Lime']
loud_fruits = [fruit.upper() for fruit in fruits]
print(loud_fruits)
list(enumerate(fruits))
  • A. Dòng 2.
  • B. Dòng 3.
  • C. Dòng 4.
  • D. Không phát sinh lỗi.

Đáp án: D. Dòng 2 dùng danh sách sinh (list comprehension) đúng cú pháp, upper() áp dụng được cho chuỗi. Dòng 3 in danh sách chữ hoa. Dòng 4 trả về danh sách các cặp (chỉ số, phần tử). Cả đoạn chạy tốt, nên không chọn dòng nào.

Câu 3. Lệnh >>> 1 / 0 gây ra lỗi gì?

  • A. NameError.
  • B. TypeError.
  • C. ZeroDivisionError.
  • D. SyntaxError.

Đáp án: C. Cú pháp phép chia hoàn toàn đúng nên không phải SyntaxError. Biểu thức không có tên lạ hay kiểu sai nên không phải A, B. Lỗi chỉ đến từ việc chia cho 0.

Câu 4. Chương trình báo lỗi ngoại lệ IndexError thì nên làm gì?

  • A. Kiểm tra lại giá trị số chia.
  • B. Kiểm tra lại chỉ số truy cập phần tử trong danh sách.
  • C. Kiểm tra giá trị của số bị chia.
  • D. Kiểm tra kiểu dữ liệu nhập vào.

Đáp án: B. IndexError xuất hiện khi truy cập phần tử có chỉ số vượt quá giới hạn. Ví dụ danh sách 3 phần tử chỉ có chỉ số 0, 1, 2; gọi a[3] là lỗi.

Câu 5. Chương trình sau có lỗi ở dòng nào?

n = int(input("Nhập số tự nhiên n: "))
s = ""
for i in range(10):
    s = s + i
  • A. Dòng 1.
  • B. Dòng 2.
  • C. Dòng 3.
  • D. Dòng 4.

Đáp án: D. Dòng 4 cộng một chuỗi s với số nguyên i, Python không cho phép nên báo TypeError khi chạy đến dòng này. Cần đổi thành s = s + str(i).

Lỗi hay gặp: nhiều bạn gọi đây là “lỗi cú pháp”. Thật ra dòng 4 viết đúng ngữ pháp; lỗi nằm ở kiểu dữ liệu và chỉ lộ ra khi chạy. Ngoài ra biến n nhập vào nhưng chưa được dùng, nên vòng lặp luôn chạy 10 lần (đây là điểm đáng xem lại, dù đề chỉ hỏi dòng gây lỗi).

Câu 6. Điền vào chỗ trống: “Các công cụ kiểm thử có mục đích … của chương trình và …, … các lỗi có thể phát sinh trong tương lai.”

  • A. tìm ra lỗi, phòng ngừa, ngăn chặn.
  • B. tìm ra lỗi, phòng ngừa, xử lí.
  • C. phòng ngừa, ngăn chặn, xử lí lỗi.
  • D. xử lí lỗi, phòng ngừa, ngăn chặn.

Đáp án: A. Kiểm thử trước hết là tìm ra lỗi, rồi mới phòng ngừa và ngăn chặn lỗi về sau. Việc “xử lí, sửa lỗi” thuộc về gỡ lỗi nên không đứng trong định nghĩa của kiểm thử.

Câu 7. Đâu không phải công cụ để kiểm thử chương trình?

  • A. Công cụ in biến trung gian.
  • B. Công cụ sinh các bộ dữ liệu test.
  • C. Công cụ thống kê dữ liệu.
  • D. Công cụ điểm dừng trong phần mềm soạn thảo lập trình.

Đáp án: C. A, B, D đều là công cụ giúp phát hiện và khoanh vùng lỗi. Thống kê dữ liệu phục vụ phân tích số liệu, không phải để kiểm thử chương trình.

Câu 8. Phát biểu nào chưa chính xác về kiểm thử chương trình?

  • A. Hiện nay có rất ít phương pháp và công cụ để kiểm thử chương trình.
  • B. Chương trình cần được thử với một số bộ test gồm đầu vào tiêu biểu và kết quả đầu ra biết trước.
  • C. Các bộ test phụ thuộc vào những tiêu chí khác nhau.
  • D. Bộ test nên có cả các bộ test sinh ngẫu nhiên.

Đáp án: A. Thực tế có rất nhiều phương pháp và công cụ kiểm thử. Ba phát biểu còn lại đều đúng. Với câu hỏi “chưa chính xác”, hãy tìm phát biểu mang tính tuyệt đối hoặc trái với thực tế như từ “ít” ở đây.

Câu 9. Phát biểu nào đúng nhất về các bộ dữ liệu test?

  • A. Các bộ test có thể có đầu vào theo các tiêu chí khác nhau.
  • B. Các bộ test chỉ có đầu vào theo một số tiêu chí nhất định.
  • C. Các bộ test có thể có đầu vào theo các tiêu chí khác nhau như độ lớn, tính đa dạng của dữ liệu.
  • D. Các bộ test bắt buộc phải theo tiêu chí về độ lớn và tính đa dạng.

Đáp án: C. C vừa đúng vừa đầy đủ nhất vì nêu ví dụ tiêu chí cụ thể. A cũng đúng nhưng chung chung hơn. B và D sai vì “chỉ” và “bắt buộc” làm hẹp vấn đề.

Câu 10. Có bao nhiêu phát biểu đúng?

  1. Nên có nhiều bộ test khi kiểm thử.
  2. Sinh ngẫu nhiên dữ liệu đầu vào trong miền xác định giúp tăng khả năng tìm ra lỗi.
  3. Thực tế ít khi phát sinh lỗi ở vùng biên hoặc lân cận biên.
  4. Không thể dùng lệnh print() để in biến trung gian.
  • A. 2.
  • B. 3.
  • C. 1.
  • D. 4.

Đáp án: A. Phát biểu (1) và (2) đúng. Phát biểu (3) sai vì lỗi lại thường xảy ra ở vùng biên. Phát biểu (4) sai vì print() chính là cách đơn giản nhất để theo dõi biến trung gian. Có 2 phát biểu đúng.

Phần 2. 10 câu mở rộng, vận dụng

Câu 11. Mục đích chính của kiểm thử chương trình là gì?

  • A. Làm cho chương trình chạy nhanh hơn.
  • B. Phát hiện lỗi bằng cách chạy chương trình với các bộ dữ liệu test.
  • C. Giảm dung lượng mã nguồn.
  • D. Tự động bổ sung chức năng mới.

Đáp án: B. Kiểm thử không làm chương trình nhanh hơn hay ngắn hơn, cũng không thêm chức năng. Nó chỉ cho biết chương trình đang đúng hay sai so với kết quả mong đợi.

Câu 12. Gỡ lỗi chương trình là gì?

  • A. Chạy chương trình với nhiều bộ test.
  • B. Viết lại toàn bộ chương trình từ đầu.
  • C. Xác định vị trí, nguyên nhân gây lỗi và sửa lỗi đó.
  • D. Xoá các dòng chú thích trong mã nguồn.

Đáp án: C. A là kiểm thử. B quá lãng phí và không phải bản chất của gỡ lỗi. D không liên quan, vì chú thích không ảnh hưởng đến kết quả chạy.

Câu 13. Đoạn chương trình dưới đây dùng để tính tổng 1 + 2 + … + n. Khi nhập n = 4, chương trình in ra 6 (đúng phải là 10). Đây là loại lỗi nào?

n = int(input())
s = 0
for i in range(1, n):
    s = s + i
print(s)
  • A. Lỗi cú pháp.
  • B. Lỗi ngoại lệ ZeroDivisionError.
  • C. Lỗi NameError.
  • D. Lỗi logic: chạy không báo lỗi nhưng kết quả sai.

Đáp án: D. range(1, n) chỉ chạy i từ 1 đến n − 1 nên thiếu số n. Với n = 4 ta có 1 + 2 + 3 = 6. Sửa thành range(1, n + 1). Chương trình không hề báo lỗi, nên chỉ phát hiện được nhờ so sánh với kết quả dự kiến.

Câu 14. Một chương trình nhận số nguyên n với 1 ≤ n ≤ 100. Bộ test nào kiểm tra tốt nhất vùng biên?

  • A. 50, 51, 52.
  • B. 1, 100 (và có thể thêm 0, 101 để xem chương trình xử lí giá trị ngoài miền).
  • C. 2, 3, 4.
  • D. 30, 60, 90.

Đáp án: B. Giá trị biên của miền 1…100 là 1 và 100; các giá trị ngay sát ngoài biên là 0 và 101. Những phương án còn lại chỉ nằm “giữa” miền, ít khi làm lộ lỗi kiểu < thay cho <=.

Câu 15. Điểm dừng (breakpoint) trong phần mềm soạn thảo dùng để làm gì?

  • A. Tạm dừng chương trình tại dòng chỉ định để xem giá trị các biến, từ đó chạy tiếp từng bước.
  • B. Kết thúc hẳn chương trình.
  • C. Tự động sửa lỗi cú pháp.
  • D. Sinh bộ test ngẫu nhiên.

Đáp án: A. Điểm dừng cho em “đóng băng” chương trình đúng chỗ nghi ngờ để quan sát. B, C, D đều không phải chức năng của nó; D là của công cụ sinh test.

Câu 16. Việc chèn thêm lệnh print() để in biến trung gian nhằm mục đích gì?

  • A. Làm chương trình chạy nhanh hơn.
  • B. Thay thế câu lệnh nhập dữ liệu.
  • C. Theo dõi giá trị các biến ở từng bước, so với dự kiến để khoanh vùng lỗi.
  • D. Xoá các biến không cần dùng.

Đáp án: C. Nếu biến bắt đầu lệch khỏi giá trị em tính tay ở bước nào, lỗi nằm ngay quanh bước đó. Cách này đơn giản và rất hữu ích với lỗi logic. Nhớ xoá các lệnh in tạm sau khi gỡ lỗi xong.

Câu 17. Khi chạy x = int("abc"), Python báo ValueError. Cách xử lí hợp lí là gì?

  • A. Kiểm tra dữ liệu nhập vào có đúng dạng số không trước khi chuyển kiểu (hoặc dùng cấu trúc bắt ngoại lệ).
  • B. Kiểm tra lại số chia.
  • C. Kiểm tra chỉ số của danh sách.
  • D. Đổi tên biến x.

Đáp án: A. Chuỗi “abc” không thể đổi sang số nguyên. Việc cần làm là kiểm soát dữ liệu đầu vào. B và C là cách xử lí cho ZeroDivisionError và IndexError; D không ảnh hưởng gì.

Câu 18. Phát biểu nào sau đây đúng?

  • A. Chương trình chạy đúng với một bộ test thì chắc chắn đúng với mọi dữ liệu.
  • B. Chương trình chạy đúng với nhiều bộ test đa dạng chỉ làm tăng độ tin cậy, chưa chứng minh được chương trình hết lỗi.
  • C. Chỉ cần dùng dữ liệu ngẫu nhiên, không cần thử các giá trị biên.
  • D. Lỗi cú pháp chỉ phát hiện được nhờ bộ test.

Đáp án: B. Kiểm thử chỉ có thể cho thấy lỗi có tồn tại, không bảo đảm lỗi không tồn tại. A sai vì một test là quá ít. C sai vì biên là nơi hay lỗi. D sai vì lỗi cú pháp được trình thông dịch báo ngay.

Câu 19. Sau khi đã sửa một lỗi trong chương trình, việc nên làm tiếp theo là gì?

  • A. Xoá toàn bộ bộ test cũ.
  • B. Nộp luôn mà không chạy lại.
  • C. Chuyển sang ngôn ngữ lập trình khác.
  • D. Chạy lại với các bộ test (kể cả bộ cũ) để chắc chắn lỗi đã hết và không sinh lỗi mới.

Đáp án: D. Sửa chỗ này có thể làm hỏng chỗ khác, nên phải chạy lại toàn bộ bộ test. Quy trình gọn là: chạy test → phát hiện sai khác → khoanh vùng → sửa → chạy lại.

Câu 20. Lệnh print(tong) được chạy khi biến tong chưa được gán giá trị. Python báo lỗi gì?

  • A. NameError.
  • B. ZeroDivisionError.
  • C. IndexError.
  • D. TypeError.

Đáp án: A. Tên tong chưa được định nghĩa nên Python báo NameError. Lỗi này hay gặp khi gõ sai tên biến (ví dụ tong và Tong là hai tên khác nhau). Em có thể xem thêm cách biến tồn tại trong từng khối ở Trắc nghiệm Bài 28: Phạm vi của biến.

Mẹo làm bài và lỗi sai thường gặp

  • Đọc tên lỗi để biết cần kiểm tra gì: ZeroDivision → số chia; Index → chỉ số; Type → kiểu dữ liệu; Name → tên biến; Value → giá trị nhập vào.
  • Câu “không phải/chưa chính xác”: đánh dấu từ tuyệt đối như “chỉ”, “ít”, “bắt buộc”, “không thể” rồi đối chiếu với kiến thức.
  • Câu có đoạn mã: chạy tay từng dòng với một giá trị nhỏ, đừng đoán.
  • Nhầm kiểm thử với gỡ lỗi: kiểm thử là tìm lỗi, gỡ lỗi là sửa lỗi.

Tài liệu cùng bài để ôn tiếp

Câu hỏi thường gặp

Kiểm thử và gỡ lỗi chương trình khác nhau thế nào?

Kiểm thử là chạy chương trình với các bộ dữ liệu test để phát hiện lỗi. Gỡ lỗi là xác định vị trí, nguyên nhân gây lỗi rồi sửa lỗi đó. Kiểm thử đi trước, gỡ lỗi đi sau.

Vì sao phải thử các giá trị biên khi kiểm thử?

Vì lỗi thường xuất hiện ở biên hoặc lân cận biên, ví dụ viết < thay cho <= hay range(1, n) thay vì range(1, n + 1). Chỉ thử dữ liệu nằm giữa miền dễ bỏ sót những lỗi này.

Lỗi ZeroDivisionError và IndexError xử lí thế nào?

ZeroDivisionError do chia cho 0, cần kiểm tra số chia. IndexError do chỉ số vượt giới hạn danh sách, cần kiểm tra chỉ số truy cập phần tử.

Chương trình chạy đúng với vài bộ test thì có chắc không còn lỗi không?

Không chắc. Kiểm thử chỉ chứng minh được lỗi có tồn tại, còn chạy đúng nhiều bộ test đa dạng chỉ làm tăng độ tin cậy của chương trình.