Trắc Nghiệm Ôn Tập — Buổi 28: Xử Lý Xâu Ký Tự¶
Hướng dẫn: Chọn đáp án đúng nhất. Xem đáp án ở cuối trang.
Phần 1: Lý Thuyết <cctype> và Ký Tự¶
Câu 1. Thư viện nào cần được #include để gọi được hàm toupper() và tolower()?
- A.
<string> - B.
<cctype> - C.
<cmath> - D.
<algorithm>
Câu 2. Sự khác biệt giữa số nguyên 0 và ký tự '0' trong C++ là gì?
- A. Không có gì khác nhau
- B. Ký tự
'0'bản chất mang mã ASCII là48, trong khi số0thì mang giá trị bằng0trong bộ nhớ. - C. Ký tự
'0'chiếm nhiều RAM hơn - D. C++ không cho phép viết
'0'
Câu 3. Nếu tôi viết lệnh toupper(s[0]); nhưng KHÔNG gán lại, thì kết quả in ra của chuỗi s = "apple" sẽ là gì?
- A.
Apple - B.
apple(Không có gì thay đổi do hàm chỉ tính toán nội bộ rồi bị hủy đi vì không có ai nhận giá trị) - C.
APPLE - D. Báo lỗi
Câu 4. Trong bảng mã ASCII, khoảng cách giữa chữ In Hoa và In Thường của cùng 1 chữ cái (ví dụ 'A' và 'a') luôn cách nhau bao nhiêu đơn vị?
- A. 1
- B. 26
- C. 32
- D. 65
Câu 5. Hàm s.erase(5, 2) sẽ làm công việc gì?
- A. Xóa 5 ký tự tính từ vị trí thứ 2
- B. Xóa mảng
- C. Xóa 2 ký tự, bắt đầu từ vị trí Index 5
- D. Xóa toàn bộ chuỗi
Phần 2: Đọc Hiểu Mã Lệnh¶
Câu 6. Đoạn lệnh sau dùng để làm gì?
- A. Đếm số lượng chữ cái In Hoa
- B. Đếm số lượng chữ số
- C. Đếm số lượng nguyên âm
- D. Đếm số lượng chữ cái in thường (từ a đến z)
Câu 7. Đoạn lệnh sau để xóa khoảng trắng THỪA bị sai ở đâu?
- A. Sai hàm xóa
- B. Nó không chỉ xóa khoảng trắng thừa, mà nó XÓA SẠCH toàn bộ khoảng trắng trong chuỗi, làm các từ dính chặt vào nhau. (Ví dụ "Tran Van" \(\to\) "TranVan")
- C. Lỗi cú pháp
- D. Vòng lặp sai
Câu 8. Cấu trúc chuẩn để kiểm tra và viết Hoa chữ cái đầu tiên của một từ (ngoại trừ từ đầu tiên của câu) là?
- A.
if (s[i] == ' ') s[i] = toupper(s[i]); - B.
if (s[i] == ' ') s[i+1] = toupper(s[i+1]); - C.
if (s[i] == 'A') s[i] = toupper(s[i]); - D. Dùng vòng lặp
for
Câu 9. Để xóa các khoảng trắng thừa Ở CUỐI xâu, ta nên dùng vòng lặp nào?
- A.
for - B.
while (s[s.length() - 1] == ' ') - C.
do-while - D. Dùng
if
Câu 10. Nếu biến char c = 'A';, lệnh cout << c + 32; sẽ in ra màn hình cái gì? (Biết 'A' có mã ASCII là 65).
- A.
a - B.
A32 - C.
97(Vì phép cộng + chuyển kiểucharvề kiểuintđể tính toán) - D. Báo lỗi
Phần 3: Phân Tích Kỹ Năng¶
Câu 11. Số lượng "Từ" trong một chuỗi (Giả sử chuỗi đã chuẩn không có khoảng trắng thừa) luôn bằng:
- A. Số lượng khoảng trắng trừ đi 1
- B. Số lượng khoảng trắng cộng thêm 1
- C. Gấp đôi số khoảng trắng
- D. Bằng chính số khoảng trắng
Câu 12. Mật khẩu có chứa "Ít nhất 1 chữ số". Ta dùng biến cờ bool hasDigit = false;. Điều kiện trong vòng lặp for để bật cờ này là gì?
- A.
if (s[i] == 1) - B.
if (s[i] > 0) - C.
if (s[i] >= '0' && s[i] <= '9') hasDigit = true; - D.
if (s[i] == '0')
Câu 13. Trong thuật toán chuẩn hóa Chuỗi, tại sao việc đầu tiên ta nên làm là chuyển TOÀN BỘ chuỗi về chữ in thường tolower()?
- A. Để máy tính chạy nhanh hơn
- B. Để dọn dẹp các ký tự in hoa lộn xộn (ví dụ:
tRAn), tạo ra một mảng sạch (toàn chữ thường) trước khi bắt đầu áp dụng quy tắc "Viết hoa chữ đầu tiên". - C. Cho đẹp code
- D. Không cần thiết
Câu 14. Lệnh s.erase(0, 1) lặp lại nhiều lần có thể gây ảnh hưởng xấu gì đến hiệu năng?
- A. Làm crash chương trình
- B. Bản chất
eraselà gọi thuật toán Dịch Trái mảng. Nếu chuỗi có 1 triệu phần tử, xóa 1 phần tử đầu tiên sẽ bắt 999.999 phần tử còn lại dịch lên. Chạy vòng lặp xóa liên tục sẽ cực kỳ chậm (\(O(N^2)\)). - C. Không có ảnh hưởng gì
- D. Bị Out of bounds
Câu 15. Làm sao để ép C++ in ra ký tự a thay vì in ra số 97 khi thực hiện phép cộng 'A' + 32?
- A. Ép kiểu:
cout << (char)('A' + 32); - B.
cout << string('A' + 32); - C. Máy tự biết
- D. Không thể làm được
Đáp Án¶
Xem đáp án
| Câu | Đáp án | Giải thích |
|---|---|---|
| 1 | B | <cctype> chứa các hàm cực kỳ tiện lợi để phân tích và biến đổi kiểu char. |
| 2 | B | Máy tính không hiểu chữ, nó chỉ hiểu mã. Chuẩn giao tiếp này gọi là bảng mã ASCII. |
| 3 | B | Đây là lỗi thiếu phép gán =. Hàm chỉ làm nhiệm vụ tính toán trả về kết quả, ta phải tự bắt lấy. |
| 4 | C | 'A'=65, 'a'=97. Khoảng cách luôn là 32 cho mọi chữ cái tiếng Anh. |
| 5 | C | Tham số đầu là Index bắt đầu, tham số sau là độ dài đoạn muốn xóa. |
| 6 | D | Đây là cấu trúc kinh điển kiểm tra một ký tự có phải là chữ cái Tiếng Anh viết thường hay không. |
| 7 | B | Lệnh này càn quét 100% khoảng trắng. Để chuẩn hóa, bạn chỉ được phép xóa khi có HAI khoảng trắng đứng cạnh nhau s[i]==' ' && s[i+1]==' '. |
| 8 | B | Gặp khoảng trắng thì KHÔNG phải viết hoa khoảng trắng đó, mà phải với tay sang ký tự tiếp theo (i+1) để viết hoa cái chữ cái đó. |
| 9 | B | Chừng nào chữ cái cuối cùng vẫn còn là khoảng trắng, thì ta cứ vòng lặp mà gọt dần nó đi. |
| 10 | C | Trong C++, phép toán số học + sẽ đẩy char lên thành int để ngăn ngừa lỗi tràn bộ nhớ. In ra sẽ là số 97. |
| 11 | B | Trong một câu (không dư khoảng trắng), cứ có 1 khoảng trắng thì ngăn cách ra được 2 từ. 2 khoảng trắng \(\to\) 3 từ. |
| 12 | C | Điều kiện so sánh mã ASCII chuẩn mực cho chữ số. |
| 13 | B | Dọn dẹp thành giấy trắng trước, sau đó muốn tô màu (viết hoa) chỗ nào thì tô chỗ đó. Sẽ nhàn hơn rất nhiều! |
| 14 | B | Thao tác xóa mảng (Dịch trái) là ác mộng của RAM nếu dữ liệu quá to. Có những giải pháp tối ưu hơn nhưng vượt ngoài phạm vi cơ bản. |
| 15 | A | (char) là cú pháp ép kiểu (Type Casting). Ra lệnh cho máy tính dịch ngược số 97 về lại ký tự hiển thị. |