Bài 3: Cấu trúc Lặp (for và while)

1. Giới thiệu & Vòng lặp : Lặp Xác Định

1.1. Giới thiệu: Khi nào cần Vòng lặp? 

  • Tình huống thực tế: Trong quản trị mạng, bạn cần ping 100 địa chỉ IP, kiểm tra 50 thư mục, hoặc tạo ra 20 tài khoản người dùng mới.

  • Vấn đề: Không thể gõ 100 lần lệnh hoặc . Vòng lặp giúp tự động hóa việc lặp đi lặp lại một khối lệnh.

1.2. Vòng lặp (Lặp xác định)

  • Khái niệm: được dùng khi bạn biết trước số lần lặp hoặc bạn muốn duyệt qua một tập hợp đã có sẵn.

  • Hàm : Tạo ra một chuỗi số để có thể lặp qua.

    • range(N): Tạo ra các số từ đến .

    • range(Start, Stop): Tạo ra các số từ đến .

    • range(Start, Stop, Step): Thêm bước nhảy.

  • Cú pháp cơ bản ( với ):

    # Ví dụ: Lặp 5 lần để tạo 5 user
    for i in range(5):
        print(f"Đang tạo user số {i+1}") 
    

1.3. Thực hành: Tạo Báo cáo ()

Demo & Thực hành: Yêu cầu học sinh viết chương trình tạo 10 dòng báo cáo tình trạng thiết bị:

  1. Dùng in để lặp 10 lần.

  2. Sử dụng để in ra: “Thiết bị Server-[số thứ tự] – Tình trạng: OK.”

Mã nguồn Python

import random
from datetime import datetime

# Danh sách tên thiết bị mẫu
devices = [f"Thiết bị {i+1}" for i in range(10)]

# Các trạng thái hoạt động có thể có
statuses = ["Hoạt động tốt", "Cần bảo trì", "Hỏng", "Đang kiểm tra", "Không kết nối"]

# Tạo báo cáo
for device in devices:
    status = random.choice(statuses)
    timestamp = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
    print(f"{device}: {status} (Kiểm tra lúc: {timestamp})")

Ví dụ: Viết phần mềm tính tổng các số từ 1 đến n, trong đó n được nhập từ bàn phím:

Mã nguồn Python

n = int(input("Nhập số nguyên n: "))
tong = sum(range(1, n + 1))
print(f"Tổng các số từ 1 đến {n} là: {tong}")

🧠 Giải thích từng dòng

Dòng lệnhÝ nghĩa
input("Nhập số nguyên n: ")Yêu cầu người dùng nhập một số nguyên
int(...)Chuyển chuỗi nhập vào thành số nguyên
range(1, n + 1)Tạo dãy số từ 1 đến n
sum(...)Tính tổng các số trong dãy
print(...)In kết quả ra màn hình

2. Vòng lặp : Lặp Không Xác Định

2.1. Vòng lặp (Lặp không xác định)

  • Khái niệm: được dùng khi bạn không biết trước số lần lặp, vòng lặp sẽ tiếp tục chạy chừng nào điều kiện còn ĐÚNG.

  • Nguy hiểm: Nếu điều kiện luôn luôn đúng, chương trình sẽ chạy vô tận () và có thể làm treo máy. Phải luôn đảm bảo có cách để điều kiện trở nên sai.

  • Cú pháp cơ bản ():

    # Chương trình sẽ chạy mãi cho đến khi so_lan_nhap >= 5
    so_lan_nhap = 0
    while so_lan_nhap < 5:
        print("Đang chờ nhập dữ liệu...")
        so_lan_nhap = so_lan_nhap + 1 # Cần có bước thay đổi điều kiện
    

2.2. Ứng dụng: Đăng nhập Lặp

Demo & Thực hành: Yêu cầu :học sinh viết chương trình mô phỏng đăng nhập:

  1. Khai báo đúng.

  2. Sử dụng (lặp vô tận) để bắt đầu.

  3. Bên trong vòng lặp: hỏi người dùng nhập tên và mật khẩu.

Mã nguồn Python

# Khai báo thông tin đăng nhập đúng
correct_username = "admin"
correct_password = "123456"

# Vòng lặp đăng nhập
while True:
    username = input("Nhập tên đăng nhập: ")
    password = input("Nhập mật khẩu: ")

    if username == correct_username and password == correct_password:
        print("✅ Đăng nhập thành công!")
        break  # Thoát khỏi vòng lặp khi đăng nhập đúng
    else:
        print("❌ Sai tên đăng nhập hoặc mật khẩu. Vui lòng thử lại.\n")

🧠 Giải thích từng phần

