Nhập môn Tư duy Lập trình/Tổng kết module — bạn đã có đủ ba cấu trúc
15/31
Bài 15 / 31~8 phútRẽ nhánh & lặpMiễn phí lượt xem

Tổng kết module — bạn đã có đủ ba cấu trúc

Tuần tự, rẽ nhánh, lặp — ba thứ này ghép lại đủ viết mọi chương trình. Nhìn lại sáu bài, và tự chấm trước khi bước sang phần khó nhất của khoá.

TL;DR: Module này thêm hai cấu trúc điều khiển cuối cùng vào cỗ máy bạn dựng ở module trước. Rẽ nhánh chọn đúng một đường trong nhiều đường, và nó dừng ở nhánh đúng đầu tiên chứ không xét hết. Lặp làm lại một việc tới khi điều kiện hết đúng, và nó cần đủ ba phần mới dừng được. Điểm chung của mọi lỗi trong sáu bài: chúng không báo lỗi dòng nào — điều kiện hỏng vẫn chạy, vòng lặp lệch một đơn vị vẫn chạy. Đây là trang để bookmark và tự chấm trước khi sang module sau.

1. Đã đi qua những gì

Bạn mở module với một cỗ máy chỉ biết chạy thẳng từ trên xuống. Bài 1 bẻ được đường thẳng đó lần đầu bằng if, và điều quan trọng nhất học được ở đấy không phải cú pháp mà là chuyện các nhánh không chạy thì không hề được ngó tới.

Bài 2 cho thấy khi ghép nhiều điều kiện, ba cái bẫy kinh điển đều sinh ra từ cùng một gốc: một vế không tự đứng thành câu hỏi. Bài 3 chuyển sang lặp, và dựng ba phần bắt buộc để vòng lặp dừng được. Bài 4 đưa for — thứ lo hộ cả ba phần đó — cùng với biến tích luỹ. Bài 5 chồng hai vòng lặp lên nhau và mổ lỗi lệch một đơn vị. Bài 6 gỡ hết dàn giáo và để bạn tự trace.

Ba hộp xếp ngang: hộp mờ bên trái ghi Tuần tự làm lần lượt từ trên xuống chú thích đã có từ module trước, hộp giữa ghi Rẽ nhánh chọn đúng một đường trong nhiều đường, hộp phải ghi Lặp làm lại tới khi điều kiện hết đúng; ba mũi tên từ ba hộp cùng đổ xuống một hộp nhấn màu xanh bên dưới ghi ghép ba thứ này lại là đủ viết mọi chương trình

Ba hộp trên là toàn bộ bộ cấu trúc điều khiển. Không có cái thứ tư. Mọi chương trình phức tạp bạn từng dùng chỉ là ba thứ này ghép vào nhau, rất nhiều tầng, rất nhiều lần.

2. 🗺️ Cheat sheet — sáu thứ đáng dán lên tường

ThứQuy tắc gọn nhấtChỗ nó cắn
if / elif / elseNhánh đúng đầu tiên thắng, phần còn lại không được tínhXếp ngưỡng rộng lên trên làm nhánh dưới thành nhánh chết
Điều kiệnMỗi vế của and / or phải tự thành một câu hỏix == 1 or 2 luôn đúng, với mọi x
Đúng/sai ngầmSố 0, chuỗi rỗng, danh sách rỗng là sai; còn lại là đúngĐiều kiện hỏng vẫn chạy im lặng thay vì báo lỗi
whileĐủ ba phần: khởi tạo, điều kiện, dòng đổi chính biến đóCó dòng cập nhật mà sai biến thì vẫn treo
for + tích luỹBiến lặp bị ghi đè, biến tích luỹ cộng dồnKhởi tạo trong thân là mất hẳn vai tích luỹ
Lặp lồngThụt lề quyết định nhân hay cộngĐếm nhãn thay vì đếm ô, ra 7 thay vì 12

3. 📖 Từ vựng module

Thuật ngữMột câu
Điều kiệnMột biểu thức cho ra True hoặc False, không phải một mệnh lệnh
NhánhKhối lệnh thuộc về một if, elif hoặc else
Nhánh chếtNhánh mà không giá trị đầu vào nào chạy tới được, thường do xếp sai thứ tự
Ngắn mạchor chỉ tính vế phải khi vế trái sai
Biến điều khiểnBiến mà điều kiện của while hỏi về, và thân phải đổi nó
Biến lặpBiến nhận lần lượt từng phần tử trong for, bị ghi đè mỗi vòng
Biến tích luỹBiến cộng dồn qua các vòng để giữ tổng, đếm, hoặc lớn nhất
Vòng lặp vô hạnVòng lặp có điều kiện không bao giờ thành sai
Lệch một đơn vịVòng lặp chạy thừa hoặc thiếu đúng một vòng so với ý định

4. ⚠️ Năm lỗi im lặng của module

