Chọn đến phần học sinh cần nhanh chóng thông qua mục lục bằng cách click đến phần đó
I. Lý thuyết trọng tâm
Giới thiệu chung
Bài thực hành này gồm 2 nhiệm vụ, mỗi nhiệm vụ là giải một bài toán tin học mà sản phẩm cuối cùng là một chương trình máy tính viết bằng ngôn ngữ lập trình Scratch.
Các ngôn ngữ lập trình đều được trang bị 3 cấu trúc điều khiển cơ bản:
| Cấu trúc | Ý nghĩa | Ví dụ trong Scratch |
|---|---|---|
| Tuần tự | Các lệnh được thực hiện lần lượt theo thứ tự từ trên xuống dưới | Các khối lệnh xếp chồng lên nhau |
| Rẽ nhánh | Kiểm tra điều kiện, thực hiện lệnh khác nhau tùy điều kiện đúng/sai | Khối nếu... thì... nếu không thì... |
| Lặp | Thực hiện lặp đi lặp lại một nhóm lệnh cho đến khi thỏa mãn điều kiện | Khối lặp lại cho đến khi... |
Việc mô tả thuật toán bằng cách chỉ sử dụng 3 cấu trúc này sẽ giúp dễ dàng chuyển thuật toán thành chương trình máy tính.
Ghi nhớ: Chương trình là bản mô tả thuật toán bằng ngôn ngữ mà máy tính có thể “hiểu” và thực hiện.
Nhiệm vụ 1: Tính lương
a) Yêu cầu bài toán
Lập chương trình tính và hiển thị tiền lương của một nhân viên khi biết:
- Mức lương (tiền lương trong một giờ làm việc)
- Số giờ làm việc trong tuần
Quy tắc: Định mức 40 giờ/tuần. Giờ vượt định mức được trả gấp 1,5 lần. Số giờ hợp lệ từ 1 đến 60.
b) Cài đặt thuật toán
Bước 1 – Tạo các biến nhớ:
| Loại biến | Tên biến | Ý nghĩa |
|---|---|---|
| Đầu vào | muc_luong |
Mức lương theo giờ |
tgian_laodong |
Số giờ làm việc trong tuần | |
| Đầu ra | tien_luong |
Tiền lương theo tuần |
| Trung gian | tgian_dmuc |
Số giờ trong định mức |
tgian_vuot |
Số giờ vượt định mức | |
luong_dmuc |
Lương phần định mức | |
luong_vuot |
Lương phần vượt định mức |
Bước 2 – Mô tả lại thuật toán theo ngôn ngữ lập trình:
Vì chương trình là bản mô tả thuật toán theo quy tắc của ngôn ngữ lập trình, nên đôi khi phải hiệu chỉnh cách mô tả để phù hợp với công cụ có sẵn.
Vấn đề cần hiệu chỉnh: Bước nhập tgian_laodong trong thuật toán gốc sử dụng cấu trúc lặp với điều kiện sau (nhập trước, kiểm tra sau). Tuy nhiên, Scratch chỉ hỗ trợ cấu trúc lặp với điều kiện trước (kiểm tra trước, nhập sau). Do đó cần chuyển đổi:
| Lặp điều kiện sau (thuật toán gốc) | Lặp điều kiện trước (Scratch) |
|---|---|
Nhập tgian_laodong → Kiểm tra $1 \leq$ tgian_laodong $\leq 60$ → Nếu sai thì lặp lại |
Nhập tgian_laodong → Kiểm tra điều kiện → Nếu sai thì nhập lại tgian_laodong → Lặp lại |

