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:
- Nhập số cần kiểm tra từ bàn phím
- Tìm tất cả ước số từ 1 đến n-1 (không tính chính nó)
- Tính tổng các ước số này
- So sánh tổng với số ban đầu
- 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:
- Nhập số nguyên từ bàn phím
- Sử dụng vòng lặp while để tách từng chữ số
- Lấy chữ số cuối bằng phép chia dư cho 10
- Ghép vào số đảo ngược: dao_nguoc = dao_nguoc * 10 + chu_so
- 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:
- Nhập số cần kiểm tra
- Tạo bản sao để đảo ngược (giữ nguyên số gốc)
- Đảo ngược số như bài 2
- So sánh số gốc với số đảo ngược
- 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:
- Nhập tên đầy đủ từ bàn phím
- Chuyển về chữ thường để dễ xử lý
- Tạo danh sách nguyên âm: a, e, i, o, u
- Duyệt từng ký tự, kiểm tra là nguyên âm hay phụ âm
- Đế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:
- Nhập số lượng học sinh n
- Sử dụng vòng lặp nhập điểm từng học sinh
- Lưu điểm vào list và tính tổng
- Tính điểm trung bình = tổng / n
- Duyệt lại list đếm số học sinh có điểm > trung bình
- 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:
- Duyệt tất cả số từ 100 đến 999 (số có 3 chữ số)
- Với mỗi số, tách ra 3 chữ số: hàng trăm, chục, đơn vị
- Tính tổng lập phương: a³ + b³ + c³
- So sánh với số ban đầu
- Nếu bằng nhau thì đó là số Armstrong
- 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:
- Nhập câu từ bàn phím
- Đếm số từ bằng cách split() và len()
- Duyệt từng ký tự trong câu
- Sử dụng isupper(), islower(), isdigit() để phân loại
- Tăng biến đếm tương ứng cho từng loại
- 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:
- Tạo số ngẫu nhiên từ 1-100
- Giới hạn số lần đoán (ví dụ: 7 lần)
- Vòng lặp nhận dự đoán và đưa ra gợi ý
- Kiểm tra thắng/thua sau mỗi game
- Lưu thống kê: tổng game, số game thắng
- Tính tỷ lệ thắng = (thắng / tổng) × 100%
- 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