Xác định kết quả cần tìm
Trong một hoạt động làm dấu trang giả định, số tiền thu được là $a$ đồng, chi phí vật liệu là $b$ đồng. Chỉ xét hai khoản này; $a$, $b$ là các số nguyên không âm. Cần thông báo tiền dư hoặc tiền thiếu so với chi phí.
Nếu $a\ge b$, tiền dư là $a-b$. Nếu $a<b$, tiền thiếu là $b-a$. Quy ước trường hợp thu bằng chi thông báo “Dư: 0”, nghĩa là vừa đủ chi phí.
Đầu vào gồm $a$ và $b$. Đầu ra là thông báo loại kết quả (dư hay thiếu) cùng số tiền tương ứng. Các giá trị trong bài là dữ liệu giả định để học thuật toán.
Viết rõ hai nhánh trước khi ghép lệnh
Có thể mô tả thuật toán bằng các bước:
1. Nhập số tiền thu $a$ và chi phí $b$.
2. Kiểm tra $a\ge b$.
3. Nếu đúng, tính $a-b$ và thông báo tiền dư; còn không, tính $b-a$ và thông báo tiền thiếu.
4. Kết thúc.
Với $a=150\,000$, $b=110\,000$, điều kiện đúng, tiền dư là $40\,000$ đồng. Với $a=90\,000$, $b=120\,000$, điều kiện sai, tiền thiếu là $30\,000$ đồng. Hai nhánh dùng phép trừ khác thứ tự để số tiền được thông báo không âm.
Bài luyện
Theo nhiệm vụ, đầu ra cần gồm thông tin nào?
Tiền thu là một dữ liệu đầu vào, chưa cho biết chênh lệch.
Tên biến không phải kết quả tính toán cần thông báo.
Kết quả phải cho biết loại chênh lệch và số tiền.
Chi phí là dữ liệu đầu vào, chưa phải kết quả.
Lời giải
Nhiệm vụ yêu cầu xác định tiền dư hoặc tiền thiếu. Chỉ một số tiền thu hay chi chưa thể hiện kết quả; phải thông báo dư/thiếu cùng số tiền đã tính.
Ghép điều kiện và hai nhánh trong Scratch