Thành phầnMô tả
correct_username, correct_passwordKhai báo thông tin đăng nhập hợp lệ
while True:Vòng lặp vô hạn để liên tục yêu cầu đăng nhập
input(...)Nhập tên đăng nhập và mật khẩu từ người dùng
if username == ... and password == ...Kiểm tra thông tin nhập có đúng không
breakThoát khỏi vòng lặp nếu đăng nhập thành công
else:Thông báo lỗi nếu nhập sai
🧪 Ví dụ chạy chương trình
Nhập tên đăng nhập: admin
Nhập mật khẩu: 123456
✅ Đăng nhập thành công!

Hoặc nếu sai:

Nhập tên đăng nhập: user
Nhập mật khẩu: 000000
❌ Sai tên đăng nhập hoặc mật khẩu. Vui lòng thử lại.

3. Điều khiển Vòng lặp:

3.1. Lệnh (Ngừng và Thoát)

  • Công dụng: Ngừng vòng lặp ngay lập tức và chương trình chuyển đến câu lệnh sau vòng lặp.

  • Ứng dụng: Thường dùng trong để thoát khỏi vòng lặp vô tận khi đạt được mục tiêu (ví dụ: đăng nhập thành công, tìm thấy file).

  • Demo & Thực hành: Tiếp tục ví dụ Đăng nhập ở trên:

    while True:
        ten = input("Tên: ")
        # ... (Kiểm tra tên và mật khẩu)
        if ten == "admin":
            print("Đăng nhập thành công!")
            break # Thoát khỏi vòng lặp ngay lập tức
        else:
            print("Sai tên, thử lại.")
    

3.2. Lệnh (Bỏ qua lần lặp hiện tại)

  • Công dụng: Bỏ qua phần còn lại của vòng lặp hiện tại và chuyển sang lần lặp tiếp theo.

  • Ứng dụng: Thường dùng để bỏ qua dữ liệu không hợp lệ hoặc không cần xử lý.

  • Demo & Thực hành: Sử dụng lặp từ 1 đến 10. Dùng để bỏ qua việc in ra số 5.

3.3. Tích hợp: Vòng lặp và

  • Khái niệm: Vòng lặp và rẽ nhánh luôn đi cùng nhau. Vòng lặp để lặp lại thao tác, để kiểm tra điều kiện bên trong mỗi lần lặp.

  • Demo: Sử dụng lặp qua 100 số, dùng để chỉ in ra những số chia hết cho 5.

Bài tập 3.1: Lặp lại lời chào

  • Phân tích yêu cầu:

    • Mục tiêu: In ra một dòng chữ cố định (“Lập trình Python thật dễ!”).

    • Số lần: 10 lần.

    • Cách làm: Vì số lần lặp đã được biết trước (là 10), chúng ta nên sử dụng vòng lặp for kết hợp với hàm range().

    • Các bước thực hiện:

      1. Để lặp 10 lần, chúng ta sử dụng range(10). Hàm này sẽ tạo ra một dãy số từ 0 đến 9 (đủ 10 số).

      2. Viết cú pháp vòng lặp for. Chúng ta có thể dùng i làm biến đếm (biến này sẽ lần lượt nhận giá trị 0, 1, 2… 9).

      3. Bên trong vòng lặp (lùi vào 1 tab), đặt lệnh print() để in ra dòng chữ theo yêu cầu.

        Nếu bạn muốn thử thách thêm, bạn có thể in số thứ tự trước mỗi dòng như sau:

        python
         
        for i in range(10):
            print(f"{i + 1}. Lập trình Python thật dễ!")

Bài tập 3.2: Đếm số từ 1 đến N

  • Phân tích yêu cầu:

    • Đầu vào: Cần lấy một số N từ người dùng. Phải dùng input()int().

    • Đầu ra: In ra các số, bắt đầu từ 1 và kết thúc là N.

    • Cách làm: Vẫn là số lần lặp biết trước (từ 1 đến N), nên chúng ta dùng for. Cần chú ý cách dùng range() để bắt đầu từ 1 và bao gồm cả N.

  • Các bước thực hiện:

    1. Dùng input() để yêu cầu người dùng nhập số N.

    2. Dùng int() để ép kiểu giá trị nhập vào sang kiểu số nguyên và gán vào biến N.

    3. Viết vòng lặp for. Để bắt đầu từ 1, ta dùng range(1, ...).

    4. Hàm range() dừng trước số kết thúc. Để lặp bao gồm cả N, số kết thúc phải là N + 1.

    5. Cú pháp hoàn chỉnh là: for so in range(1, N + 1):

    6. Bên trong vòng lặp, in ra chính biến đếm so.

      Hướng dẫn:
       
      # Yêu cầu người dùng nhập số N
      N = int(input("Nhập một số nguyên N: "))
      
      # Vòng lặp từ 1 đến N (bao gồm cả N)
      for so in range(1, N + 1):
          print(so)