Bước 3 – Tạo chương trình:
Nhận dạng từng khối lệnh tương ứng với từng phần của sơ đồ khối (đã trình bày ở Bài 15) rồi lắp ghép lại theo đúng thứ tự. Chương trình gồm các phần chính:
- Nhập mức lương: Hỏi người dùng và gán giá trị vào biến
muc_luong - Nhập số giờ lao động: Dùng vòng lặp để đảm bảo giá trị hợp lệ ($1 \leq$
tgian_laodong$\leq 60$) - Xử lí – Tính lương: Rẽ nhánh kiểm tra
tgian_laodong > 40hay không:- Nếu vượt định mức:
tgian_dmuc ← 40,tgian_vuot ← tgian_laodong - 40 - Nếu trong định mức:
tgian_dmuc ← tgian_laodong,tgian_vuot ← 0 - Tính:
luong_dmuc ← tgian_dmuc × muc_luong - Tính:
luong_vuot ← tgian_vuot × muc_luong × 1.5 - Tính:
tien_luong ← luong_dmuc + luong_vuot
- Nếu vượt định mức:
- Xuất kết quả: Hiển thị
tien_luong
Lưu ý: Hệ số 1,5 trong thuật toán phải viết thành 1.5 trong chương trình (dùng dấu chấm thay dấu phẩy để ngăn cách phần nguyên và phần thập phân).

c) Gỡ lỗi
Sau khi cài đặt, cần chạy chương trình với nhiều bộ dữ liệu kiểm thử khác nhau để kiểm tra. Mỗi bộ đại diện cho một tình huống cụ thể:
Bảng 16.1 – Dữ liệu kiểm thử bài toán tính lương:
(Đơn vị tiền: nghìn đồng, đơn vị thời gian: giờ)
| Tình huống | muc_luong | tgian_laodong | tien_luong (đầu ra) | Ghi chú |
|---|---|---|---|---|
| 1 | 100 | 30 | 3000 | Dưới định mức |
| 2 | 100 | 40 | 4000 | Vừa đủ định mức |
| 3 | 100 | 50 | 5500 | Vượt định mức |
| 4 | 100 | 60 | 7000 | Vừa đạt mức tối đa |
| 5 | 100 | 70 | (Yêu cầu nhập lại) | Cần nhập lại tgian_laodong |
| 6 | -100 | 50 | (Yêu cầu nhập lại) | Cần nhập lại muc_luong |
Cách kiểm tra từng tình huống:
- Tình huống 1–4: Nhập đầu vào → chương trình phải trả về đúng giá trị đầu ra.
- Tình huống 5: Giá trị
tgian_laodong = 70vượt quá 60 → chương trình phải yêu cầu nhập lại. - Tình huống 6: Giá trị
muc_luong = -100không hợp lí → cần chỉnh sửa chương trình để kiểm tra và yêu cầu nhập lại mức lương khi gặp giá trị âm.
Cách tính kiểm tra nhanh:
- Tình huống 1: $100 \times 30 = 3000$ ✅
- Tình huống 2: $100 \times 40 = 4000$ ✅
- Tình huống 3: $100 \times 40 + 100 \times 10 \times 1.5 = 4000 + 1500 = 5500$ ✅
- Tình huống 4: $100 \times 40 + 100 \times 20 \times 1.5 = 4000 + 3000 = 7000$ ✅
Nhiệm vụ 2: Tìm giá trị lớn nhất
a) Yêu cầu bài toán
Tìm và hiển thị giá trị lớn nhất của một dãy số nguyên dương được nhập từ bàn phím. Số lượng phần tử không biết trước, quá trình nhập kết thúc khi nhập vào số 0.
b) Cài đặt thuật toán
Bước 1 – Tạo các biến:
| Loại biến | Tên biến | Ý nghĩa |
|---|---|---|
| Đầu vào | x |
Số nguyên dương được nhập nhiều lần |
| Đầu ra | max |
Giá trị lớn nhất tìm được |
Bước 2 – Tạo chương trình:
Nhận dạng các khối lệnh tương ứng với sơ đồ khối đã trình bày ở Bài 15 rồi lắp ghép theo đúng thứ tự. Chương trình gồm các phần:
- Khởi tạo:
max ← 0 - Nhập giá trị đầu tiên: Hỏi “Nhập một số nguyên dương!” → gán
x ← trả lời - Vòng lặp: Lặp cho đến khi
x = 0:- Nếu
x > maxthìmax ← x - Hỏi “Nhập số nguyên dương tiếp theo!” → gán
x ← trả lời
- Nếu
- Xuất kết quả:
- Nếu
max = 0thì nói “Không có dữ liệu!” - Ngược lại thì nói “Số lớn nhất là: ” kết hợp
max
- Nếu

c) Gỡ lỗi
Bảng 16.2 – Dữ liệu kiểm thử bài toán tìm số lớn nhất:
| Tình huống | Đầu vào | Đầu ra | Ghi chú |
|---|---|---|---|
| 1 | 1 2 3 0 | 3 | Dãy số tự nhiên tăng |
| 2 | 8 3 10 6 0 | 10 | Dãy số ngẫu nhiên |
| 3 | 12 8 3 0 | 12 | Dãy số giảm |
| 4 | 5 0 | 5 | Dãy chỉ có một giá trị |
| 5 | 0 | Không có dữ liệu! | Dãy không có dữ liệu |
| 6 | 8 -5 3 9 6 0 | 9 | Dãy có số âm |
| 7 | -8 -6 0 | Không có dữ liệu! | Dãy không có số nguyên dương |
| 8 | 7 data 12 0 | 12 | Dãy có dữ liệu dạng chữ |
Phân tích các tình huống đặc biệt:
- Tình huống 1–4: Chương trình phải trả về đúng giá trị đầu ra.
- Tình huống 5: Người dùng nhập 0 ngay → không có số nguyên dương nào → hiển thị “Không có dữ liệu!”
- Tình huống 6, 7: Dãy chứa số âm. Số âm không phải số nguyên dương nên không được tính. Chương trình vẫn phải xử lí đúng (bỏ qua số âm).
- Tình huống 8: Dãy chứa dữ liệu dạng chữ (“data”). Ngôn ngữ lập trình trực quan (Scratch) không phân biệt dữ liệu số hay chữ, nên có thể cho kết quả sai → cần sửa chương trình để xác thực dữ liệu và bỏ qua dữ liệu dạng chữ.
Bài tập Luyện tập và Vận dụng
Luyện tập (SGK trang 86)
Đề bài: Bộ giá trị ở tình huống 6 (Bảng 16.2) cho thấy có những giá trị đầu vào chưa hợp lí. Em hãy chỉnh sửa chương trình để có một chương trình hoạt động tốt.
Hướng dẫn: Thêm điều kiện kiểm tra trong vòng lặp: chỉ so sánh x với max khi x > 0 (bỏ qua số âm và số 0). Cụ thể, thay đổi điều kiện rẽ nhánh từ nếu x > max thành nếu x > 0 và x > max thì max ← x.
Vận dụng (SGK trang 86)
Đề bài: Ngôn ngữ lập trình trực quan không phân biệt dữ liệu đầu vào là dạng số hay dạng chữ. Vì vậy, chương trình cho kết quả sai với tình huống 8. Em hãy sửa chương trình để có thể xác thực dữ liệu và bỏ qua dữ liệu dạng chữ trong bộ dữ liệu đầu vào.
Hướng dẫn: Trước khi xử lí giá trị x, thêm bước kiểm tra xem x có phải là số hay không. Trong Scratch, có thể dùng toán tử so sánh hoặc kiểm tra bằng cách thử chuyển đổi x sang số. Nếu x không phải số thì bỏ qua, tiếp tục nhập giá trị tiếp theo.

Cô Nguyễn An Như
(Người kiểm duyệt, ra đề)
Chức vụ: Trưởng ban biên soạn môn Tin Học THCS
Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ STEM, Ngoại ngữ B1
Kinh nghiệm: 10+ năm kinh nghiệm tại THCS Lý Thường Kiệt

