Câu lệnh lặp while – Lý thuyết | Tin học 10

I. Lý thuyết trọng tâm

1. Lệnh lặp while

a) Khi nào dùng while?

Trong lập trình, có những tình huống ta cần lặp lại một công việc nhưng không biết trước sẽ lặp bao nhiêu lần — việc lặp chỉ dừng khi một điều kiện nào đó không còn thỏa mãn.

Lặp biết trước số lần (dùng for) Lặp không biết trước số lần (dùng while)
Chạy 20 vòng quanh sân Chạy nhiều vòng quanh sân trong 2 tiếng
Làm 5 bài tập Làm bài tập đến giờ ăn cơm thì dừng
Lấy 15 xô nước Xách nước cho đến khi đầy thùng

→ Cột trái: biết chính xác số lần lặp. Cột phải: chỉ biết điều kiện dừng, không biết trước phải lặp bao nhiêu lần.

b) Cú pháp và cách hoạt động

while <điều kiện>:
    <khối lệnh lặp>

Quy tắc cú pháp:

  • Sau while là một biểu thức logic (điều kiện), kết thúc bằng dấu hai chấm :
  • Khối lệnh lặp phải viết lùi vào (1 tab hoặc 4 dấu cách) và thẳng hàng

Cách hoạt động (3 bước lặp lại):

  1. Python kiểm tra điều kiện trước
  2. Nếu điều kiện = True → thực hiện khối lệnh lặp, rồi quay lại bước 1
  3. Nếu điều kiện = Falsedừng, thoát khỏi vòng lặp

Ví dụ minh họa:

S = 0
k = 1
while k < 100:
    S = S + k
    k = k + 7
print(S)

Phân tích: Ban đầu k = 1. Mỗi vòng lặp, k tăng thêm 7, tức k lần lượt nhận các giá trị 1, 8, 15, 22, …, 99. Khi k đạt 106 (≥ 100) thì điều kiện k < 100 sai → dừng. Giá trị S chính là tổng $1 + 8 + 15 + … + 99 = 750$.

Câu hỏi kiểm tra nhanh: Lệnh while kiểm tra điều kiện trước hay sau khi thực hiện khối lệnh lặp?

Trước. Python luôn kiểm tra điều kiện trước mỗi vòng lặp. Nếu ngay từ đầu điều kiện đã sai thì khối lệnh lặp không được thực hiện lần nào.

c) Lưu ý quan trọng

Lặp vô hạn:while phụ thuộc vào điều kiện nên nếu điều kiện luôn đúng (không bao giờ thành False), chương trình sẽ lặp mãi không dừng. Do đó, trong khối lệnh lặp phải có thao tác làm thay đổi điều kiện để vòng lặp có thể kết thúc.

Lệnh break: Khi cần dừng và thoát ngay khỏi vòng lặp while hoặc for mà không cần chờ điều kiện chuyển thành False, ta dùng lệnh break.

for k in range(10):
    print(k, end=" ")
    if k == 5:
        break

Kết quả: 0 1 2 3 4 5 (dừng ngay khi k == 5, không chạy tiếp đến 9).

2. Ba cấu trúc lập trình cơ bản

Một chương trình Python có thể được chia thành ba loại khối lệnh, tương ứng với ba cấu trúc lập trình cơ bản của mọi ngôn ngữ lập trình bậc cao:

Cấu trúc Mô tả Câu lệnh tương ứng
Tuần tự Các lệnh được thực hiện lần lượt từ trên xuống dưới Lệnh gán, nhập/xuất dữ liệu (=, input(), print())
Rẽ nhánh Khối lệnh chỉ thực hiện tùy thuộc vào điều kiện đúng hay sai Lệnh if, if-else, if-elif-else
Lặp Khối lệnh được lặp lại cho đến khi điều kiện không còn thỏa mãn Lệnh for, while

Câu hỏi kiểm tra nhanh: Ba cấu trúc lập trình cơ bản của ngôn ngữ lập trình bậc cao gồm những gì?

Cấu trúc tuần tự, cấu trúc rẽ nhánh, cấu trúc lặp.

II. Phương pháp giải các dạng bài tập

Dạng 1: Truy vết chương trình while (đọc code – xác định kết quả)

Phương pháp:

Khi đề bài cho đoạn chương trình sử dụng while và yêu cầu xác định kết quả, ta thực hiện truy vết (chạy tay) theo các bước:

  • Bước 1: Ghi nhận giá trị khởi tạo của các biến trước vòng lặp.
  • Bước 2: Kiểm tra điều kiện. Nếu True → thực hiện khối lệnh, ghi lại giá trị các biến sau mỗi vòng lặp. Nếu False → dừng.
  • Bước 3: Lặp lại bước 2 cho đến khi điều kiện = False.
  • Bước 4: Xác định giá trị cuối cùng được in ra hoặc biểu thức toán học mà chương trình tính.

Mẹo: Lập bảng truy vết với các cột: Vòng lặp | Điều kiện | Biến 1 | Biến 2 | … để theo dõi giá trị qua từng bước.

