Bỏ qua

Image

Tổng hợp: Điều kiện và Vòng lặp

Mục tiêu bài học

Sau bài này, học sinh sẽ có thể:

  • Kết hợp thành thạo cấu trúc điều kiện và vòng lặp
  • Giải quyết các bài toán phức tạp cần tư duy logic
  • Áp dụng kiến thức để tìm số nguyên tố, tính tổng có điều kiện
  • Xử lý chuỗi và đếm các thành phần theo yêu cầu

1. Ôn tập nhanh

Cấu trúc điều kiện

if điều_kiện:
    # Khối lệnh thực hiện khi điều kiện đúng
elif điều_kiện_khác:
    # Khối lệnh thực hiện khi điều kiện khác đúng
else:
    # Khối lệnh thực hiện khi tất cả điều kiện sai

Vòng lặp for

for biến in range(start, stop, step):
    # Khối lệnh thực hiện lặp lại

Vòng lặp while

while điều_kiện:
    # Khối lệnh thực hiện khi điều kiện đúng
    # Cần có câu lệnh thay đổi điều kiện để tránh lặp vô hạn

2. Kết hợp điều kiện và vòng lặp

2.1. Tìm các số chẵn trong khoảng

# Tìm và in các số chẵn từ 1 đến 20
print("Các số chẵn từ 1 đến 20:")
for i in range(1, 21):
    if i % 2 == 0:
        print(i, end=" ")
print()  # Xuống dòng

2.2. Đếm số lượng phần tử thỏa mãn điều kiện

# Đếm số các số chia hết cho 3 từ 1 đến 50
count = 0
for i in range(1, 51):
    if i % 3 == 0:
        count += 1
print(f"Có {count} số chia hết cho 3 từ 1 đến 50")

2.3. Tính tổng có điều kiện

# Tính tổng các số lẻ từ 1 đến 100
tong_so_le = 0
for i in range(1, 101):
    if i % 2 == 1:  # Số lẻ
        tong_so_le += i
print(f"Tổng các số lẻ từ 1 đến 100: {tong_so_le}")

3. Thuật toán tìm số nguyên tố

3.1. Khái niệm số nguyên tố

Số nguyên tố là số tự nhiên lớn hơn 1, chỉ có đúng 2 ước là 1 và chính nó.

3.2. Thuật toán kiểm tra số nguyên tố

def kiem_tra_nguyen_to(n):
    """
    Kiểm tra xem n có phải số nguyên tố không
    """
    if n < 2:
        return False

    # Kiểm tra từ 2 đến căn bậc hai của n
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

# Ví dụ sử dụng
so = int(input("Nhập một số: "))
if kiem_tra_nguyen_to(so):
    print(f"{so} là số nguyên tố")
else:
    print(f"{so} không là số nguyên tố")

3.3. Tìm tất cả số nguyên tố trong khoảng

# Tìm các số nguyên tố từ 2 đến 50
print("Các số nguyên tố từ 2 đến 50:")
for num in range(2, 51):
    la_nguyen_to = True

    # Kiểm tra xem num có phải số nguyên tố không
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            la_nguyen_to = False
            break

    if la_nguyen_to:
        print(num, end=" ")
print()

4. Xử lý chuỗi với điều kiện và vòng lặp

4.1. Đếm ký tự trong chuỗi

def dem_ky_tu(chuoi):
    """
    Đếm số lượng chữ cái, chữ số và ký tự đặc biệt
    """
    so_chu_cai = 0
    so_chu_so = 0
    so_ky_tu_dac_biet = 0

    for ky_tu in chuoi:
        if ky_tu.isalpha():  # Kiểm tra chữ cái
            so_chu_cai += 1
        elif ky_tu.isdigit():  # Kiểm tra chữ số
            so_chu_so += 1
        else:  # Ký tự đặc biệt (bao gồm khoảng trắng)
            so_ky_tu_dac_biet += 1

    return so_chu_cai, so_chu_so, so_ky_tu_dac_biet