Không lỗi nào dưới đây làm chương trình báo lỗi. Đó chính là lý do chúng đáng nhớ.

  1. Xếp ngưỡng rộng lên trên. Mọi học sinh từ 5 điểm trở lên đều xếp "Kha" — kể cả em được 10. Nhánh "Gioi" tồn tại trong code nhưng không giá trị nào chạm tới được.
  2. Vế không phải câu hỏi. Với x == 1 or 2, thử x bằng 7, bằng 100, bằng âm 3: cả ba đều lọt vào nhánh "x là 1 hoặc 2".
  3. So chuỗi với số bằng ==. Người dùng gõ đúng 20, chương trình vẫn từ chối — vì input() trả về ký tự "20", và ký tự không bao giờ bằng số.
  4. Khởi tạo biến tích luỹ trong thân. Cộng [7, 9, 5] ra 5 thay vì 21: kết quả đúng bằng phần tử cuối, đó là chữ ký của lỗi này.
  5. Lệch một đơn vị ở điều kiện dừng. Vòng ngoài thừa một lượt, vòng trong 4 phần tử: 12 lần chạy thành 16, thừa bốn chứ không phải thừa một.

✅ Self-assessment

Tick được cả sáu ý dưới thì bạn sẵn sàng qua module sau. Ô nào còn ngập ngừng, đọc lại đúng chỗ được gợi ý ngay dưới nó rồi quay lại tick.

  • Tôi trace được luồng chạy qua if/elif/else và chỉ ra được nhánh nào không hề chạy.
    • Nếu chưa chắc: đọc lại bài 01 mục 3 và làm lại bảng ở mục 5.
  • Tôi nhận ra được ba lỗi điều kiện kinh điển: viết x == 1 or 2, phủ định đặt sai chỗ, và so sánh chuỗi với số.
    • Nếu chưa chắc: đọc lại bài 02 mục 3, 4 và 5.
  • Tôi dự đoán được số vòng một vòng lặp while chạy, và nhận ra được vòng lặp không bao giờ dừng.
    • Nếu chưa chắc: đọc lại bài 03 mục 3 và làm lại bài sắp dòng ở mục 5.
  • Tôi trace được biến lặp và biến tích luỹ qua một vòng for trên danh sách.
    • Nếu chưa chắc: đọc lại bài 04 mục 3 và làm lại bảng ở mục 6.
  • Tôi tìm được lỗi lệch một đơn vị trong vòng lặp, và chỉ ra được vòng nào thừa hoặc thiếu.
    • Nếu chưa chắc: đọc lại bài 05 mục 4 và bài tìm bug ở mục 6.
  • Tôi tính được số lần thân trong của một vòng lặp lồng chạy, và giải thích được vì sao là n nhân m.
    • Nếu chưa chắc: đọc lại bài 05 mục 2, rồi làm lại bài 06.

Sáu câu dưới kiểm lại đúng sáu ý trên. Trả lời bằng lời của bạn trước khi mở đáp án.

Tự kiểm tra
0/6 câu đã trả lời
  1. Q1
    Một người bạn nói: "if/elif/else thì máy chạy hết cả cụm rồi lấy kết quả cuối cùng". Bạn sửa lại thế nào, và đưa ví dụ gì để chứng minh?
  2. Q2
    Vì sao x == 1 or 2x == 1 or 0 đều sai như nhau, dù chỉ cái đầu cho ra kết quả sai?
  3. Q3
    Ba phần nào một vòng lặp while cần có để dừng được, và phần nào hay bị viết sai nhất theo cách khó thấy?
  4. Q4
    Nếu chuyển dòng tong = 0 từ ngoài vào trong thân vòng for, kết quả cuối trở thành gì và vì sao?
  5. Q5
    Cách rẻ nhất để bắt lỗi lệch một đơn vị là gì, và vì sao nó hiệu quả hơn đọc lại code?
  6. Q6
    Vì sao hai vòng lặp lồng nhau cho n nhân m lần chạy chứ không phải n cộng m? Trong code, thứ gì quyết định điều đó?

5. 🚀 Sắp tới

Module sau — Từ đề bài tới thuật toán — là nút thắt nặng nhất của cả khoá, và cũng là thứ phân biệt "biết cú pháp" với "viết được chương trình".

Tới giờ bạn luôn được đưa sẵn code rồi hỏi nó chạy ra gì. Chiều ngược lại khó hơn nhiều: đưa một đề bài viết bằng tiếng Việt, tự bóc nó thành các bước máy làm được. Ba cấu trúc bạn vừa học chính là bộ từ vựng để viết ra các bước đó — nhưng có từ vựng chưa phải là biết viết.

Bắt đầu ở Tổng quan module — từ đề bài tới thuật toán. Và trước khi sang, thứ đáng làm nhất là quay lại bài 06 sau vài ngày và trace lại từ đầu, không nhìn đáp án. Trace được lần thứ hai sau khi đã quên chi tiết mới là dấu hiệu bạn thật sự nắm, chứ không phải nhớ.

6. 📚 Đọc thêm

📚 Tài liệu tham chiếu (không bắt buộc)

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên

Bài tiếp theo

Tổng quan module — từ đề bài tới thuật toán