Ảnh này là chương trình Scratch 3 giao diện tiếng Anh. Sau khi hỏi và lưu hai số, khối **if … then … else** trong Control thể hiện rẽ nhánh dạng đủ.
Scratch có các khối so sánh $>$ và $=$. Trong mẫu, điều kiện $a\ge b$ được ghép thành **(a > b) or (a = b)**; or thuộc nhóm Operators, nghĩa là “hoặc”. Điều kiện này đúng khi thu lớn hơn chi hoặc thu bằng chi.
| Vị trí | Công việc của khối lệnh |
|---|---|
| Phần then | say kết quả ghép chữ “Dư: ” với a − b |
| Phần else | say kết quả ghép chữ “Thiếu: ” với b − a |
Cần đặt cả phép trừ vào ô thứ hai của join, rồi đặt join vào say. Mỗi lần kiểm tra chỉ chạy một phần then hoặc else, đúng như hai nhánh trong thuật toán.
Bài luyện
Với a = 90000, b = 120000, chương trình mẫu thông báo gì?
Thu nhỏ hơn chi nên kết quả phải là thiếu.
Đi theo else và tính b − a = 30000.
Nhánh thiếu dùng b − a để số tiền không âm.
210000 là tổng hai khoản, không phải tiền dư.
Lời giải
Vì $90\,000<120\,000$, điều kiện $a>b$ hoặc $a=b$ sai. Phần else tính $b-a=120\,000-90\,000=30\,000$, nên thông báo “Thiếu: 30000”.
Bài luyện
Với a = b = 100000, chương trình mẫu đi theo phần nào?
Điều kiện còn có phần a = b, nên không chỉ xét a > b.
if … then … else chỉ chọn một phần theo kết quả điều kiện.
Chương trình có so sánh a = b trong điều kiện.
Điều kiện có phép hoặc; phần a = b làm toàn điều kiện đúng.
Lời giải
Khi hai số bằng nhau, $a>b$ sai nhưng $a=b$ đúng. Điều kiện nối bằng “hoặc” vì vậy đúng; phần then thông báo “Dư: 0” theo quy ước nhiệm vụ.
Thực hành tạo và kiểm tra chương trình
Dùng Scratch 3 trên máy tính, giao diện tiếng Anh. Có thể bắt đầu từ dự án mới hoặc mở mẫu tính tổng đã lưu và chỉnh thành một bản thu chi riêng.
1. Tạo hai biến a và b trong Variables. Ghép when green flag clicked; hỏi số tiền thu bằng ask … and wait rồi set a to answer; hỏi chi phí rồi set b to answer.
2. Lấy if … then … else trong Control. Trong Operators, lấy or; đưa so sánh a > b vào một ô, a = b vào ô còn lại; đặt toàn bộ điều kiện vào khối if.
3. Trong then, ghép say join “Dư: ” (a − b). Trong else, ghép say join “Thiếu: ” (b − a). Hai khối say phải nằm trong đúng hai phần của khối if.
4. Chạy bằng cờ xanh. Nhập mỗi số dưới dạng chữ số liền nhau, chẳng hạn 150000; không gõ thêm “đồng” hoặc dấu phân cách hàng nghìn. Dùng các cặp thử trong bảng để đối chiếu.
5. Chọn File → Save to your computer để lưu .sb3. Dùng File → Load from your computer mở lại bản đã lưu, rồi thử lại một cặp thu nhỏ hơn chi và một cặp bằng nhau.
| Số tiền thu a | Chi phí b | Thông báo mong đợi |
|---|---|---|
| 150000 | 110000 | Dư: 40000 |
| 90000 | 120000 | Thiếu: 30000 |
| 100000 | 100000 | Dư: 0 |
| 0 | 0 | Dư: 0 |
Nếu thiếu tiền mà kết quả âm, kiểm tra thứ tự phép trừ trong else. Nếu thu bằng chi đi sai nhánh so với quy ước, kiểm tra đã ghép a = b bằng or chưa. Nếu kết quả dùng nhầm số, kiểm tra vị trí set a to answer và set b to answer.
Tệp mẫu ở liên kết dùng để đối chiếu. Kết quả trắc nghiệm trong bài chỉ kiểm việc đọc và hiểu chương trình; sản phẩm thực hành cần được tự chạy với dữ liệu thử rồi lưu lại.
Bài luyện
Muốn phát hiện lỗi ở trường hợp thu bằng chi, cặp thử nào phù hợp nhất?
Hai số bằng nhau, đúng trường hợp cần kiểm tra.
Cặp này chỉ kiểm tra thu lớn hơn chi.
Cặp này chỉ kiểm tra thu nhỏ hơn chi.
Cặp này kiểm tra thu lớn hơn chi, chưa kiểm tra bằng nhau.
Lời giải
Lỗi cần tìm nằm ở việc xử lí $a=b$, nên phải dùng hai giá trị bằng nhau. Cặp 100000 và 100000 phải cho “Dư: 0” theo quy ước của nhiệm vụ.
Bài luyện
Một bản chương trình đã đi đúng vào else nhưng hiện “Thiếu: -30000” khi nhập a = 90000 và b = 120000. Lỗi nào giải thích phù hợp kết quả âm này?
Phép cộng hai số này cho 210000, không cho -30000.
Nếu đảo phép trừ thành a − b sẽ được -30000.
Giá trị b − a đúng là 30000, không phải -30000.
Thêm trường hợp bằng nhau không làm phép trừ đúng trở thành số âm.
Lời giải
Vì chương trình đã vào else, cần xét phép tính ở phần đó. Tiền thiếu phải là $b-a=120\,000-90\,000=30\,000$. Nếu viết ngược $a-b$ sẽ được $-30\,000$.
Bài luyện
Bước nào giúp kiểm tra bản .sb3 đã lưu vẫn thực hiện đúng thuật toán?
Đổi tên không kiểm tra các lệnh hoặc kết quả chạy.
Tệp có dữ liệu chưa chứng minh thuật toán được lưu và chạy đúng.
Có thể đối chiếu kết quả của bản mở lại với kết quả mong đợi.
Biểu tượng tệp không cho biết chương trình có chạy đúng không.
Lời giải
Mở lại tệp bằng Scratch giúp kiểm tra dự án đã lưu được nạp đúng. Chạy với các cặp thử đã biết kết quả còn kiểm tra được các lệnh, nhánh và phép tính của chính bản lưu đó.
Đang học