# Ví dụ sử dụng
text = input("Nhập một chuỗi: ")
chu_cai, chu_so, dac_biet = dem_ky_tu(text)
print(f"Số chữ cái: {chu_cai}")
print(f"Số chữ số: {chu_so}")
print(f"Số ký tự đặc biệt: {dac_biet}")

4.2. Tìm ký tự xuất hiện nhiều nhất

def tim_ky_tu_xuat_hien_nhieu_nhat(chuoi):
    """
    Tìm ký tự xuất hiện nhiều nhất trong chuỗi
    """
    # Đếm số lần xuất hiện của mỗi ký tự
    dem_ky_tu = {}
    for ky_tu in chuoi.lower():  # Chuyển về chữ thường để không phân biệt hoa/thường
        if ky_tu != ' ':  # Bỏ qua khoảng trắng
            if ky_tu in dem_ky_tu:
                dem_ky_tu[ky_tu] += 1
            else:
                dem_ky_tu[ky_tu] = 1

    # Tìm ký tự có số lần xuất hiện nhiều nhất
    if dem_ky_tu:
        ky_tu_max = max(dem_ky_tu, key=dem_ky_tu.get)
        so_lan_max = dem_ky_tu[ky_tu_max]
        return ky_tu_max, so_lan_max
    else:
        return None, 0

# Ví dụ sử dụng
chuoi = input("Nhập chuỗi: ")
ky_tu, so_lan = tim_ky_tu_xuat_hien_nhieu_nhat(chuoi)
if ky_tu:
    print(f"Ký tự '{ky_tu}' xuất hiện nhiều nhất với {so_lan} lần")
else:
    print("Chuỗi rỗng hoặc chỉ có khoảng trắng")

5. Các mẫu thuật toán thường gặp

5.1. Tìm giá trị lớn nhất/nhỏ nhất

# Tìm số lớn nhất trong danh sách được nhập từ bàn phím
n = int(input("Nhập số lượng phần tử: "))
so_lon_nhat = float('-inf')  # Khởi tạo với giá trị âm vô cùng

for i in range(n):
    so = int(input(f"Nhập số thứ {i+1}: "))
    if so > so_lon_nhat:
        so_lon_nhat = so

print(f"Số lớn nhất là: {so_lon_nhat}")

5.2. Kiểm tra dãy số tăng dần

def kiem_tra_tang_dan():
    """
    Kiểm tra xem dãy số nhập vào có tăng dần không
    """
    n = int(input("Nhập số lượng phần tử: "))
    if n <= 1:
        return True

    so_truoc = int(input("Nhập số thứ 1: "))

    for i in range(2, n + 1):
        so_hien_tai = int(input(f"Nhập số thứ {i}: "))
        if so_hien_tai <= so_truoc:
            return False
        so_truoc = so_hien_tai

    return True

# Sử dụng
if kiem_tra_tang_dan():
    print("Dãy số tăng dần")
else:
    print("Dãy số không tăng dần")

5.3. Tính tổng các chữ số của một số

def tong_chu_so(n):
    """
    Tính tổng các chữ số của số n
    """
    tong = 0
    n = abs(n)  # Lấy giá trị tuyệt đối

    while n > 0:
        tong += n % 10  # Lấy chữ số cuối
        n //= 10        # Bỏ chữ số cuối

    return tong

# Ví dụ
so = int(input("Nhập một số: "))
print(f"Tổng các chữ số của {so} là: {tong_chu_so(so)}")

6. Bài tập thực hành tại lớp

Bài 1: Tìm số hoàn hảo

Đề bài: Viết chương trình kiểm tra xem một số có phải là số hoàn hảo không. Số hoàn hảo là số bằng tổng các ước thực sự của nó (ví dụ: 6 = 1 + 2 + 3).

💡 Phân tích đề

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

  1. Nhập số cần kiểm tra từ bàn phím
  2. Tìm tất cả ước số từ 1 đến n-1 (không tính chính nó)
  3. Tính tổng các ước số này
  4. So sánh tổng với số ban đầu
  5. Kết luận có phải số hoàn hảo hay không

Input/Output mẫu:

