🧠 Tư duy lập trình
Câu lệnh nếu–thì: máy móc quanh ta ra quyết định như thế nào
Trong bài
Câu lệnh nếu–thì là cách một chương trình chọn việc để làm tuỳ theo tình hình: nếu điều kiện đúng thì làm việc này, không thì làm việc khác. Cửa tự động ở siêu thị, vòi nước cảm ứng, đèn hành lang tự sáng khi có người đi qua đều chạy theo những quy tắc như thế. Hiểu nếu–thì là hiểu vì sao máy móc có vẻ "biết suy nghĩ", dù thật ra chúng chỉ kiểm tra một câu đúng hay sai.
Một câu lệnh nếu–thì gồm những gì
Thử đọc câu mẹ dặn trước khi đi học: "Nếu trời mưa thì mang áo mưa, không thì mang mũ." Câu này có ba phần:
- Điều kiện: "trời mưa". Đây là một câu chỉ có thể đúng hoặc sai, không có "hơi hơi".
- Việc làm khi đúng: mang áo mưa.
- Việc làm khi sai: mang mũ.
Phần "không thì" có thể bỏ. "Nếu tay bẩn thì rửa tay" chỉ có một nhánh: tay sạch thì cứ thế đi tiếp, không phải làm gì thêm.
Điểm mấu chốt là điều kiện phải trả lời được bằng đúng hoặc sai. "Nếu trời đẹp" là điều kiện kém, vì mỗi người hiểu "đẹp" một kiểu. "Nếu trời không mưa và nhiệt độ dưới 33 độ" thì ai, hay máy nào, cũng kiểm tra được. Biến một câu mơ hồ thành câu kiểm được là việc người lập trình làm hằng ngày.
Máy móc quanh ta ra quyết định thế nào
| Thiết bị | Nếu | Thì | Không thì |
|---|---|---|---|
| Vòi nước cảm ứng | Cảm biến thấy có tay bên dưới | Mở van cho nước chảy | Đóng van |
| Cửa tự động | Có người bước vào vùng cảm biến | Mở cửa | Chờ vài giây rồi đóng |
| Đèn hành lang | Có chuyển động và trời đang tối | Bật đèn một lúc | Để đèn tắt |
| Máy giặt | Cửa lồng giặt đã đóng chặt | Cho phép bắt đầu giặt | Báo lỗi, không chạy |
| Nồi cơm điện | Đáy nồi nóng lên quá mức nước sôi (tức là đã cạn nước) | Chuyển sang giữ ấm | Tiếp tục nấu |
Không chiếc máy nào ở trên "hiểu" tình huống. Nó chỉ đọc một con số từ cảm biến, so với một ngưỡng, rồi chọn nhánh. Nồi cơm điện là ví dụ hay: khi còn nước, đáy nồi khó nóng hơn nhiệt độ sôi của nước; khi nước đã ngấm hết vào gạo, nhiệt độ đáy nồi vọt lên, và bộ phận cảm nhiệt chuyển nồi sang chế độ ủ. Một quy tắc nếu–thì đơn giản nhưng nấu chín cơm cho hàng triệu gia đình mỗi ngày.
Vẽ quyết định thành sơ đồ khối
Người lập trình hay vẽ câu lệnh nếu–thì bằng sơ đồ khối, một kiểu hình vẽ có từ trước khi có máy tính hiện đại và vẫn được dạy trong sách Tin học phổ thông. Quy ước thường dùng:
- Hình bầu dục: bắt đầu hoặc kết thúc.
- Hình chữ nhật: một việc phải làm.
- Hình thoi: một câu hỏi đúng–sai. Từ hình thoi có hai mũi tên đi ra, một ghi "Đúng", một ghi "Sai".
- Mũi tên: chỉ thứ tự đi tiếp.
Thử hình dung sơ đồ cho việc ra khỏi nhà: Bắt đầu → hình thoi "Trời có mưa không?" → nhánh Đúng đi tới "Mang áo mưa", nhánh Sai đi tới "Mang mũ" → cả hai nhánh gặp lại ở "Khoá cửa" → Kết thúc. Nhìn sơ đồ, bạn thấy ngay chỗ rẽ và thấy hai con đường nhập lại ở đâu.
Ghép điều kiện bằng VÀ, HOẶC, KHÔNG
Nhiều quyết định cần xét hai điều cùng lúc. Có ba chữ nối dùng để ghép điều kiện, và chúng có nghĩa chính xác hơn trong lời nói hằng ngày:
- VÀ: chỉ đúng khi cả hai vế đều đúng. "Được xuống hồ bơi nếu đã khởi động VÀ có người lớn trông." Thiếu một trong hai là không được.
- HOẶC: đúng khi ít nhất một vế đúng. "Được nghỉ học nếu trường thông báo nghỉ HOẶC con bị ốm." Một vế đúng là đủ, cả hai đều đúng cũng vẫn đúng.
- KHÔNG: đảo ngược điều kiện. "Nếu KHÔNG có ai ở nhà thì khoá cửa ngoài."
Bảng dưới đây cho thấy cả bốn khả năng với điều kiện "đã khởi động" và "có người lớn trông":
| Đã khởi động | Có người lớn trông | VÀ (được xuống bơi?) | HOẶC |
|---|---|---|---|
| Đúng | Đúng | Đúng | Đúng |
| Đúng | Sai | Sai | Đúng |
| Sai | Đúng | Sai | Đúng |
| Sai | Sai | Sai | Sai |
Cách tính với đúng–sai như vậy được nhà toán học người Anh George Boole trình bày một cách hệ thống trong cuốn sách in năm 1854. Gần một thế kỷ sau, các kỹ sư nhận ra có thể làm những phép VÀ, HOẶC, KHÔNG bằng mạch điện, và đó là nền móng của mọi con chip trong máy tính ngày nay.
Nhiều nhánh: phân loại rác
Khi có nhiều hơn hai lựa chọn, ta nối nhiều câu nếu–thì liên tiếp. Ví dụ quy tắc phân loại rác ở một lớp học:
- Nếu là vỏ trái cây, thức ăn thừa thì bỏ vào thùng rác hữu cơ.
- Không thì, nếu là giấy, bìa, chai nhựa, lon sạch thì bỏ vào thùng tái chế.
- Không thì bỏ vào thùng rác còn lại.
Máy kiểm từ trên xuống, gặp điều kiện đúng đầu tiên thì làm và dừng, không xét các dòng sau. Vì thế thứ tự rất quan trọng. Thử một quy tắc chọn áo: "Nếu trên 20 độ thì mặc áo phông; không thì, nếu trên 30 độ thì mặc áo ba lỗ." Hôm 35 độ, dòng đầu đã đúng nên máy chọn áo phông, và dòng "áo ba lỗ" không bao giờ được dùng tới. Phải đặt điều kiện hẹp hơn (trên 30) lên trước.
Ba lỗi hay gặp với nếu–thì
Sót trường hợp
"Nếu trời mưa thì mang áo mưa. Nếu trời nắng thì mang mũ." Còn hôm trời âm u, không mưa không nắng? Không dòng nào khớp, người làm theo đi tay không. Thói quen tốt là luôn có nhánh "không thì" cho mọi thứ còn lại.
Quên ranh giới
"Dưới 12 tuổi mua vé trẻ em. Trên 12 tuổi mua vé người lớn." Bạn vừa tròn 12 tuổi thì mua vé nào? Người viết quy tắc thường nghĩ tới hai đầu mà quên điểm chính giữa. Các bảng giá vé thật hay ghi "từ 12 tuổi trở lên" để không ai phải đoán.
Nhầm VÀ với HOẶC
Trong lời nói, "anh chị em và bạn bè được vào" thật ra nghĩa là ai thuộc một trong hai nhóm đều được vào, tức là HOẶC. Nếu viết đúng chữ "VÀ" cho máy, máy sẽ chỉ cho vào người vừa là anh chị em vừa là bạn bè. Tiếng nói hằng ngày dễ dãi, máy thì không.
Thử làm: đoán đồ vật bằng câu hỏi có–không
Hoạt động cho 2–6 người, khoảng 20 phút, giúp thấy một chuỗi nếu–thì có thể phân loại cả đống đồ vật.
- Gom tám món đồ trong nhà: một quả cam, một chiếc thìa, một cục tẩy, một cuốn sách, một chiếc lá, một viên bi, một cái cốc nhựa, một chiếc tất.
- Cả nhóm cùng nghĩ một câu hỏi có–không chia tám món thành hai nhóm, ví dụ "Có ăn được không?" hoặc "Có nặng hơn cuốn sách không?". Đặt hai nhóm sang hai bên.
- Với mỗi nhóm, nghĩ tiếp một câu hỏi để chia đôi lần nữa. Làm cho tới khi mỗi món đứng riêng.
- Vẽ lại các câu hỏi thành sơ đồ cây trên giấy: mỗi câu hỏi là một hình thoi, mỗi món đồ là một ô ở cuối cành.
- Kiểm tra: một người nghĩ thầm một món, người khác đi theo sơ đồ và hỏi đúng các câu trên cây. Có đoán trúng không?
Thử thách thêm: với tám món, cần ít nhất bao nhiêu câu hỏi để luôn tìm ra? Nếu mỗi câu chia đều được hai nửa thì chỉ cần ba câu, vì 2 × 2 × 2 = 8. Ý tưởng chia đôi này được bàn kỹ hơn trong bài về tìm kiếm bằng cách chia đôi.
Câu hỏi thường gặp
Câu lệnh điều kiện là gì?
Câu lệnh điều kiện là câu lệnh cho chương trình chọn làm việc này hay việc khác tuỳ theo một điều kiện đúng hay sai. Dạng quen thuộc nhất là "nếu… thì… không thì…". Nhờ câu lệnh điều kiện mà chương trình phản ứng khác nhau với những tình huống khác nhau.
Ví dụ câu lệnh nếu–thì trong đời sống?
Vòi nước cảm ứng mở khi có tay bên dưới, cửa tự động mở khi có người đến gần, máy giặt chỉ chạy khi cửa đã đóng, nồi cơm điện chuyển sang giữ ấm khi đã cạn nước. Lời dặn "nếu mưa thì mang áo mưa" cũng là một câu nếu–thì.
VÀ và HOẶC trong lập trình khác nhau thế nào?
VÀ chỉ cho kết quả đúng khi cả hai điều kiện cùng đúng. HOẶC cho kết quả đúng khi ít nhất một điều kiện đúng. Trong lời nói thường ngày hai chữ này hay bị dùng lẫn, nên khi viết quy tắc cho máy cần nghĩ kỹ mình định nói gì.
Sơ đồ khối dùng hình gì cho câu lệnh điều kiện?
Trong sơ đồ khối, câu lệnh điều kiện thường được vẽ bằng hình thoi, bên trong ghi câu hỏi đúng–sai. Từ hình thoi có hai mũi tên đi ra, một cho trường hợp đúng và một cho trường hợp sai.
Vì sao thứ tự các câu nếu–thì lại quan trọng?
Khi có nhiều câu nếu–thì nối nhau, máy thường dừng ở điều kiện đúng đầu tiên. Nếu đặt điều kiện rộng lên trước, các điều kiện hẹp phía sau sẽ không bao giờ được xét tới. Vì vậy điều kiện hẹp, đặc biệt nên đặt lên trước.
câu lệnh điều kiệnnếu thìsơ đồ khốiVÀ HOẶC KHÔNGGeorge Boolecảm biếnphân loại ráclogic đúng saitư duy máy tính