Giải Tin Học 8 trang 89

Lời giải chi tiết SGK Lớp 8 · Môn Tin Học · Trang 89–90

Lưu ý nhỏ trước khi vào bài: hai trang trong ảnh được đánh số 88 và 89 (không phải 89 – 90). Mình giải đúng theo nội dung hiển thị nhé.

Đây là phần cuối của Bài 15 – "Gỡ lỗi" (chủ đề lập trình trực quan với Scratch), gồm phần lý thuyết về phát hiện và sửa lỗi lôgic, cùng hai hoạt động thực hành gỡ lỗi.

Tóm tắt lý thuyết (trang 88)

a) Phát hiện lỗi lôgic – có hai cách thường dùng:

  • Cách 1 – Phân tích lôgic: tập trung vào các khối lệnh liên quan đến lỗi, so sánh với kịch bản để xem chúng có thực hiện đúng yêu cầu không. Bắt đầu từ những khối lệnh chạy sai kịch bản, suy luận để tìm vị trí lỗi (hạn chế việc dò từng dòng lệnh).
  • Cách 2 – Chạy thử với dữ liệu mẫu: cho hiện giá trị các biến (đánh dấu ☑ trong nhóm "Các biến số"), chèn lệnh "đợi … giây" để dừng tạm thời mà quan sát. Nhờ đó vừa chạy từng bước, vừa theo dõi biến và so sánh với giá trị tính tay để biết câu lệnh nào gây lỗi.

b) Sửa lỗi: khi đã biết vị trí và cách câu lệnh tạo ra lỗi, ta đưa ra cách sửa phù hợp (ví dụ bổ sung lệnh "thay đổi số lần đoán một lượng 1" vào đúng chỗ).

Ghi nhớ:

  1. Tập trung vào khối lệnh trực tiếp gây lỗi và các khối liên quan lôgic theo cấu trúc điều khiển.
  2. Chạy từng bước, theo dõi sự thay đổi của biến và đầu ra, đối chiếu với kết quả tính thủ công.

Bài 1: Gỡ lỗi chương trình kiểm tra số chẵn/lẻ (Hình 15.3)

Đề: Gỡ lỗi đoạn chương trình xác định một số $n$ nhập từ bàn phím là số chẵn hay số lẻ.

Chương trình trong Hình 15.3:

Khi bấm vào (cờ xanh)
hỏi "n =" và đợi
nếu < n chia lấy dư 2 = 0 > thì
    nói (kết hợp n "là số LẺ") trong 5 giây
nếu không thì
    nói (kết hợp n "là số CHẴN") trong 5 giây
dừng lại tất cả

Phân tích lỗi:

  • Phép toán $n \bmod 2 = 0$ nghĩa là $n$ chia hết cho 2, tức $n$ là số CHẴN.
  • Nhưng chương trình lại thông báo "là số LẺ" trong nhánh đúng, và "là số CHẴN" trong nhánh "nếu không thì".
  • Đây là lỗi lôgic: hai nhãn "LẺ" và "CHẴN" bị đặt ngược nhau.

Cách sửa: đổi chỗ hai thông báo cho đúng:

nếu < n chia lấy dư 2 = 0 > thì
    nói (kết hợp n "là số CHẴN") trong 5 giây   ← sửa
nếu không thì
    nói (kết hợp n "là số LẺ") trong 5 giây     ← sửa

Kiểm chứng nhanh:

nn chia lấy dư 2Kết luận đúngChương trình sau khi sửa
40Chẵn"4 là số CHẴN" ✔
71Lẻ"7 là số LẺ" ✔

Lưu ý thêm: để $n$ nhận được giá trị người dùng nhập, cần đảm bảo biến $n$ được gán bằng "trả lời" (ví dụ thêm lệnh "đặt n thành trả lời" ngay sau lệnh hỏi). Nếu không, $n$ sẽ giữ giá trị cũ và mọi kết quả đều sai.

Bài 2: Thực hành gỡ lỗi trò chơi Đoán số (Hình 15.4)

