8. Phép chia dư
8.1 Dùng phép chia dư để lặp
Ở phần trước bạn đã biết cách sử dụng lệnh change by để tăng một biến liên tục lên 1 đơn vị, khi đạt đến một giá trị bất kỳ, sử dụng lệnh set to để đặt lại giá trị của biến.
Có một cách khác để lặp lại một việc liên tục (ví dụ tăng giá trị một biến) là dùng phép chia dư (modulo hoặc mod). Phép chia dư sẽ trả về phần dư của phép chia.
Ví dụ:
5 chia 6: được 0, dư 5
6 chia 6: được 1, dư 0
7 chia 6: được 1, dư 1
8 chia 6: được 1 dư 2
Bạn hãy kiểm tra kết quả ở trên bằng phép toán mod.
Ví dụ:
Ví dụ, đoạn mã sau sẽ tăng biến đếm lên một đơn vị mỗi khi bạn bấm phím space. Biến đếm sẽ tăng từ 0, 1, 2, 3, 4 và 5; sau đó lại bắt đầu lại từ 0 tới 5.
Để bộ đếm bắt đầu từ 1 thay vì 0, bạn thay đổi nội dung khối lập trình như sau:
Đoạn mã trên sẽ lặp lại và xuất các số lần lượt là 1, 2, 3, 4.
Bài tập 8a. Tạo 3 bộ trang phục (costumes) cho một nhân vật, đặt tên lần lượt là bo1, bo2, bo3. Mỗi khi người dùng bấm phím mũi tên xuống (down arrow), nhân vật sẽ thay đổi bộ trang phục mới, thứ tự thay đổi là bo1, bo2, bo3; tiếp tục lặp lại nếu người dùng tiếp tục bấm. Yêu cầu có sử dụng phép chia dư.
Bài tập 3.4b. Giả lập đồng hồ gồm ô hiển thị [giờ:phút:giây]. Khi bấm nút chạy, đồng hồ sẽ chạy tự động, từ 00:00:00. Yêu cầu có sử dụng phép chia dư.
-----
Gợi ý làm bài tập:
Bài tập 8a. Tạo 3 bộ trang phục (costumes) cho một nhân vật, đặt tên lần lượt là bo1, bo2, bo3. Mỗi khi người dùng bấm phím mũi tên xuống (down arrow), nhân vật sẽ thay đổi bộ trang phục mới, thứ tự thay đổi là bo1, bo2, bo3; tiếp tục lặp lại nếu người dùng tiếp tục bấm. Yêu cầu có sử dụng phép chia dư.
Bước 1: Chuẩn bị nhân vật và trang phục
Mở Scratch và chọn một nhân vật. Ví dụ, bạn có thể chọn nhân vật Cat (Mèo).
Chuyển sang thẻ Costumes (trang phục).
Tải lên hoặc vẽ thêm 2 trang phục khác cho nhân vật để có tổng cộng 3 trang phục. Đặt tên các trang phục lần lượt là bo1, bo2, và bo3 để dễ theo dõi.
Bước 2: Lập trình với phép chia dư
Chuyển sang thẻ Code và tạo một biến mới có tên là ThuTuTrangPhuc (thứ tự trang phục).
Thêm khối lệnh when down arrow key pressed (khi bấm mũi tên xuống) từ danh mục Events (sự kiện).
Tiếp theo, bạn sẽ sử dụng một công thức có phép chia dư để cập nhật giá trị của biến ThuTuTrangPhuc.
- Thêm khối lệnh Set ThuTuTrangPhuc to.
- Trong ô giá trị, hãy sử dụng phép toán chia dư (mod).
- Lấy giá trị của biến hiện tại ThuTuTrangPhuc chia dư cho 3 (vì bạn có 3 trang phục). Công thức sẽ là ThuTuTrangPhuc mod 3.
- Cuối cùng, để kết quả luôn là 1, 2, 3 (thay vì 0, 1, 2), hãy cộng thêm 1 vào kết quả. Công thức hoàn chỉnh là (ThuTuTrangPhuc mod 3) + 1.
Sau khi đã tính được giá trị mới, thêm khối lệnh switch costume to [ThuTuTrangPhuc] (thay trang phục thành ThuTuTrangPhuc).
Bài tập 8b. Giả lập đồng hồ, gồm ô hiển thị [giờ:phút:giây]. Khi chạy chương trình, đồng hồ sẽ chạy tự động, từ 00:00:00. Yêu cầu có sử dụng phép chia dư.
Mục tiêu: Tạo một đồng hồ hiển thị giờ, phút, giây và chạy tự động.
Các bước thực hiện:
Tạo các biến:
- Tạo ba biến có tên là giay, phut, và gio.
- Bạn có thể chọn hiển thị các biến này trên màn hình kết quả.
Lập trình cho khối lệnh bắt đầu:
- Sử dụng khối when clicked để khởi động đồng hồ.
- Đặt giá trị ban đầu cho tất cả các biến về 0. Dùng lệnh set [tên biến] to [0], thay tên biến lần lượt là gio, phut, giay
- Thêm khối forever để đồng hồ chạy liên tục.
Lập trình hiển thị giây:
- Trong vòng lặp forever, sử dụng khối wait 1 seconds (đợi 1 giây).
- Sau đó, sử dụng khối change giay by 1 (thay đổi giây một lượng là 1).
- Bạn chạy thử xem số giây đã chạy chưa, nếu chạy rồi là được, nếu không thì kiểm tra lại đoạn mã xem làm đúng chưa.
- Tiếp theo, để đồng hồ giây quay lại 0 khi đạt đến 60, bạn sẽ sử dụng phép chia dư:
+ Sử dụng khối set giay to (đặt giây thành).
+ Trong ô giá trị, sử dụng công thức giay mod 60. Công thức này sẽ trả về số dư của phép chia giây cho 60, đảm bảo giá trị luôn nằm trong khoảng từ 0 đến 59.
Lập trình hiển thị phút và giờ:
+ Sử dụng khối if…then… (nếu...thì…) để kiểm tra nếu giây đã trở về 0. If giay = 0 then.
+ Nếu giây bằng 0, điều đó có nghĩa là đã trôi qua 60 giây, vậy bạn cần tăng biến phút lên 1. Sử dụng khối change phut by 1 (thay đổi phút một lượng là 1).
+ Lặp lại logic tương tự cho biến phut và gio. Sử dụng phép chia dư phut mod 60 để phút quay lại 0 khi đạt 60.
+ Tiếp theo, sử dụng một khối if...then... khác để kiểm tra nếu phút đã quay lại 0, thì tăng biến gio lên 1.
+ Sử dụng phép chia dư gio mod 24 để giờ quay lại 0 khi đạt 24.
8.1 Use modulo to wrap
Another way to wrap around is the function modulo or mod which returns the remainder of a division.
This is shorter:
The counter i cycles through the 6 values 0, 1, 2, 3, 4, 5.
To start with 1 instead of 0 we can modify the expression to this.
The counter i cycles now through the 4 values 1, 2, 3, 4.
8.2 Lặp theo chiều ngược
Ở phần trên bạn đã biết điều khiển vòng lặp, bằng việc tăng biến đếm mỗi lần lên 1 đơn vị.
Ở phần này, bạn sẽ tạo ra vòng lặp bằng, bằng cách giảm biến đếm mỗi lần 1 đơn vị.
Đây là khối mã:
Khối mã trên sẽ giảm biến đếm mỗi khi bạn bấm phím space.
Giá trị của i sẽ lần lượt là 3,2,1, 0. Rồi lặp lại liên tục.
Bài tập 8c. Làm đồng hồ giống Bài tập 8b, tuy nhiên nó là đồng hồ đếm ngược. Cụ thể, đồng hồ sẽ bắt đầu chạy ở giờ [24:00:00], và sẽ dừng lại khi chạy ngược về [00:00:00]
8.2 Cycle the other way
We can also decrement and cycle back when reaching 0.