Input Ước số Tổng ước Kết quả
6 1, 2, 3 6 Số hoàn hảo
8 1, 2, 4 7 Không phải số hoàn hảo
💡 Gợi ý code
# Nhập số cần kiểm tra
n = int(input("Nhập số cần kiểm tra: "))

# Tìm và tính tổng các ước số
tong_uoc = 0
for i in range(1, n):
    if n % i == 0:
        tong_uoc += i

# Kiểm tra và kết luận
if tong_uoc == n:
    print(f"{n} là số hoàn hảo")
else:
    print(f"{n} không phải là số hoàn hảo")

Bài 2: Đảo ngược số

Đề bài: Viết chương trình nhập vào một số nguyên và in ra số đảo ngược của nó (ví dụ: 123 → 321).

💡 Phân tích đề

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

  1. Nhập số nguyên từ bàn phím
  2. Sử dụng vòng lặp while để tách từng chữ số
  3. Lấy chữ số cuối bằng phép chia dư cho 10
  4. Ghép vào số đảo ngược: dao_nguoc = dao_nguoc * 10 + chu_so
  5. Chia số cho 10 để loại bỏ chữ số cuối

Input/Output mẫu:

Input Quá trình Output
123 3 → 32 → 321 321
1000 0 → 00 → 000 → 0001 1
💡 Gợi ý code
# Nhập số cần đảo ngược
so_ban_dau = int(input("Nhập số cần đảo ngược: "))
so = so_ban_dau
so_dao_nguoc = 0

# Đảo ngược từng chữ số
while so > 0:
    chu_so = so % 10
    so_dao_nguoc = so_dao_nguoc * 10 + chu_so
    so = so // 10

print(f"Số đảo ngược của {so_ban_dau} là: {so_dao_nguoc}")

Bài 3: Kiểm tra số palindrome

Đề bài: Viết chương trình kiểm tra xem một số có phải là palindrome không (đọc xuôi và ngược đều giống nhau, ví dụ: 121, 1331).

💡 Phân tích đề

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

  1. Nhập số cần kiểm tra
  2. Tạo bản sao để đảo ngược (giữ nguyên số gốc)
  3. Đảo ngược số như bài 2
  4. So sánh số gốc với số đảo ngược
  5. Kết luận palindrome hay không

Input/Output mẫu:

Input Đảo ngược So sánh Kết quả
121 121 121 == 121 Palindrome
123 321 123 != 321 Không palindrome
💡 Gợi ý code
# Nhập số cần kiểm tra
so_goc = int(input("Nhập số cần kiểm tra: "))
so = so_goc
so_dao_nguoc = 0

# Đảo ngược số
while so > 0:
    so_dao_nguoc = so_dao_nguoc * 10 + so % 10
    so = so // 10

# Kiểm tra palindrome
if so_goc == so_dao_nguoc:
    print(f"{so_goc} là số palindrome")
else:
    print(f"{so_goc} không phải số palindrome")

Bài 4: Thống kê ký tự trong tên

Đề bài: Viết chương trình nhập tên đầy đủ và thống kê số lượng nguyên âm, phụ âm trong tên đó.

💡 Phân tích đề

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

  1. Nhập tên đầy đủ từ bàn phím
  2. Chuyển về chữ thường để dễ xử lý
  3. Tạo danh sách nguyên âm: a, e, i, o, u
  4. Duyệt từng ký tự, kiểm tra là nguyên âm hay phụ âm
  5. Đếm và thống kê kết quả

Input/Output mẫu:

Input Nguyên âm Phụ âm Kết quả
"Nguyen Van An" u, e, a, a N, g, y, n, V, n 4 nguyên âm, 6 phụ âm
💡 Gợi ý code
# Nhập tên đầy đủ
ten = input("Nhập tên đầy đủ: ").lower()

# Danh sách nguyên âm
nguyen_am = "aeiou"
dem_nguyen_am = 0
dem_phu_am = 0

# Thống kê từng ký tự
for ky_tu in ten:
    if ky_tu.isalpha():  # Chỉ đếm chữ cái
        if ky_tu in nguyen_am:
            dem_nguyen_am += 1
        else:
            dem_phu_am += 1

print(f"Số nguyên âm: {dem_nguyen_am}")
print(f"Số phụ âm: {dem_phu_am}")