Nhiệm vụ: Trong trò chơi Đoán số, không ai được đoán quá 7 lần. Gỡ lỗi chương trình ở Hình 15.4 (đã bổ sung chức năng báo thua nếu vẫn đoán sai ở lần thứ 7).

Chương trình cần gỡ lỗi (đánh số dòng theo sách):

(1)  Khi bấm vào
(2)  đặt [số lần đoán] thành 0
(3)  đặt [số bí mật] thành (lấy ngẫu nhiên từ 1 đến 100)
(4)  hỏi "Hãy cho biết bạn đoán số nào?" và đợi
(5)  thay đổi [số lần đoán] một lượng 1
(6)  lặp lại cho đến khi < (trả lời = số bí mật) hoặc (số lần đoán > 7) >
(7)      nếu < trả lời < số bí mật > thì
(8)          hỏi "Quá thấp!" và đợi
         nếu không thì
(9)          hỏi "Quá cao!" và đợi
(10)     thay đổi [số lần đoán] một lượng 1
(11) nếu < số lần đoán > 7 > thì
(12)     nói "Bạn đã thua!" trong 5 giây
     nếu không thì
(13)     nói "HOAN HÔ!" trong 2 giây
(14)     nói (kết hợp "Số lần đoán:" số lần đoán) trong 5 giây
(15) dừng lại tất cả

Bước 1 – Chạy thử (hai triệu chứng lỗi sách nêu):

  • Khi đoán đúng trong không quá 7 lần: thông báo lại không hiện đúng cụm "Số lần đoán:" như mong muốn → nghi lỗi ở khối hiển thị/đếm.
  • Khi đoán sai: chương trình báo thua nhưng vẫn cho đoán thêm một lần nữa rồi mới kết thúc → lỗi điều kiện dừng (lỗi off-by-one).

Phân tích lỗi điều kiện dừng (lỗi rõ nhất):

Theo dõi biến số lần đoán khi người chơi luôn đoán sai:

BướcHành độngsố lần đoán
(4)(5)đoán lần 1 → +11
vòng lặp 1phản hồi → đoán lần 2, (10) +12
vòng lặp 2đoán lần 33
vòng lặp 6đoán lần 77
kiểm tra (6)7 > 7 là sai → tiếp tục7
vòng lặp 7đoán lần 8 (!), +18
kiểm tra (6)8 > 7 đúng → dừng8

Vậy điều kiện "số lần đoán > 7" làm chương trình cho đoán tới tận lần thứ 8 mới dừng – đúng như triệu chứng "vẫn cho đoán thêm một lần nữa".

Cách sửa:

  • Sửa điều kiện dừng vòng lặp (6): đổi số lần đoán > 7 thành số lần đoán = 7 (hoặc ≥ 7), để dừng ngay sau lần đoán sai thứ 7.
  • Đồng bộ điều kiện báo thua (11): đổi số lần đoán > 7 thành số lần đoán = 7 (hoặc ≥ 7) cho khớp với (6), bảo đảm khi hết 7 lần mà chưa đúng thì thông báo "Bạn đã thua!".

Về triệu chứng cụm "Số lần đoán:" không hiển thị đúng: cần kiểm tra lại đường đi của nhánh thắng (13)(14). Khi điều kiện đếm sai (do lỗi off-by-one ở trên), chương trình có thể rẽ nhầm sang nhánh báo thua thay vì nhánh "HOAN HÔ!" + hiển thị số lần đoán. Sau khi sửa điều kiện đếm cho đúng, nhánh (13)(14) sẽ chạy và cụm "Số lần đoán:" hiện ra như mong muốn.

Phần hướng dẫn chi tiết của hoạt động này (Bước 2 sửa lỗi, kiểm thử lại) được trình bày tiếp ở trang 90 – không có trong ảnh, nên mình giải dựa trên hai triệu chứng mà sách mô tả. Nếu bạn gửi tiếp trang 90, mình sẽ đối chiếu và bổ sung lời giải chính xác theo sách.

Chế độ đọc sách →