Bài tập 3.3.1: Tính tổng các số chẵn từ 1 đến N

      • Phân tích yêu cầu:

        • Đầu vào: Cần lấy một số N từ người dùng.

        • Đầu ra: Chỉ in ra 1 con số duy nhất là tổng của các số chẵn.

        • Cách làm: Đây là bài toán “cộng dồn có điều kiện”.

          1. Chúng ta cần 1 biến để lưu tổng (biến tích lũy), khởi tạo bằng 0.

          2. Chúng ta cần duyệt qua tất cả các số từ 1 đến N (dùng for).

          3. Bên trong vòng lặp, ta phải kiểm tra (dùng if) xem số đang duyệt có phải số chẵn không.

          4. Nếu là số chẵn, ta mới cộng nó vào biến tổng.

      • Các bước thực hiện:

        1. Nhập N và ép kiểu int.

        2. Khởi tạo một biến tong_chan = 0 ở bên ngoài vòng lặp.

        3. Viết vòng lặp for để duyệt qua các số: for i in range(1, N + 1):.

        4. Bên trong for, thêm một điều kiện if để kiểm tra i có chẵn không. Gợi ý: Dùng phép chia lấy dư: if i % 2 == 0:.

        5. Bên trong if (lùi vào 2 tab), thực hiện cộng dồn: tong_chan = tong_chan + i.

        6. Sau khi vòng lặp for kết thúc (quay về lùi lề 0), in ra kết quả cuối cùng

      • python
         
        # Nhập số nguyên N từ người dùng
        N = int(input("Nhập một số nguyên N: "))
        
        # Khởi tạo biến tổng các số chẵn
        tong_chan = 0
        
        # Duyệt qua các số từ 1 đến N
        for i in range(1, N + 1):
            # Kiểm tra nếu i là số chẵn
            if i % 2 == 0:
                tong_chan = tong_chan + i
        
        # In ra kết quả cuối cùng
        print("Tổng các số chẵn từ 1 đến", N, "là:", tong_chan)

Bài tập 3.3.2: Hãy viết phần mềm đếm số chữ số của một số nguyên: Ví dụ: số 1234 có 4 chữ số.

Các bước thực hiện

🔹 Bước 1: Nhập số nguyên từ người dùng

n = int(input("Nhập số nguyên dương: "))

🔹 Bước 2: Khởi tạo biến đếm

dem = 0

🔹 Bước 3: Dùng vòng lặp while để chia số cho 10 đến khi hết

while n > 0:
    dem += 1
    n = n // 10  # Chia lấy phần nguyên

🔹 Bước 4: In kết quả

print("Số có", dem, "chữ số.")

🧠 Giải thích

  • Mỗi lần chia n // 10 là ta bỏ đi chữ số cuối cùng.

  • Mỗi lần như vậy ta tăng biến dem lên 1.

  • Khi n trở thành 0 thì ta đã đếm hết các chữ số.

Bài tập 3.3.3: Hãy viết phầm mềm Tìm số Fibonacci nhỏ hơn N.

🧠 Giải thích bài toán

🔢 Dãy Fibonacci là gì?

Dãy Fibonacci là dãy số bắt đầu bằng:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Trong đó:

  • Số đầu tiên là 0

  • Số thứ hai là 1

  • Các số sau được tính bằng tổng của hai số trước đó:

F(n)=F(n−1)+F(n−2)

🛠️ Các bước thực hiện

🔹 Bước 1: Nhập số nguyên N từ người dùng

N = int(input("Nhập số nguyên N: "))

🔹 Bước 2: Khởi tạo hai số đầu tiên của dãy Fibonacci

a = 0
b = 1

🔹 Bước 3: Dùng vòng lặp while để sinh các số Fibonacci nhỏ hơn N

while a < N:
    print(a, end=" ")
    temp = a + b
    a = b
    b = temp
🧠 Giải thích vòng lặp
  • a là số hiện tại trong dãy Fibonacci.

  • b là số tiếp theo.

  • Mỗi vòng lặp:

    • In ra a

    • Tính số tiếp theo: temp = a + b

    • Cập nhật a = b, b = temp

🧪 Ví dụ chạy chương trình

Nếu nhập N = 20, kết quả sẽ là:

0 1 1 2 3 5 8 13