7. Bài tập về nhà

Bài 1: Chương trình quản lý điểm số

Đề bài: Viết chương trình nhập điểm của n học sinh, tính điểm trung bình và đếm số học sinh có điểm trên trung bình.

💡 Phân tích đề

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

  1. Nhập số lượng học sinh n
  2. Sử dụng vòng lặp nhập điểm từng học sinh
  3. Lưu điểm vào list và tính tổng
  4. Tính điểm trung bình = tổng / n
  5. Duyệt lại list đếm số học sinh có điểm > trung bình
  6. Hiển thị kết quả thống kê

Input/Output mẫu:

Số HS Điểm Trung bình Trên TB
3 [7.5, 8.0, 6.5] 7.33 1 học sinh

Bài 2: Tìm số Armstrong

Đề bài: Viết chương trình tìm tất cả số Armstrong có 3 chữ số. Số Armstrong là số mà tổng lập phương các chữ số bằng chính nó (ví dụ: 153 = 1³ + 5³ + 3³).

💡 Phân tích đề

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

  1. Duyệt tất cả số từ 100 đến 999 (số có 3 chữ số)
  2. Với mỗi số, tách ra 3 chữ số: hàng trăm, chục, đơn vị
  3. Tính tổng lập phương: a³ + b³ + c³
  4. So sánh với số ban đầu
  5. Nếu bằng nhau thì đó là số Armstrong
  6. In tất cả số Armstrong tìm được

Input/Output mẫu:

Số Tách chữ số Tính toán Kết quả
153 1, 5, 3 1³+5³+3³ = 153 Armstrong
370 3, 7, 0 3³+7³+0³ = 370 Armstrong

Bài 3: Phân tích chuỗi

Đề bài: Viết chương trình nhập một câu và thống kê: số từ, số ký tự in hoa, số ký tự in thường, số chữ số.

💡 Phân tích đề

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

  1. Nhập câu từ bàn phím
  2. Đếm số từ bằng cách split() và len()
  3. Duyệt từng ký tự trong câu
  4. Sử dụng isupper(), islower(), isdigit() để phân loại
  5. Tăng biến đếm tương ứng cho từng loại
  6. Hiển thị thống kê đầy đủ

Input/Output mẫu:

Câu Số từ In hoa In thường Chữ số
"Hello World 123" 3 2 8 3

Bài 4: Game đoán số nâng cao

Đề bài: Viết game đoán số với các tính năng: giới hạn số lần đoán, gợi ý "lớn hơn/nhỏ hơn", thống kê số lần chơi và tỷ lệ thắng.

💡 Phân tích đề

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

  1. Tạo số ngẫu nhiên từ 1-100
  2. Giới hạn số lần đoán (ví dụ: 7 lần)
  3. Vòng lặp nhận dự đoán và đưa ra gợi ý
  4. Kiểm tra thắng/thua sau mỗi game
  5. Lưu thống kê: tổng game, số game thắng
  6. Tính tỷ lệ thắng = (thắng / tổng) × 100%
  7. Hỏi chơi tiếp hay dừng lại

Input/Output mẫu:

Lần đoán Số bí mật Dự đoán Gợi ý
1 67 50 Lớn hơn
2 67 80 Nhỏ hơn
3 67 67 Chính xác!

Ghi chú quan trọng

Lưu ý về hiệu suất:

  • Khi kiểm tra số nguyên tố, chỉ cần kiểm tra đến căn bậc hai của số đó
  • Sử dụng break để thoát khỏi vòng lặp sớm khi tìm được kết quả
  • Với bài toán đếm, khởi tạo biến đếm = 0 trước vòng lặp

Mẹo debug:

  • In ra giá trị của biến trong vòng lặp để kiểm tra logic
  • Thử với các trường hợp đặc biệt: số 0, số 1, số âm
  • Kiểm tra điều kiện dừng của vòng lặp while

Tối ưu code:

  • Đặt tên biến có ý nghĩa
  • Thêm comment cho các đoạn code phức tạp
  • Chia nhỏ bài toán thành các hàm riêng biệt