Bỏ qua

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()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ố 0 thì mang giá trị bằng 0 trong 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''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ì?

if (s[i] >= 'a' && s[i] <= 'z') {
    count++;
}
  • 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?

for (int i = 0; i < s.length(); i++) {
    if (s[i] == ' ') {
        s.erase(i, 1);
    }
}
  • 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ểu char về kiểu int để 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 erase là 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ị.