Bài tập 3.4: In bảng cửu chương

  • Phân tích yêu cầu:

    • Đầu vào: Cần lấy một số X (ví dụ: 7).

    • Đầu ra: In ra 10 dòng, mỗi dòng theo định dạng “X x i = Kết quả”.

    • Cách làm: Cần lặp 10 lần (cho các số từ 1 đến 10). Dùng for. Bên trong vòng lặp, ta lấy X nhân với số lặp hiện tại (i) và in ra theo định dạng (dùng f-string).

  • Các bước thực hiện:

    1. Nhập số X và ép kiểu int.

    2. Viết vòng lặp for để chạy 10 lần, bắt đầu từ 1: for i in range(1, 11):. (Vì range(1, 11) sẽ chạy từ 1 đến 10).

    3. Bên trong vòng lặp, tính kết quả: ket_qua = X * i.

    4. Dùng f-string để in ra màn hình theo đúng định dạng.

Bài tập 3.5.1: Tính giai thừa

  • Phân tích yêu cầu:

    • Đầu vào: Một số N.

    • Đầu ra: N! (N giai thừa).

    • Cách làm: Đây là bài toán “nhân dồn”. Tương tự bài toán “cộng dồn”, nhưng ta dùng phép nhân và biến tích lũy phải được khởi tạo là 1 (vì nếu là 0, kết quả luôn bằng 0).

  • Các bước thực hiện:

    1. Nhập N và ép kiểu int.

    2. Khởi tạo biến giai_thua = 1 bên ngoài vòng lặp.

    3. Viết vòng lặp for duyệt từ 1 đến N: for i in range(1, N + 1):.

    4. Bên trong vòng lặp, thực hiện nhân dồn: giai_thua = giai_thua * i.

    5. Sau khi vòng lặp kết thúc, in ra kết quả giai_thua.

Bài tập 3.5.2: Hãy viết phần mềm Tìm số nguyên tố đầu tiên lớn hơn N

🧠 Giải thích bài toán

🔢 Số nguyên tố là gì?

Số nguyên tố là số lớn hơn 1chỉ chia hết cho 1 và chính nó. Ví dụ: 2, 3, 5, 7, 11, 13, 17, 19, …

🛠️ Các bước thực hiện

🔹 Bước 1: Nhập số nguyên N từ người dùng

N = int(input("Nhập số nguyên N: "))

🔹 Bước 2: Viết hàm kiểm tra số nguyên tố

def la_so_nguyen_to(x):
    if x < 2:
        return False
    i = 2
    while i * i <= x:
        if x % i == 0:
            return False
        i += 1
    return True

🔹 Bước 3: Dùng vòng lặp để tìm số nguyên tố lớn hơn N

so = N + 1
while True:
    if la_so_nguyen_to(so):
        print("Số nguyên tố đầu tiên lớn hơn", N, "là:", so)
        break
    so += 1

 Ví dụ chạy chương trình

  • Nhập N = 10 → Kết quả: 11

  • Nhập N = 20 → Kết quả: 23

Bài mở rộng 3.5.2 :Viết chương trình in ra tam giác cân bằng ký tự *. Tam giác cân sẽ có chiều cao do người dùng nhập vào.

🧩 Bước 1: Xác định yêu cầu

  • In ra tam giác cân bằng dấu *

  • Người dùng nhập chiều cao h

  • Mỗi dòng có số lượng * tăng dần, được căn giữa để tạo hình tam giác

🧮 Bước 2: Phân tích cấu trúc tam giác

  • Với chiều cao h, dòng thứ i (tính từ 1) sẽ có:

    • Số dấu *: 2 * i - 1

    • Số khoảng trắng bên trái: h - i

Ví dụ với h = 4, ta có:

   *        ← dòng 1: 3 khoảng trắng, 1 dấu *
  ***       ← dòng 2: 2 khoảng trắng, 3 dấu *
 *****      ← dòng 3: 1 khoảng trắng, 5 dấu *
*******     ← dòng 4: 0 khoảng trắng, 7 dấu *

🖥️ Bước 3: Viết chương trình

# Nhập chiều cao tam giác
h = int(input("Nhập chiều cao tam giác cân: "))

# In từng dòng của tam giác
for i in range(1, h + 1):
    khoang_trang = ' ' * (h - i)
    dau_sao = '*' * (2 * i - 1)
    print(khoang_trang + dau_sao)

Bài tập 3.5.3: Hãy viết phần mềm Tìm bội chung nhỏ nhất (BCNN) của hai số

🧠 Giải thích bài toán

🔢 Bội chung nhỏ nhất là gì?

  • BCNN của hai số nguyên a và b là số nhỏ nhất chia hết cho cả a và b.

  • Công thức tính BCNN dựa trên Ước Chung Lớn Nhất (ƯCLN):