Bài tập mẫu 1 (SGK – Ví dụ 1): Quan sát đoạn chương trình sau và cho biết S là giá trị của biểu thức toán học nào?

S = 0
k = 1
while k * k < 100:
    S = S + k * k
    k = k + 1

Lời giải:

Bảng truy vết (tóm tắt):

Vòng k k*k k*k < 100? S sau vòng
1 1 1 True 0 + 1 = 1
2 2 4 True 1 + 4 = 5
3 3 9 True 5 + 9 = 14
9 9 81 True … + 81
10 100 False → dừng

Vòng lặp cộng dồn $k^2$ vào S với điều kiện $k^2 < 100$, tức $k < 10$. Vậy:

$$S = 1^2 + 2^2 + 3^2 + \ldots + 9^2$$

S là tổng bình phương các số tự nhiên từ 1 đến 9 (tức các số tự nhiên có bình phương nhỏ hơn 100).

Bài tập mẫu 2 (SGK – Ví dụ 2): Thực hiện các lệnh sau. Kết quả sẽ in ra những số nào?

k = 2
while k < 50:
    print(k, end=" ")
    k = k + 3

Lời giải:

Ban đầu k = 2. Mỗi vòng lặp in ra k rồi tăng k thêm 3. Vòng lặp dừng khi k ≥ 50.

Dãy giá trị k: 2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47.

Khi k = 50 → điều kiện k < 50 sai → dừng.

Kết quả in ra: 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47

Dạng 2: Viết chương trình tính tổng / tìm phần tử dãy số bằng while

Phương pháp:

Với bài toán tính tổng hoặc tìm phần tử trong dãy số sử dụng while, ta cần xác định 4 yếu tố:

Yếu tố Câu hỏi cần trả lời
Biến tích lũy Biến nào lưu kết quả? (thường là S cho tổng, dem cho đếm)
Biến điều khiển Biến nào thay đổi qua mỗi vòng? (thường là k)
Điều kiện lặp Lặp khi nào? (k còn nhỏ hơn bao nhiêu? hay thỏa điều kiện gì?)
Bước nhảy Biến điều khiển thay đổi như thế nào sau mỗi vòng? (+1, +2, +3…?)

Sau đó ghép thành cấu trúc:

S = 0              # khởi tạo biến tích lũy
k = <giá_trị_đầu>  # khởi tạo biến điều khiển
while <điều_kiện>:
    S = S + <biểu_thức_k>   # cập nhật tích lũy
    k = k + <bước_nhảy>     # cập nhật biến điều khiển
print(S)

Bài tập mẫu 1 (SGK – Câu hỏi mục 1): Viết đoạn chương trình tính tổng $2 + 4 + 6 + \ldots + 100$ sử dụng lệnh while.

Lời giải:

Phân tích: Dãy số chẵn từ 2 đến 100, bước nhảy = 2.

Yếu tố Giá trị
Biến tích lũy S = 0
Biến điều khiển k = 2 (phần tử đầu)
Điều kiện lặp k <= 100
Bước nhảy k = k + 2
S = 0
k = 2
while k <= 100:
    S = S + k
    k = k + 2
print(S)

Kết quả: S = 2 + 4 + 6 + … + 100 = 2550

Bài tập mẫu 2 (SGK – Luyện tập, bài 1): Cho dãy số 1, 4, 7, 10, … Viết chương trình in ra phần tử lớn nhất của dãy nhưng nhỏ hơn 100.

Lời giải:

Phân tích: Dãy bắt đầu từ 1, mỗi phần tử tăng 3 (công sai d = 3). Cần tìm phần tử lớn nhất mà vẫn < 100.

Ý tưởng: Duyệt dãy bằng while, lưu phần tử hiện tại vào biến. Khi k ≥ 100 thì dừng, giá trị trước đó chính là kết quả.

k = 1
while k + 3 < 100:
    k = k + 3
print(k)

Hoặc cách khác rõ ràng hơn:

k = 1
kq = k
while k < 100:
    kq = k
    k = k + 3
print(kq)

Kết quả: 97 (vì 97 < 100 và 97 + 3 = 100 ≥ 100 → 97 là phần tử lớn nhất nhỏ hơn 100).

Dạng 3: Viết chương trình đếm / kiểm tra điều kiện bằng while

Phương pháp:

Khi cần đếm số phần tử thỏa mãn điều kiện trong một dãy, ta kết hợp while với lệnh if:

dem = 0
k = <giá_trị_đầu>
while <điều_kiện_lặp>:
    if <điều_kiện_kiểm_tra>:
        dem = dem + 1
    k = k + 1
print(dem)

Bài tập mẫu (SGK – Luyện tập, bài 2): Viết chương trình đếm trong dãy 100 số tự nhiên đầu tiên có bao nhiêu số thỏa mãn điều kiện: hoặc chia hết cho 5 hoặc chia cho 3 dư 1.

Lời giải:

Phân tích: Dãy 100 số tự nhiên đầu tiên: 0, 1, 2, …, 99. Điều kiện: k % 5 == 0 hoặc k % 3 == 1.

dem = 0
k = 0
while k < 100:
    if k % 5 == 0 or k % 3 == 1:
        dem = dem + 1
    k = k + 1
print(dem)

Kết quả: 47

Dạng 4: Viết chương trình in dãy số / kí tự có định dạng

Phương pháp:

Khi cần in dãy số hoặc kí tự theo định dạng nhiều hàng, ta kết hợp while với kỹ thuật xuống dòng có điều kiện:

  • Dùng print(giá_trị, end=" ") để in trên cùng một hàng (không xuống dòng).
  • Dùng print(giá_trị) (không có end) để in xong rồi xuống dòng.
  • Dùng toán tử % (chia lấy dư) để xác định vị trí cuối hàng: nếu i % số_phần_tử_mỗi_hàng == 0 → xuống dòng.

Bài tập mẫu (SGK – Thực hành, nhiệm vụ 2): Viết chương trình in các chữ cái tiếng Anh từ “A” đến “Z” theo ba hàng ngang, hai hàng đầu có 10 chữ cái, hàng thứ ba có 6 chữ cái.

Lời giải:

Phân tích: Chữ cái A–Z chiếm vị trí 65–90 trong bảng mã ASCII. Hàm chr(k) trả về kí tự tương ứng với mã k. Cứ mỗi 10 kí tự thì xuống dòng.

i = 0
k = 65  # mã ASCII của 'A'
while k <= 90:
    i = i + 1
    if i % 10 == 0:
        print(chr(k))       # in xong xuống dòng (cuối hàng)
    else:
        print(chr(k), end=" ")  # in trên cùng hàng
    k = k + 1

Kết quả:

A B C D E F G H I J
K L M N O P Q R S T
U V W X Y Z

III. Sơ đồ tư duy

1. Lệnh lặp while

  • 1.1. Dùng khi không biết trước số lần lặp
  • 1.2. Cú pháp: while <điều kiện>: <khối lệnh>
  • 1.3. Hoạt động: kiểm tra điều kiện trước → True thì lặp, False thì dừng
  • 1.4. Khối lệnh phải viết lùi vào (1 tab / 4 dấu cách)
  • 1.5. Lưu ý: tránh lặp vô hạn, có thể dùng break để thoát sớm

2. Ba cấu trúc lập trình cơ bản

  • 2.1. Tuần tự: lệnh thực hiện lần lượt từ trên xuống (gán, nhập/xuất)
  • 2.2. Rẽ nhánh: thực hiện tùy điều kiện đúng/sai (lệnh if)
  • 2.3. Lặp: thực hiện lặp lại theo điều kiện (lệnh for, while)

3. Các dạng bài tập chính

  • 3.1. Truy vết chương trình while → lập bảng giá trị biến qua từng vòng
  • 3.2. Tính tổng / tìm phần tử dãy số → xác định: biến tích lũy, biến điều khiển, điều kiện, bước nhảy
  • 3.3. Đếm phần tử thỏa điều kiện → kết hợp while với if
  • 3.4. In dãy có định dạng → dùng print(end=" ") và toán tử % để xuống dòng

IV. Sai lầm thường gặp

Sai lầm Đính chính
Nghĩ rằng while kiểm tra điều kiện sau khi thực hiện khối lệnh while luôn kiểm tra điều kiện trước. Nếu điều kiện sai ngay từ đầu, khối lệnh không chạy lần nào.
Quên cập nhật biến điều khiển trong vòng lặp → lặp vô hạn Trong khối lệnh lặp bắt buộc phải có thao tác thay đổi biến liên quan đến điều kiện (ví dụ: k = k + 1) để vòng lặp có thể dừng.
Nhầm lẫn giữa forwhile for: dùng khi biết trước số lần lặp. while: dùng khi không biết trước, chỉ biết điều kiện dừng.
Viết khối lệnh lặp không lùi vào (thiếu thụt đầu dòng) Python bắt buộc khối lệnh sau while phải lùi vào 1 tab hoặc 4 dấu cách và thẳng hàng. Thiếu thụt lề sẽ báo lỗi IndentationError.
Nhầm điều kiện lặp với điều kiện dừng Điều kiện trong whileđiều kiện để tiếp tục lặp, không phải điều kiện dừng. Ví dụ: muốn lặp khi k còn nhỏ hơn 100 → viết while k < 100, không phải while k >= 100.
Dùng print(k) cho tất cả → mỗi số chiếm một dòng Muốn in nhiều giá trị trên cùng một hàng, dùng print(k, end=" "). Chỉ dùng print(k) khi muốn xuống dòng sau giá trị đó.
Thầy Phạm Thành Danh

Thầy Phạm Thành Danh

(Người kiểm duyệt, ra đề)

Chức vụ: Trưởng ban biên soạn môn Tin Học THPT

Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1

Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa