Tin học 9 Bài 16: Thực hành – Lập chương trình máy tính

Hình 16.1 – Nhập số giờ lao động: a) Lặp điều kiện sau, b) Lặp điều kiện trước, c) Khối lệnh trong Scratch
Mục lục [Ẩn]

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
Hình 16.1 – Nhập số giờ lao động: a) Lặp điều kiện sau, b) Lặp điều kiện trước, c) Khối lệnh trong Scratch
Hình 16.1 – Nhập số giờ lao động: a) Lặp điều kiện sau, b) Lặp điều kiện trước, c) Khối lệnh trong Scratch

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:

  1. Nhập mức lương: Hỏi người dùng và gán giá trị vào biến muc_luong
  2. 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$)
  3. Xử lí – Tính lương: Rẽ nhánh kiểm tra tgian_laodong > 40 hay 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
  4. 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).

Hình 16.2 – Các khối lệnh thành phần của chương trình tính lương (ảnh Scratch)
Hình 16.2 – Các khối lệnh thành phần của chương trình tính lương (ảnh Scratch)

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 = 70 vượ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 = -100 khô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:

  1. Khởi tạo: max ← 0
  2. Nhập giá trị đầu tiên: Hỏi “Nhập một số nguyên dương!” → gán x ← trả lời
  3. Vòng lặp: Lặp cho đến khi x = 0:
    • Nếu x > max thì max ← x
    • Hỏi “Nhập số nguyên dương tiếp theo!” → gán x ← trả lời
  4. Xuất kết quả:
    • Nếu max = 0 thì 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
Hình 16.3 – Các khối lệnh thành phần của chương trình tìm giá trị lớn nhất (ảnh Scratch)
Hình 16.3 – Các khối lệnh thành phần của chương trình tìm giá trị lớn nhất (ảnh Scratch)

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ư

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