Chạy được chưa có nghĩa là đúng kịch bản
Một chương trình có thể mở, hỏi và báo kết quả nhưng vẫn **đếm sai lượt**. Kiểm thử là chạy với dữ liệu được chọn để đối chiếu kết quả thực tế với kết quả mong đợi. Với trò đoán số, nên thử **trúng ngay câu hỏi đầu**, **sai rồi mới trúng**, và **đoán sai đến giới hạn**. Lỗi làm chương trình chạy nhưng kết quả không đúng yêu cầu được gọi là **lỗi lôgic** ở mức bài học này. Scratch ghép khối giúp hạn chế lỗi cú pháp; không cần tìm lỗi cú pháp giả tạo để gỡ lỗi.
Bài luyện
Chương trình vẫn chạy nhưng đoán đúng ngay lần đầu lại báo 0 lượt. Đây là dấu hiệu gì?
Chạy được vẫn có thể cho kết quả sai yêu cầu.
Một câu hỏi đã được trả lời nên số lượt mong đợi là 1, không phải 0.
Scratch không có quy tắc bỏ lượt đầu.
Định dạng tệp không giải thích sai lệch bộ đếm.
Lời giải
Đoán đúng ngay lần đầu là một lượt đã diễn ra. Báo 0 nghĩa là chương trình chạy nhưng sai kịch bản đếm; cần kiểm lệnh khởi tạo, tăng và hiển thị biến.
Truy vết cho thấy thiếu lệnh tăng sau câu hỏi đầu
Giả sử biến `so_luot` bắt đầu bằng **0**. Sau câu hỏi đầu, phải tăng thành **1**; sau câu hỏi thứ hai, tăng thành **2**. Nếu chỉ đặt lệnh tăng **trong vòng lặp** sau câu hỏi thứ hai trở đi, chương trình luôn báo ít hơn số lượt thật một đơn vị. Có thể sửa bằng cách đặt thêm lệnh tăng ngay sau câu hỏi đầu, hoặc khởi tạo biến bằng 1 khi chắc chắn câu hỏi đầu luôn được thực hiện. Dự án mẫu dùng cách thứ nhất để thấy rõ mỗi câu hỏi tương ứng một lần tăng.
Bài luyện
Biến đếm bắt đầu bằng 0; đã hỏi và nhận câu trả lời đầu tiên. Trước khi xét đoán đúng, biến đếm phải là bao nhiêu?
Lượt đầu vẫn được tính dù nằm trước vòng lặp.
Một câu hỏi đã nhận câu trả lời nên có một lượt.
Số biến không quyết định số lần đoán.
7 là giới hạn tối đa, không phải giá trị sau lượt đầu.
Lời giải
Đếm số lần đoán theo số câu trả lời đã nhận. Sau câu hỏi đầu tiên, `so_luot` phải bằng 1.
Bài luyện
Bộ đếm bắt đầu 0 và chỉ tăng sau mỗi câu hỏi nằm trong vòng lặp. Nếu người chơi trả lời 3 câu hỏi rồi trúng, chương trình báo mấy lượt?
Có hai câu hỏi trong vòng lặp nên biến đã tăng hai lần.
Sau câu hỏi thứ hai và thứ ba có hai lần tăng.
Lượt đầu không tăng, hai lượt sau tăng nên báo thiếu một: 2.
3 là kết quả đúng mong đợi sau khi sửa lỗi.
Lời giải
Ba câu hỏi gồm một câu trước vòng lặp và hai câu trong vòng lặp. Chỉ hai câu trong vòng lặp làm biến tăng từ 0 lên 2; kết quả sai kịch bản là 2 thay vì 3.
Sửa một nguyên nhân rồi kiểm lại nhiều ca
Khi thấy số lượt sai, hãy nhìn giá trị `so_luot` **sau từng câu hỏi**, đối chiếu vị trí khối **thay đổi `so_luot` thêm 1**. Sửa đúng chỗ thiếu, rồi thử lại trúng lần đầu và sau vài lần. Nếu chỉ đổi lời thông báo thành “cộng thêm 1” mà không sửa biến, điều kiện dừng dùng biến ấy vẫn có thể sai. Kiểm thử cần bao gồm hành vi, không chỉ câu chữ trên màn hình.
Bài luyện
Sau khi phát hiện đếm thiếu lượt đầu, sửa nào xử lí trực tiếp nguyên nhân khi `so_luot` khởi tạo bằng 0?
Mỗi câu hỏi được tính đúng một lần trong biến.
Chữ hiển thị có thể đúng tình cờ nhưng biến vẫn sai.
Xóa điều kiện dừng làm trò không kết thúc đúng.
Số bí mật không quyết định cách đếm.
Lời giải
Nếu biến khởi tạo 0, phải tăng `so_luot` sau câu hỏi đầu tiên. Sau đó mỗi câu hỏi trong vòng lặp cũng tăng một lần, nên biến khớp số lượt thật.
Đang học