BCNN(a,b)=a⋅bƯCLN(a,b)BCNN(a, b) = \frac{a \cdot b}{ƯCLN(a, b)}

🛠️ Các bước thực hiện

🔹 Bước 1: Nhập hai số nguyên a và b

a = int(input("Nhập số thứ nhất: "))
b = int(input("Nhập số thứ hai: "))

🔹 Bước 2: Viết hàm tìm ƯCLN bằng thuật toán Euclid

def ucln(x, y):
    while y != 0:
        x, y = y, x % y
    return x

🔹 Bước 3: Tính BCNN bằng công thức

def bcnn(x, y):
    return x * y // ucln(x, y)

🔹 Bước 4: In kết quả

print("BCNN của", a, "và", b, "là:", bcnn(a, b))

Bài tập 3.5.4: Hãy viết phần mềm Tìm ước số của một số: In ra tất cả các ước của N.

🧠 Giải thích bài toán

🔢 Ước số là gì?

Ước của một số nguyên N là các số nguyên dương chia hết cho N. Ví dụ:

  • N = 12 → Ước số: 1, 2, 3, 4, 6, 12

🛠️ Các bước thực hiện

🔹 Bước 1: Nhập số nguyên N từ người dùng

N = int(input("Nhập số nguyên N: "))

🔹 Bước 2: Dùng vòng lặp để kiểm tra từng số từ 1 đến N

i = 1
while i <= N:
    if N % i == 0:
        print(i, end=" ")
    i += 1

🧪 Ví dụ chạy chương trình

  • Nhập N = 18 → Kết quả: 1 2 3 6 9 18

  • Nhập N = 25 → Kết quả: 1 5 25

 

🧠 Giải thích vòng lặp

  • Ta duyệt từ i = 1 đến i = N

  • Nếu N % i == 0 thì i là ước của N

  • In ra i

 

Bài tập 3.6: Xác thực mật khẩu

  • Phân tích yêu cầu:

    • Mục tiêu: Yêu cầu người dùng nhập mật khẩu cho đến khi đúng.

    • Số lần: Không biết trước. Người dùng có thể nhập đúng ngay lần 1, hoặc sai 100 lần.

    • Cách làm: Vì số lần lặp không biết trước, chúng ta phải dùng vòng lặp while. Cách đơn giản nhất là tạo một vòng lặp while True: (vòng lặp vô hạn) và sử dụng break để thoát ra khi điều kiện được thỏa mãn (nhập đúng).

  • Các bước thực hiện:

    1. Tạo một biến mat_khau_he_thong để lưu mật khẩu đúng.

    2. Bắt đầu vòng lặp vô hạn: while True:.

    3. Bên trong while, yêu cầu người dùng nhập mật khẩu: mat_khau_nhap = input("Nhập mật khẩu: ").

    4. Dùng if để so sánh mat_khau_nhap với mat_khau_he_thong.

    5. Nếu (if) chúng bằng nhau: In thông báo thành công và dùng lệnh break để phá vỡ vòng lặp.

    6. Ngược lại (else): In thông báo lỗi. Vòng lặp sẽ tự động quay lại Bước 3.

Bài tập 3.7: (Nâng cao) Vẽ hình tam giác vuông

  • Phân tích yêu cầu:

    • Đầu vào: Chiều cao H (ví dụ: 4).

    • Đầu ra: Một hình vẽ bằng *.

    • Logic (khi H=4):

      • Dòng 1: In 1 dấu * ("*" * 1)

      • Dòng 2: In 2 dấu * ("*" * 2)

      • Dòng 3: In 3 dấu * ("*" * 3)

      • Dòng 4: In 4 dấu * ("*" * 4)

    • Cách làm: Chúng ta cần một vòng lặp for để đi qua từng dòng (từ 1 đến H). Biến đếm i của vòng lặp này sẽ đại diện cho “dòng hiện tại” và cũng là “số dấu * cần in”. Trong Python, có một mẹo là bạn có thể nhân một chuỗi với một số ("*" * 3 sẽ ra "***").

  • Các bước thực hiện:

    1. Nhập H và ép kiểu int.

    2. Viết vòng lặp for để duyệt từ 1 đến H: for i in range(1, H + 1):.

    3. Bên trong vòng lặp, i sẽ lần lượt là 1, 2, 3…

    4. Sử dụng phép nhân chuỗi với số: print("*" * i).

    5. Lệnh print() sẽ tự động xuống dòng sau mỗi lần chạy, tạo ra hình tam giác chúng ta cần.