Trả lời nhanh
Để kiểm tra xâu S có chứa chữ số không, em duyệt lần lượt từng kí tự ch của S; nếu gặp kí tự thỏa mãn “0” <= ch <= “9” (hoặc ch in “0123456789”) thì ghi nhận “có chữ số” và dừng vòng lặp bằng break. Sau vòng lặp, chương trình in “S có chứa chữ số” nếu đã gặp chữ số, ngược lại in “S không chứa chữ số nào”. Đây là bài Luyện tập 2 trang 122, Bài 24 Xâu kí tự, Tin học 10 Kết nối tri thức.
Đề bài và phân tích yêu cầu
Yêu cầu: viết chương trình kiểm tra xâu S có chữ số không, thông báo “S có chứa chữ số” hoặc “S không chứa chữ số nào”. Trước khi viết lệnh, em xác định:
| Thành phần | Nội dung |
|---|---|
| Đầu vào | Một xâu S bất kì nhập từ bàn phím (có thể có chữ cái, dấu cách, kí hiệu, chữ số) |
| Xử lí | Xét từng kí tự của S, kiểm tra kí tự đó có phải một trong mười chữ số 0, 1, …, 9 không |
| Đầu ra | Một trong hai thông báo: “S có chứa chữ số” hoặc “S không chứa chữ số nào” |
Ý tưởng cốt lõi: chỉ cần tìm thấy một chữ số là đủ kết luận “có chứa chữ số”. Ngược lại, muốn kết luận “không chứa chữ số nào” thì phải xét hết các kí tự. Vì vậy thông báo chỉ được in sau khi vòng lặp kết thúc, không in bên trong vòng lặp.
Kiến thức về xâu cần dùng
- Lệnh for ch in S: duyệt lần lượt từng kí tự của xâu, từ trái sang phải.
- Các kí tự có thể so sánh với nhau theo mã. Mười chữ số “0” đến “9” có mã liên tiếp nhau, nên điều kiện “0” <= ch <= “9” đúng khi và chỉ khi ch là một chữ số.
- Toán tử in kiểm tra một xâu con có nằm trong xâu khác không: ch in “0123456789”.
- len(S) cho độ dài xâu, S[i] là kí tự ở vị trí i (đánh số từ 0).
Chương trình Python hoàn chỉnh
Cách 1: Dùng biến cờ và lệnh break
S = input(“Nhập xâu S: “)
co_chu_so = False
for ch in S:
if “0” <= ch <= “9”:
co_chu_so = True
break
if co_chu_so:
print(“S có chứa chữ số”)
else:
print(“S không chứa chữ số nào”)
Biến co_chu_so (biến cờ) ban đầu là False. Khi gặp chữ số đầu tiên, cờ được bật thành True và break thoát vòng lặp ngay, không cần xét các kí tự còn lại. Cách này chạy nhanh với xâu dài có chữ số ở gần đầu.
Cách 2: Đếm số chữ số
S = input(“Nhập xâu S: “)
dem = 0
for ch in S:
if ch in “0123456789”:
dem = dem + 1
if dem > 0:
print(“S có chứa chữ số”)
else:
print(“S không chứa chữ số nào”)
Biến dem tăng 1 mỗi khi gặp chữ số. Hết vòng lặp, nếu dem > 0 thì xâu có chữ số. Cách này dài hơn một chút nhưng cho thêm thông tin (số lượng chữ số), rất tiện khi đề yêu cầu mở rộng.
Cách 3: Dùng vòng lặp while
S = input(“Nhập xâu S: “)
i = 0
while i < len(S) and not (“0” <= S[i] <= “9”):
i = i + 1
if i < len(S):
print(“S có chứa chữ số”)
else:
print(“S không chứa chữ số nào”)
Vòng while tăng i cho đến khi gặp chữ số hoặc đi hết xâu. Nếu dừng lại khi i vẫn nhỏ hơn len(S) thì S[i] chính là chữ số đầu tiên. Thứ tự điều kiện i < len(S) đứng trước là quan trọng để không truy cập vượt quá chỉ số cuối.
Cách 4: Dùng phương thức isdigit() và hàm any()
S = input(“Nhập xâu S: “)
if any(ch.isdigit() for ch in S):
print(“S có chứa chữ số”)
else:
print(“S không chứa chữ số nào”)
ch.isdigit() trả về True nếu ch là chữ số; any(…) trả về True nếu có ít nhất một phần tử đúng. Đây là cách viết gọn, phù hợp khi em đã quen Python. Lưu ý: isdigit() còn coi một số kí tự đặc biệt như số mũ “²” là chữ số, trong khi điều kiện “0” <= ch <= “9” thì không. Với bài tập ở lớp 10, hai cách cho kết quả như nhau vì dữ liệu nhập thường chỉ gồm kí tự thông thường.
Chạy thử và mô phỏng từng bước
| Xâu nhập vào | Kết quả in ra | Giải thích |
|---|---|---|
| Lop10A2 | S có chứa chữ số | Gặp chữ số “1” ở vị trí 3 |
| Tin hoc | S không chứa chữ số nào | Xét hết 7 kí tự, không có chữ số |
| a b 9 | S có chứa chữ số | Chữ số “9” ở cuối xâu, vẫn được phát hiện |
| (xâu rỗng) | S không chứa chữ số nào | Vòng lặp không chạy lần nào, cờ vẫn là False |
Mô phỏng Cách 1 với S = “Lop10A2”:
| Lần lặp | ch | “0” <= ch <= “9”? | co_chu_so |
|---|---|---|---|
| 1 | L | Sai | False |
| 2 | o | Sai | False |
| 3 | p | Sai | False |
| 4 | 1 | Đúng | True, gặp break nên dừng |
Chỉ sau 4 lần lặp chương trình đã có kết luận, không cần xét “0”, “A”, “2”.
Lỗi thường gặp khi làm bài
- In thông báo bên trong vòng lặp: viết else ngay trong for khiến chương trình in “S không chứa chữ số nào” nhiều lần, mỗi kí tự không phải chữ số in một lần. Thông báo phủ định phải đặt sau vòng lặp.
- So sánh với số thay vì kí tự: viết ch >= 0 and ch <= 9 (không có dấu nháy) sẽ báo lỗi TypeError vì không thể so sánh xâu với số nguyên. Phải dùng “0” và “9”.
- Quên gọi hàm: viết ch.isdigit thiếu cặp ngoặc thì điều kiện luôn đúng (vì đó là tên phương thức, không phải kết quả), chương trình sẽ luôn báo có chữ số.
- Chuyển S sang số: dùng int(S) để kiểm tra là sai hướng, vì xâu như “abc1” không chuyển được sang số nhưng vẫn chứa chữ số.
Mở rộng: in ra các chữ số, số lượng và vị trí
Đề kiểm tra thường nâng cấp bài này thành: in các chữ số có trong xâu, đếm số lượng và chỉ ra vị trí. Chương trình sau làm đủ ba việc:
S = input(“Nhập xâu S: “)
chu_so = “”
vi_tri = []
for i in range(len(S)):
if “0” <= S[i] <= “9”:
chu_so = chu_so + S[i]
vi_tri.append(i)
if len(chu_so) > 0:
print(“S có chứa chữ số”)
print(“Các chữ số:”, chu_so)
print(“Số lượng:”, len(chu_so))
print(“Vị trí:”, vi_tri)
else:
print(“S không chứa chữ số nào”)
Với S = “Lop10A2”, chương trình in: S có chứa chữ số; Các chữ số: 102; Số lượng: 3; Vị trí: [3, 4, 6].
Bài tập tự luyện có đáp án
- Kiểm tra xâu có chữ cái in hoa không. Gợi ý: thay điều kiện bằng “A” <= ch <= “Z”.
- Kiểm tra xâu chỉ gồm chữ số (ví dụ để kiểm tra mã số học sinh). Gợi ý: đặt cờ True, gặp kí tự không phải chữ số thì đổi thành False và break; xâu rỗng nên báo không hợp lệ.
- Tính tổng các chữ số trong xâu. Gợi ý: cộng dồn int(ch) với mỗi ch là chữ số. Với “a1b2c3” tổng là 6.
Câu hỏi thường gặp
Làm sao kiểm tra một kí tự có phải chữ số trong Python?
Dùng điều kiện "0" <= ch <= "9", hoặc ch in "0123456789", hoặc phương thức ch.isdigit().
Vì sao phải dùng break trong bài kiểm tra xâu có chữ số?
Chỉ cần gặp một chữ số là đã kết luận được, nên break giúp dừng vòng lặp sớm, chương trình chạy nhanh hơn. Không dùng break thì kết quả vẫn đúng nhưng phải duyệt hết xâu.
Vì sao không được so sánh ch >= 0 and ch <= 9?
ch là xâu còn 0 và 9 là số nguyên, Python không so sánh được hai kiểu này và báo lỗi TypeError. Phải viết "0" và "9" trong dấu nháy.
Bài kiểm tra xâu S có chữ số nằm ở đâu trong sách?
Đây là Luyện tập 2 trang 122, Bài 24 Xâu kí tự, Tin học 10 Kết nối tri thức.