Bài tập trắc nghiệm C++ - Cơ bản
Trang này tổng hợp 200 câu hỏi trắc nghiệm C++ cơ bản, sắp xếp theo chủ đề từ dễ đến khó. Mỗi câu có 4 đáp án A/B/C/D.
Chọn một đáp án cho mỗi câu - đáp án đúng/sai và phần giải thích sẽ tự động hiện ra ngay sau khi bạn chọn.
Nhóm 1: Biến và kiểu dữ liệu
Phần tiêu đề “Nhóm 1: Biến và kiểu dữ liệu”Câu 1. Trong C++, để khai báo một biến số nguyên x có giá trị 5, ta viết:
Đáp án: B
C++ là ngôn ngữ định kiểu tĩnh (static typing), phải khai báo kiểu dữ liệu (int) khi tạo biến.
Câu 2. Kiểu dữ liệu nào dùng để lưu số thực có phần thập phân (độ chính xác đơn)?
Đáp án: B
float lưu số thực với độ chính xác đơn (single precision), còn double có độ chính xác cao hơn.
Câu 3. Kiểu dữ liệu nào dùng để lưu một ký tự đơn?
Đáp án: B
char lưu một ký tự đơn, ví dụ char c = 'A';.
Câu 4. Đoạn code sau in ra gì?
int x = 5;double y = 2.0;std::cout << x / y;Đáp án: B
Khi một trong hai toán hạng là double, phép chia được thực hiện theo kiểu số thực: 5 / 2.0 = 2.5.
Câu 5. Từ khoá nào dùng để khai báo một hằng số không thể thay đổi giá trị?
Đáp án: B
const khai báo một biến/hằng số có giá trị không thể thay đổi sau khi khởi tạo, ví dụ const int MAX = 100;.
Câu 6. Mỗi câu lệnh trong C++ phải kết thúc bằng ký tự nào?
Đáp án: B
Mỗi câu lệnh trong C++ bắt buộc kết thúc bằng dấu chấm phẩy ;.
Câu 7. Kiểu dữ liệu nào dùng để lưu giá trị đúng/sai?
Đáp án: C
bool chỉ nhận hai giá trị true hoặc false.
Câu 8. Đoạn code sau in ra gì?
bool ok = true;std::cout << ok;Đáp án: B
Mặc định, std::cout in giá trị bool dưới dạng số: true là 1, false là 0.
Câu 9. Thư viện nào cần include để sử dụng kiểu std::string?
Đáp án: B
Cần #include <string> để sử dụng kiểu std::string (dù trong nhiều trường hợp <iostream> đã include gián tiếp, nhưng cách đúng chuẩn là include <string>).
Câu 10. Đoạn code sau in ra gì?
int x = 7;x = "bảy";std::cout << x;Đáp án: C
C++ định kiểu tĩnh, không thể gán một chuỗi ký tự cho biến kiểu int - trình biên dịch sẽ báo lỗi.
Nhóm 2: Toán tử số học
Phần tiêu đề “Nhóm 2: Toán tử số học”Câu 11. Đoạn code sau in ra gì?
int a = 10, b = 3;std::cout << a / b;Đáp án: A
Khi cả hai toán hạng đều là int, phép chia / là chia lấy phần nguyên: 10 / 3 = 3.
Câu 12. Đoạn code sau in ra gì?
int a = 10, b = 3;std::cout << a % b;Đáp án: B
% là toán tử lấy phần dư của phép chia nguyên: 10 % 3 = 1.
Câu 13. C++ có toán tử luỹ thừa riêng (giống ****** của Python) không?
Đáp án: C
C++ không có toán tử luỹ thừa riêng; cần dùng hàm pow(cơ_số, số_mũ) từ thư viện <cmath>.
Câu 14. Đoạn code sau in ra gì?
int a = 5;a += 3;std::cout << a;Đáp án: C
a += 3 tương đương a = a + 3, nên a = 5 + 3 = 8.
Câu 15. Toán tử ++ dùng để làm gì?
Đáp án: B
++ là toán tử tăng (increment), x++ hoặc ++x đều làm tăng x thêm 1.
Câu 16. Đoạn code sau in ra gì?
int x = 5;std::cout << x++;std::cout << x;Đáp án: A
x++ (hậu tố) trả về giá trị hiện tại của x (5) rồi mới tăng lên 6. Dòng đầu in 5, dòng sau in 6 → 56.
Câu 17. Đoạn code sau in ra gì?
int x = 5;std::cout << ++x;std::cout << x;Đáp án: B
++x (tiền tố) tăng x lên 6 trước rồi mới trả về giá trị, nên cả hai lần in đều ra 6 → 66.
Câu 18. Đoạn code sau in ra gì?
std::cout << 3 + 4 * 2;Đáp án: B
Toán tử * có độ ưu tiên cao hơn +: 4 * 2 = 8, sau đó 3 + 8 = 11.
Câu 19. Hàm nào (thuộc <cmath>) dùng để tính căn bậc hai?
Đáp án: B
sqrt(x) trong thư viện <cmath> trả về căn bậc hai của x.
Câu 20. Đoạn code sau in ra gì?
int a = 7 / 2;std::cout << a;Đáp án: B
7 / 2 là phép chia nguyên (cả hai toán hạng đều int), kết quả 3 (phần thập phân bị cắt bỏ), rồi gán vào biến int a.
Nhóm 3: Toán tử so sánh và logic
Phần tiêu đề “Nhóm 3: Toán tử so sánh và logic”Câu 21. Toán tử nào dùng để so sánh bằng nhau trong C++?
Đáp án: B
= là toán tử gán, == mới là toán tử so sánh bằng.
Câu 22. Đoạn code sau in ra gì?
int x = 5;if (x = 10) { std::cout << "Vào if";}Đáp án: B
Đây là lỗi thường gặp: x = 10 là phép gán, không phải so sánh. Biểu thức gán trả về giá trị 10 (khác 0, tức true), nên khối if vẫn được thực thi. Đây là lý do cần cẩn thận dùng == khi so sánh.
Câu 23. Đoạn code sau in ra gì?
bool a = (5 > 3) && (2 > 4);std::cout << a;Đáp án: B
5 > 3 là true, 2 > 4 là false. && (AND) cần cả hai đúng mới ra true. Kết quả false được in ra dưới dạng số 0.
Câu 24. Đoạn code sau in ra gì?
bool a = (5 > 3) || (2 > 4);std::cout << a;Đáp án: A
|| (OR) chỉ cần một điều kiện đúng. 5 > 3 là true, nên kết quả là true, in ra 1.
Câu 25. Toán tử nào dùng để phủ định một biểu thức logic?
Đáp án: A
! là toán tử NOT (phủ định) trong C++, ví dụ !true là false.
Câu 26. Toán tử nào dùng để kiểm tra khác nhau giữa hai giá trị?
Đáp án: B
!= là toán tử so sánh khác nhau.
Câu 27. Đoạn code sau in ra gì?
int x = 7;std::cout << (x >= 7 && x <= 10);Đáp án: A
x >= 7 là true, x <= 10 là true, && của hai true cho true, in ra 1.
Câu 28. Trong C++, giá trị nào của kiểu int được coi là false khi dùng trong điều kiện?
Đáp án: B
Trong C++, chỉ giá trị 0 được coi là false; mọi giá trị khác 0 (kể cả số âm) đều được coi là true.
Câu 29. Đoạn code sau in ra gì?
std::cout << !(5 > 3);Đáp án: B
5 > 3 là true, !true là false, in ra 0.
Câu 30. Đoạn code sau in ra gì?
int a = 5, b = 10;std::cout << (a != b);Đáp án: A
a và b khác giá trị nên a != b là true, in ra 1.
Nhóm 4: Nhập/Xuất dữ liệu với cin/cout
Phần tiêu đề “Nhóm 4: Nhập/Xuất dữ liệu với cin/cout”Câu 31. Đối tượng nào dùng để xuất dữ liệu ra màn hình trong C++?
Đáp án: B
std::cout (thuộc <iostream>) dùng kết hợp toán tử << để xuất dữ liệu ra màn hình.
Câu 32. Đối tượng nào dùng để nhập dữ liệu từ bàn phím trong C++?
Đáp án: B
std::cin kết hợp toán tử >> dùng để nhập dữ liệu từ bàn phím.
Câu 33. Đoạn code sau in ra gì?
std::cout << "Hello" << " " << "World";Đáp án: B
Toán tử << có thể nối tiếp nhiều lần để xuất nhiều giá trị liên tiếp, không tự thêm khoảng trắng - ở đây khoảng trắng được thêm thủ công bằng " ".
Câu 34. Để xuống dòng khi in ra màn hình, ta dùng cú pháp nào?
Đáp án: A
Cả "\n" (ký tự xuống dòng) và std::endl (xuống dòng + flush buffer) đều dùng để xuống dòng khi in.
Câu 35. Đoạn code sau in ra gì (người dùng nhập 10 khi chạy)?
int x;std::cin >> x;std::cout << x + 5;Đáp án: B
std::cin >> x đọc giá trị 10 vào biến x, sau đó x + 5 = 15 được in ra.
Câu 36. Đoạn code sau in ra gì?
int a = 1, b = 2, c = 3;std::cout << a << b << c;Đáp án: B
<< nối tiếp không tự thêm khoảng trắng, nên các giá trị 1, 2, 3 được in liền nhau thành 123.
Câu 37. Thư viện nào cần include để dùng std::cin/std::cout?
Đáp án: B
std::cin và std::cout được định nghĩa trong thư viện <iostream>.
Câu 38. Đoạn code sau in ra gì (người dùng nhập 5 và 3)?
int a, b;std::cin >> a >> b;std::cout << a + b;Đáp án: B
std::cin >> a >> b cho phép đọc liên tiếp nhiều giá trị (cách nhau bởi khoảng trắng hoặc Enter), a = 5, b = 3, tổng a + b = 8.
Câu 39. Namespace std dùng để làm gì?
Đáp án: B
std là namespace (không gian tên) chứa các thành phần thuộc thư viện chuẩn C++ (Standard Library), giúp tránh xung đột tên với code của lập trình viên.
Câu 40. Dòng using namespace std; có tác dụng gì?
Đáp án: B
Sau khi khai báo using namespace std;, có thể viết cout thay vì std::cout.
Nhóm 5: Câu lệnh rẽ nhánh if - else
Phần tiêu đề “Nhóm 5: Câu lệnh rẽ nhánh if - else”Câu 41. Cú pháp if nào sau đây đúng trong C++?
Đáp án: B
C++ yêu cầu điều kiện trong dấu ngoặc đơn (), khối lệnh trong dấu ngoặc nhọn {}.
Câu 42. Đoạn code sau in ra gì?
int x = 7;if (x > 10) { std::cout << "Lon";} else if (x > 5) { std::cout << "Trung binh";} else { std::cout << "Nho";}Đáp án: B
x = 7 không lớn hơn 10 nhưng lớn hơn 5, nên nhánh else if (x > 5) được thực thi.
Câu 43. Toán tử ba ngôi (conditional operator) trong C++ có cú pháp như thế nào?
Đáp án: A
C++ dùng cú pháp condition ? giá_trị_nếu_đúng : giá_trị_nếu_sai.
Câu 44. Đoạn code sau in ra gì?
int x = 15;std::string ketQua = (x % 2 == 0) ? "chan" : "le";std::cout << ketQua;Đáp án: B
15 % 2 = 1, khác 0 nên điều kiện sai, kết quả là "le".
Câu 45. Đoạn code sau in ra gì?
int x = 5;if (x > 0) { if (x > 10) { std::cout << "A"; } else { std::cout << "B"; }} else { std::cout << "C";}Đáp án: B
x = 5 > 0 đúng nên vào khối if ngoài. Bên trong, x > 10 sai nên vào else, in ra "B".
Câu 46. switch trong C++ dùng để thay thế cho cấu trúc nào khi cần so sánh một biến với nhiều giá trị cố định?
Đáp án: B
switch là cách viết gọn hơn cho chuỗi nhiều if - else if khi so sánh cùng một biến với nhiều giá trị.
Câu 47. Từ khoá nào cần có ở cuối mỗi case trong switch để tránh “rơi” (fall-through) xuống case tiếp theo?
Đáp án: B
Nếu thiếu break, chương trình sẽ tiếp tục thực thi các case tiếp theo dù không khớp điều kiện.
Câu 48. Đoạn code sau in ra gì?
int diem = 85;if (diem >= 90) { std::cout << "Gioi";} else if (diem >= 80) { std::cout << "Kha";} else if (diem >= 65) { std::cout << "Trung binh";} else { std::cout << "Yeu";}Đáp án: B
diem = 85 không đủ >= 90 nhưng thoả >= 80, nên in ra "Kha".
Câu 49. Nếu khối lệnh trong if chỉ có một câu lệnh duy nhất, có bắt buộc dùng dấu ngoặc nhọn {} không?
Đáp án: B
C++ cho phép bỏ {} nếu khối lệnh chỉ có một câu lệnh, nhưng việc này dễ gây lỗi khi sửa code sau này nên thường được khuyến khích luôn dùng {}.
Câu 50. Đoạn code sau in ra gì?
int x = 0;if (x) { std::cout << "True nhanh";} else { std::cout << "False nhanh";}Đáp án: B
Giá trị 0 được coi là false trong điều kiện, nên chương trình vào nhánh else.
Nhóm 6: Vòng lặp for
Phần tiêu đề “Nhóm 6: Vòng lặp for”Câu 51. Cú pháp vòng lặp for cơ bản trong C++ gồm mấy phần, cách nhau bởi dấu gì?
Đáp án: B
Cú pháp: for (khởi_tạo; điều_kiện; cập_nhật) { ... }.
Câu 52. Đoạn code sau in ra gì?
for (int i = 0; i < 5; i++) { std::cout << i << " ";}Đáp án: B
i chạy từ 0, tăng dần, dừng khi i < 5 không còn đúng (tức khi i = 5), nên in ra 0, 1, 2, 3, 4.
Câu 53. Đoạn code sau in ra gì?
for (int i = 2; i < 6; i++) { std::cout << i << " ";}Đáp án: A
i bắt đầu từ 2, lặp khi i < 6, in ra 2, 3, 4, 5.
Câu 54. Đoạn code sau in ra gì?
for (int i = 0; i < 10; i += 2) { std::cout << i << " ";}Đáp án: B
Bước nhảy là i += 2, i bắt đầu từ 0, lặp khi i < 10, in ra 0, 2, 4, 6, 8.
Câu 55. Đoạn code sau in ra tổng bằng bao nhiêu?
int tong = 0;for (int i = 1; i < 5; i++) { tong += i;}std::cout << tong;Đáp án: A
i chạy 1, 2, 3, 4. Tổng: 1 + 2 + 3 + 4 = 10.
Câu 56. Từ khoá nào dùng để thoát khỏi vòng lặp for trước khi nó kết thúc tự nhiên?
Đáp án: C
break dừng vòng lặp ngay lập tức.
Câu 57. Từ khoá nào dùng để bỏ qua phần còn lại của lần lặp hiện tại và chuyển sang lần lặp kế tiếp?
Đáp án: B
continue chuyển ngay sang lần lặp tiếp theo, bỏ qua các lệnh còn lại trong lần lặp hiện tại.
Câu 58. Đoạn code sau in ra gì?
for (int i = 0; i < 5; i++) { if (i == 3) break; std::cout << i << " ";}Đáp án: A
Khi i == 3, break dừng vòng lặp ngay, nên chỉ in 0, 1, 2 trước đó.
Câu 59. Đoạn code sau in ra gì?
for (int i = 0; i < 5; i++) { if (i == 2) continue; std::cout << i << " ";}Đáp án: A
Khi i == 2, continue bỏ qua std::cout, các giá trị còn lại được in bình thường: 0, 1, 3, 4.
Câu 60. Vòng lặp for (int i = 5; i > 0; i–) in ra dãy số nào?
Đáp án: B
i bắt đầu từ 5, giảm dần (i--), lặp khi i > 0, in ra 5, 4, 3, 2, 1.
Nhóm 7: Vòng lặp while và do-while
Phần tiêu đề “Nhóm 7: Vòng lặp while và do-while”Câu 61. Đoạn code sau in ra gì?
int i = 0;while (i < 3) { std::cout << i << " "; i++;}Đáp án: A
Vòng lặp chạy khi i < 3, in 0, 1, 2; khi i = 3 điều kiện sai nên dừng.
Câu 62. Sự khác biệt chính giữa while và do-while là gì?
Đáp án: A
do-while luôn thực hiện khối lệnh ít nhất một lần trước khi kiểm tra điều kiện, khác với while kiểm tra điều kiện trước khi thực hiện.
Câu 63. Đoạn code sau in ra gì?
int i = 10;do { std::cout << i << " ";} while (i < 5);Đáp án: A
do-while luôn chạy khối lệnh ít nhất một lần (in ra 10), sau đó mới kiểm tra i < 5 - sai nên dừng ngay.
Câu 64. Đoạn code nào sau đây gây ra lặp vô hạn?
Đáp án: B
Vòng lặp này không cập nhật i, nên i luôn bằng 0 và điều kiện i < 5 luôn đúng - gây lặp vô hạn.
Câu 65. Đoạn code sau in ra tổng bao nhiêu?
int tong = 0, i = 1;while (i <= 5) { tong += i; i++;}std::cout << tong;Đáp án: B
Vòng lặp cộng dồn 1 + 2 + 3 + 4 + 5 = 15.
Câu 66. while (true) { ... } kết hợp với lệnh nào để dừng lại khi cần?
Đáp án: B
while (true) tạo vòng lặp vô hạn, cần break bên trong (thường sau if) để thoát ra khi điều kiện mong muốn xảy ra.
Câu 67. Đoạn code sau in ra gì?
int i = 10;while (i > 0) { if (i == 5) break; std::cout << i << " "; i--;}Đáp án: A
i giảm dần từ 10; khi i == 5, break dừng ngay trước khi in 5, nên đã in 10, 9, 8, 7, 6.
Câu 68. Đoạn code sau in ra gì?
int dem = 0;while (dem < 3) { dem++;}std::cout << dem;Đáp án: C
dem tăng dần 0, 1, 2, 3. Khi dem = 3, điều kiện dem < 3 sai nên dừng, giá trị cuối cùng là 3.
Câu 69. do-while khác for và while ở điểm nào về cú pháp?
Đáp án: A
Cú pháp do { ... } while (điều_kiện); đặt điều kiện ở cuối, và bắt buộc có dấu ; sau while (...).
Câu 70. Đoạn code sau in ra gì?
int i = 0;do { std::cout << i << " "; i++;} while (i < 3);Đáp án: A
Vòng lặp do-while in 0, 1, 2 rồi dừng khi i = 3 (điều kiện i < 3 sai).
Nhóm 8: Mảng (array) cơ bản
Phần tiêu đề “Nhóm 8: Mảng (array) cơ bản”Câu 71. Cú pháp nào dùng để khai báo một mảng gồm 5 số nguyên?
Đáp án: A
Cú pháp khai báo mảng tĩnh trong C++: kiểu_dữ_liệu tên_mảng[kích_thước];.
Câu 72. Đoạn code sau in ra gì?
int arr[3] = {10, 20, 30};std::cout << arr[0];Đáp án: A
Chỉ số mảng trong C++ bắt đầu từ 0, arr[0] là phần tử đầu tiên: 10.
Câu 73. Đoạn code sau in ra gì?
int arr[5] = {1, 2, 3, 4, 5};std::cout << arr[4];Đáp án: B
Mảng có 5 phần tử với chỉ số từ 0 đến 4; arr[4] là phần tử cuối cùng: 5.
Câu 74. Đoạn code sau in ra gì?
int arr[3] = {1, 2, 3};std::cout << arr[3];Đáp án: C
Mảng chỉ có chỉ số hợp lệ từ 0 đến 2. Truy cập arr[3] là truy cập ngoài phạm vi (out of bounds) - C++ không tự kiểm tra lỗi này, kết quả là hành vi không xác định (undefined behavior).
Câu 75. Hàm/thao tác nào dùng để lấy số phần tử của một mảng tĩnh khai báo kiểu int arr[10]?
Đáp án: C
Mảng kiểu C-style (int arr[10]) không có sẵn phương thức lấy độ dài; cách phổ biến là dùng sizeof(arr) / sizeof(arr[0]).
Câu 76. Đoạn code sau in ra gì?
int arr[3] = {1, 2, 3};for (int i = 0; i < 3; i++) { std::cout << arr[i] << " ";}Đáp án: A
Vòng lặp for duyệt qua từng chỉ số từ 0 đến 2, in ra lần lượt các phần tử 1, 2, 3.
Câu 77. std::vector<int> khác int arr[] (mảng C-style) ở điểm nào?
Đáp án: B
std::vector là mảng động, có thể thêm/xoá phần tử và tự động thay đổi kích thước, khác với mảng C-style có kích thước cố định.
Câu 78. Đoạn code sau in ra gì?
#include <vector>std::vector<int> v = {1, 2, 3};v.push_back(4);std::cout << v.size();Đáp án: B
push_back(4) thêm 4 vào cuối vector, size() trả về số phần tử hiện có: 4.
Câu 79. Mảng 2 chiều int arr[3][4] có bao nhiêu phần tử tất cả?
Đáp án: D
Mảng 2 chiều có 3 hàng, mỗi hàng 4 cột, tổng số phần tử là 3 * 4 = 12.
Câu 80. Đoạn code sau in ra gì?
int arr[5] = {1, 2, 3};std::cout << arr[4];Đáp án: B
Khi khởi tạo mảng với ít giá trị hơn kích thước khai báo, các phần tử còn lại (nếu ít nhất một phần tử được khởi tạo tường minh) sẽ tự động được gán giá trị 0.
Nhóm 9: Chuỗi (string) cơ bản
Phần tiêu đề “Nhóm 9: Chuỗi (string) cơ bản”Câu 81. Đoạn code sau in ra gì?
#include <string>std::string s = "Xin chao";std::cout << s.length();Đáp án: B
.length() (hoặc .size()) trả về số ký tự trong chuỗi, "Xin chao" có 8 ký tự.
Câu 82. Đoạn code sau in ra gì?
std::string s = "Cpp";std::cout << s[0];Đáp án: A
Chỉ số bắt đầu từ 0, s[0] là ký tự đầu tiên 'C'.
Câu 83. Toán tử + giữa hai std::string thực hiện thao tác gì?
Đáp án: B
std::string hỗ trợ nạp chồng toán tử + để nối hai chuỗi.
Câu 84. Đoạn code sau in ra gì?
std::string a = "Xin";std::string b = "chao";std::cout << a + " " + b;Đáp án: B
Toán tử + nối các chuỗi theo đúng thứ tự, kết quả là "Xin chao".
Câu 85. Đoạn code sau in ra gì?
std::string s = "Hello";for (char c : s) { std::cout << c;}Đáp án: A
Vòng lặp for (char c : s) (range-based for) duyệt qua từng ký tự của chuỗi theo thứ tự, in lại đúng "Hello".
Câu 86. Thư viện <cstring> cung cấp các hàm xử lý cho kiểu chuỗi nào?
Đáp án: B
<cstring> cung cấp các hàm như strlen(), strcpy(), strcmp(),… dùng cho chuỗi kiểu C-style, khác với std::string.
Câu 87. Đoạn code sau in ra gì?
std::string s = "Hello World";std::cout << s.substr(0, 5);Đáp án: A
s.substr(vị_trí_bắt_đầu, số_ký_tự) lấy 5 ký tự bắt đầu từ vị trí 0: "Hello".
Câu 88. Đoạn code sau in ra gì?
std::string s = "abc";s[0] = 'z';std::cout << s;Đáp án: B
Khác với chuỗi trong Python, std::string trong C++ là kiểu có thể thay đổi (mutable), có thể gán lại giá trị cho từng ký tự thông qua chỉ số.
Câu 89. Hàm nào dùng để so sánh hai chuỗi std::string (trả về 0 nếu bằng nhau)?
Đáp án: B
s1.compare(s2) trả về 0 nếu hai chuỗi bằng nhau, âm nếu s1 nhỏ hơn, dương nếu s1 lớn hơn (theo thứ tự từ điển). Ngoài ra có thể dùng trực tiếp toán tử ==.
Câu 90. Đoạn code sau in ra gì?
std::string s = "Xin chao";s += "!";std::cout << s;Đáp án: B
+= nối thêm chuỗi "!" vào cuối s.
Nhóm 10: Hàm (function) cơ bản
Phần tiêu đề “Nhóm 10: Hàm (function) cơ bản”Câu 91. Cú pháp khai báo một hàm trong C++ cần có những thành phần nào?
Đáp án: B
Cú pháp: kiểu_trả_về tên_hàm(danh_sách_tham_số) { ... }.
Câu 92. Đoạn code sau in ra gì?
int cong(int a, int b) { return a + b;}
int main() { std::cout << cong(3, 4); return 0;}Đáp án: B
Hàm cong trả về tổng hai tham số: 3 + 4 = 7.
Câu 93. Hàm không trả về giá trị nào (không có return giá trị) cần khai báo kiểu trả về là gì?
Đáp án: C
void là kiểu dùng khi hàm không trả về giá trị nào.
Câu 94. Hàm nào bắt buộc phải có trong mọi chương trình C++ (chương trình bắt đầu chạy từ đây)?
Đáp án: B
Chương trình C++ luôn bắt đầu thực thi từ hàm main().
Câu 95. Đoạn code sau in ra gì?
void chao(std::string ten = "ban") { std::cout << "Xin chao, " << ten << "!";}
int main() { chao(); return 0;}Đáp án: A
ten = "ban" là giá trị tham số mặc định, được dùng khi gọi hàm mà không truyền đối số.
Câu 96. Đoạn code sau in ra gì?
int nhan(int a, int b) { int ketQua = a * b; return ketQua;}
int main() { int x = nhan(2, 5); std::cout << x; return 0;}Đáp án: A
Hàm nhan trả về tích 2 * 5 = 10, gán vào biến x.
Câu 97. Biến khai báo bên trong một hàm (local variable) có thể được truy cập từ hàm khác không?
Đáp án: B
Biến cục bộ (local variable) chỉ tồn tại trong phạm vi (scope) của hàm mà nó được khai báo.
Câu 98. Đoạn code sau in ra gì?
std::string kiemTraChanLe(int n) { if (n % 2 == 0) { return "chan"; } else { return "le"; }}
int main() { std::cout << kiemTraChanLe(7); return 0;}Đáp án: B
7 % 2 = 1, khác 0 nên hàm trả về "le".
Câu 99. Để truyền tham số vào hàm sao cho hàm có thể thay đổi trực tiếp giá trị biến gốc ở nơi gọi, nên dùng cách truyền tham số nào?
Đáp án: B
Truyền theo tham chiếu (ví dụ void f(int &a)) cho phép hàm thay đổi trực tiếp giá trị của biến gốc, khác với truyền theo giá trị chỉ tạo bản sao.
Câu 100. Đoạn code sau in ra gì?
void tang(int &x) { x = x + 1;}
int main() { int a = 5; tang(a); std::cout << a; return 0;}Đáp án: B
Tham số x được truyền theo tham chiếu (int &x), nên thay đổi x bên trong hàm tang cũng làm thay đổi trực tiếp biến a ở main. Sau khi gọi tang(a), a trở thành 6.
Nhóm 11: Toán tử gán, tăng/giảm và toán tử ba ngôi
Phần tiêu đề “Nhóm 11: Toán tử gán, tăng/giảm và toán tử ba ngôi”Câu 101. Đoạn code sau in ra gì?
int x = 5;x += 3;std::cout << x;Đáp án: B
x += 3; tương đương x = x + 3;, nên x từ 5 thành 8.
Câu 102. Đoạn code sau in ra gì?
int x = 10;x -= 4;std::cout << x;Đáp án: C
x -= 4; tương đương x = x - 4;, nên x từ 10 thành 6.
Câu 103. Đoạn code sau in ra gì?
int x = 2;x *= 5;std::cout << x;Đáp án: D
x *= 5; tương đương x = x * 5;, nên x từ 2 thành 10.
Câu 104. Đoạn code sau in ra gì?
int x = 20;x /= 4;std::cout << x;Đáp án: A
x /= 4; tương đương x = x / 4;, nên x từ 20 thành 5.
Câu 105. Đoạn code sau in ra gì?
int x = 7;x %= 3;std::cout << x;Đáp án: B
x %= 3; tương đương x = x % 3;. 7 % 3 dư 1, nên x bằng 1.
Câu 106. Đoạn code sau in ra gì?
int a = 5;int b = a++;std::cout << a << " " << b;Đáp án: C
a++ là hậu tố (post-increment): b nhận giá trị của a trước khi tăng (5), sau đó a mới tăng lên 6.
Câu 107. Đoạn code sau in ra gì?
int a = 5;int b = ++a;std::cout << a << " " << b;Đáp án: D
++a là tiền tố (pre-increment): a tăng lên 6 trước, rồi b mới nhận giá trị đó, nên cả a và b đều bằng 6.
Câu 108. Đoạn code sau in ra gì?
int x = 5;std::cout << (x > 3 ? "Lon" : "Nho");Đáp án: A
Toán tử ba ngôi dieu_kien ? gia_tri_1 : gia_tri_2 trả về "Lon" vì x > 3 (5 > 3) đúng.
Câu 109. Đoạn code sau in ra gì?
int a = 5, b = 10;int max = (a > b) ? a : b;std::cout << max;Đáp án: B
a > b (5 > 10) sai, nên toán tử ba ngôi trả về giá trị sau dấu :, tức b là 10.
Câu 110. Đoạn code sau in ra gì?
int x = 5;x++;++x;std::cout << x;Đáp án: C
Khi đứng riêng một câu lệnh, x++ và ++x đều chỉ tăng x thêm 1. Sau hai lần tăng, x từ 5 thành 7.
Nhóm 12: Ép kiểu dữ liệu và hằng số
Phần tiêu đề “Nhóm 12: Ép kiểu dữ liệu và hằng số”Câu 111. Từ khóa nào dùng để khai báo một hằng số (giá trị không thể thay đổi) trong C++?
Đáp án: A
Từ khóa const dùng để khai báo hằng số, ví dụ const int X = 10;. Sau khi gán, giá trị không thể thay đổi.
Câu 112. Đoạn code sau in ra gì?
double d = 9.7;int x = (int)d;std::cout << x;Đáp án: B
Ép kiểu double sang int chỉ giữ lại phần nguyên (cắt bỏ phần thập phân, không làm tròn), nên 9.7 thành 9.
Câu 113. Đoạn code sau in ra gì?
int a = 7, b = 2;double x = (double)a / b;std::cout << x;Đáp án: D
Ép a sang double trước khi chia khiến phép chia trở thành phép chia số thực: 7.0 / 2 = 3.5.
Câu 114. Đoạn code sau xảy ra điều gì?
const int X = 10;X = 20;std::cout << X;Đáp án: C
X được khai báo là const, nên không thể gán lại giá trị mới. Trình biên dịch báo lỗi tại dòng X = 20;.
Câu 115. Đoạn code sau in ra gì?
int x = 65;char c = (char)x;std::cout << c;Đáp án: B
Mã ASCII 65 tương ứng với ký tự 'A'. Ép kiểu int sang char diễn giải số nguyên theo bảng mã ASCII.
Câu 116. Đoạn code sau in ra gì?
char c = 'A';int x = (int)c;std::cout << x;Đáp án: A
Ép kiểu char sang int trả về mã ASCII của ký tự. Mã ASCII của 'A' là 65.
Câu 117. Đoạn code sau in ra gì?
double x = static_cast<double>(7) / 2;std::cout << x;Đáp án: C
static_cast<double>(7) ép 7 thành 7.0, khiến phép chia trở thành phép chia số thực: 7.0 / 2 = 3.5.
Câu 118. Đoạn code sau in ra gì?
bool b = (bool)5;std::cout << b;Đáp án: B
Bất kỳ số khác 0 nào khi ép sang bool đều thành true, và khi in ra bằng cout, true hiển thị là 1.
Câu 119. Đoạn code sau in ra gì?
int x = 3.99;std::cout << x;Đáp án: A
Gán giá trị double cho biến int sẽ tự động cắt bỏ phần thập phân (không làm tròn), nên x bằng 3.
Câu 120. Trong C++, phép ép kiểu tường minh (explicit casting) có thể được viết dưới dạng nào?
Đáp án: D
C++ hỗ trợ cả ba cú pháp: ép kiểu kiểu C (int)x, ép kiểu kiểu hàm int(x), và static_cast<int>(x) — cách được khuyến khích vì an toàn và rõ ràng hơn.
Nhóm 13: Câu lệnh switch-case
Phần tiêu đề “Nhóm 13: Câu lệnh switch-case”Câu 121. Từ khóa nào cần dùng trong mỗi case để tránh chương trình “rơi” (fall-through) xuống case tiếp theo?
Đáp án: A
break thoát khỏi khối switch ngay khi gặp, ngăn chương trình chạy tiếp xuống các case phía dưới.
Câu 122. Đoạn code sau in ra gì?
int x = 2;switch (x) { case 1: std::cout << "Mot"; break; case 2: std::cout << "Hai"; break; default: std::cout << "Khac";}Đáp án: C
x bằng 2 nên khớp case 2, in ra "Hai" rồi gặp break thoát khỏi switch.
Câu 123. Đoạn code sau in ra gì?
int x = 5;switch (x) { case 1: std::cout << "A"; case 2: std::cout << "B"; default: std::cout << "C";}Đáp án: B
x = 5 không khớp case 1 hay case 2, nên rơi thẳng vào default, chỉ in ra "C".
Câu 124. Đoạn code sau in ra gì?
int x = 1;switch (x) { case 1: std::cout << "A"; case 2: std::cout << "B"; break; case 3: std::cout << "C";}Đáp án: D
x = 1 khớp case 1, in "A"; vì case 1 không có break nên rơi tiếp xuống case 2, in "B", rồi gặp break dừng lại. Kết quả: "AB".
Câu 125. switch trong C++ có thể dùng với kiểu dữ liệu nào?
Đáp án: A
switch chuẩn C++ chỉ so sánh với các giá trị kiểu số nguyên hoặc char (và enum); không dùng được với double, float hay string.
Câu 126. Nếu switch không có default và giá trị không khớp case nào, điều gì xảy ra?
Đáp án: B
default không bắt buộc. Nếu không có và không có case nào khớp, switch không thực thi gì và chương trình tiếp tục ở lệnh sau khối switch.
Câu 127. Đoạn code sau in ra gì?
char c = 'b';switch (c) { case 'a': std::cout << "A"; break; case 'b': std::cout << "B"; break; default: std::cout << "?";}Đáp án: C
c bằng 'b', khớp case 'b', in ra "B".
Câu 128. Khác với if-else, switch-case chỉ so sánh giá trị theo kiểu nào?
Đáp án: A
switch chỉ kiểm tra xem biến có bằng một hằng số cụ thể ở mỗi case hay không; muốn so sánh khoảng giá trị phải dùng if-else.
Câu 129. Đoạn code sau in ra gì?
int diem = 8;switch (diem / 2) { case 5: case 4: std::cout << "Gioi"; break; case 3: std::cout << "Kha"; break; default: std::cout << "TB";}Đáp án: D
diem / 2 (chia lấy nguyên) bằng 4. case 5 không có lệnh nên rơi xuống case 4, khớp và in ra "Gioi".
Câu 130. Từ khóa nào dùng để chỉ định nhánh xử lý mặc định khi không có case nào khớp?
Đáp án: B
default là nhánh được thực thi khi giá trị của biểu thức trong switch không khớp với bất kỳ case nào.
Nhóm 14: Phạm vi biến (scope)
Phần tiêu đề “Nhóm 14: Phạm vi biến (scope)”Câu 131. Biến khai báo bên trong một hàm được gọi là gì?
Đáp án: B
Biến khai báo bên trong một hàm (hoặc khối lệnh) chỉ tồn tại trong phạm vi đó, gọi là biến cục bộ (local).
Câu 132. Đoạn code sau in ra gì?
int x = 10;
void f() { int x = 20; std::cout << x;}
int main() { f(); return 0;}Đáp án: A
Biến x cục bộ trong hàm f che khuất (shadow) biến x toàn cục, nên cout in ra giá trị của biến cục bộ là 20.
Câu 133. Đoạn code sau in ra gì?
int x = 10;
void f() { std::cout << x;}
int main() { f(); return 0;}Đáp án: C
Hàm f không có biến x cục bộ, nên nó truy cập trực tiếp biến x toàn cục và in ra 10.
Câu 134. Biến khai báo trong khối {} của một vòng lặp for chỉ tồn tại ở đâu?
Đáp án: D
Biến khai báo bên trong {} chỉ có phạm vi trong khối lệnh đó; ra khỏi khối, biến không còn tồn tại.
Câu 135. Từ khóa static khi dùng cho một biến cục bộ trong hàm có tác dụng gì?
Đáp án: B
Biến cục bộ static chỉ được khởi tạo một lần và giữ nguyên giá trị giữa các lần gọi hàm, thay vì bị tạo lại mỗi lần.
Câu 136. Đoạn code sau in ra gì?
void dem() { static int count = 0; count++; std::cout << count << " ";}
int main() { dem(); dem(); dem(); return 0;}Đáp án: A
count là biến static, chỉ khởi tạo 0 một lần duy nhất; mỗi lần gọi dem() sẽ giữ giá trị từ lần trước và tăng thêm 1, cho kết quả 1 2 3.
Câu 137. Đoạn code sau in ra gì?
void dem() { int count = 0; count++; std::cout << count << " ";}
int main() { dem(); dem(); dem(); return 0;}Đáp án: C
Không có static, count được tạo mới và khởi tạo lại về 0 ở mỗi lần gọi hàm, nên mỗi lần gọi đều in ra 1.
Câu 138. Biến toàn cục (global) thường được khai báo ở đâu?
Đáp án: B
Biến toàn cục được khai báo bên ngoài mọi hàm (thường ở đầu file), và có thể được truy cập từ mọi hàm trong chương trình.
Câu 139. Đoạn code sau xảy ra điều gì?
int main() { { int x = 5; std::cout << x; } std::cout << x; return 0;}Đáp án: C
Biến x chỉ tồn tại trong khối {} đầu tiên. Dòng cout << x; thứ hai nằm ngoài khối đó nên x không còn tồn tại, gây lỗi biên dịch.
Câu 140. Ưu điểm của việc giới hạn phạm vi (scope) của biến càng nhỏ càng tốt là gì?
Đáp án: D
Phạm vi biến càng hẹp thì càng ít nguy cơ trùng tên hay bị sửa nhầm từ nơi khác, giúp code dễ hiểu và bảo trì hơn.
Nhóm 15: Mảng hai chiều
Phần tiêu đề “Nhóm 15: Mảng hai chiều”Câu 141. Cú pháp nào khai báo đúng một mảng hai chiều int gồm 3 hàng, 4 cột?
Đáp án: B
Mảng hai chiều trong C++ khai báo bằng hai cặp ngoặc vuông: kieu ten[so_hang][so_cot];.
Câu 142. Đoạn code sau in ra gì?
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};std::cout << a[1][2];Đáp án: C
a[1] là hàng thứ hai {4, 5, 6}, và a[1][2] là phần tử thứ ba của hàng đó, bằng 6.
Câu 143. Đoạn code sau in ra gì?
int a[2][2] = {{1, 2}, {3, 4}};std::cout << a[0][1];Đáp án: A
a[0] là hàng đầu tiên {1, 2}, và a[0][1] là phần tử thứ hai của hàng đó, bằng 2.
Câu 144. Mảng int a[3][4]; có tổng cộng bao nhiêu phần tử?
Đáp án: D
Tổng số phần tử của mảng hai chiều bằng số hàng nhân số cột: 3 × 4 = 12.
Câu 145. Đoạn code sau in ra gì?
int a[2][2] = {{1, 2}, {3, 4}};int sum = 0;for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) sum += a[i][j];std::cout << sum;Đáp án: B
Hai vòng for lồng nhau duyệt qua mọi phần tử, cộng dồn 1 + 2 + 3 + 4 = 10.
Câu 146. Chỉ số hàng và cột của mảng trong C++ bắt đầu từ số nào?
Đáp án: A
Giống mảng một chiều, chỉ số hàng và cột của mảng nhiều chiều trong C++ luôn bắt đầu từ 0.
Câu 147. Đoạn code sau in ra gì?
int a[3][3] = {0};std::cout << a[2][2];Đáp án: C
{0} khởi tạo phần tử đầu tiên bằng 0, và C++ tự động khởi tạo tất cả phần tử còn lại của mảng cũng bằng 0, nên a[2][2] bằng 0.
Câu 148. Với mảng int a[3][3];, việc truy cập a[3][0] gây ra điều gì?
Đáp án: B
Mảng có 3 hàng thì chỉ số hàng hợp lệ là 0, 1, 2. Chỉ số 3 vượt phạm vi, C++ không kiểm tra biên nên đây là hành vi không xác định.
Câu 149. Đoạn code sau in ra gì?
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) std::cout << a[i][j] << " ";}Đáp án: D
Vòng lặp duyệt hết hàng 0 (1 2 3) rồi đến hàng 1 (4 5 6), in ra tuần tự 1 2 3 4 5 6.
Câu 150. Mảng hai chiều thường được dùng để biểu diễn cấu trúc dữ liệu nào?
Đáp án: B
Mảng hai chiều với hàng và cột rất phù hợp để biểu diễn ma trận (bảng số), ví dụ trong toán học hoặc xử lý ảnh.
Nhóm 16: Con trỏ (pointer) cơ bản
Phần tiêu đề “Nhóm 16: Con trỏ (pointer) cơ bản”Câu 151. Toán tử nào dùng để lấy địa chỉ của một biến?
Đáp án: C
Toán tử & (address-of) trả về địa chỉ bộ nhớ của biến, ví dụ int *p = &x;.
Câu 152. Toán tử nào dùng để truy cập giá trị mà con trỏ đang trỏ tới (dereference)?
Đáp án: A
Toán tử * (dereference) đứng trước con trỏ dùng để truy cập giá trị tại địa chỉ mà con trỏ đang trỏ tới.
Câu 153. Đoạn code sau in ra gì?
int x = 10;int *p = &x;std::cout << *p;Đáp án: D
p trỏ tới x, nên *p (dereference) truy cập giá trị của x, tức là 10.
Câu 154. Đoạn code sau in ra gì?
int x = 10;int *p = &x;*p = 20;std::cout << x;Đáp án: B
Vì p trỏ tới x, gán *p = 20; cũng chính là thay đổi giá trị của x thành 20.
Câu 155. Một con trỏ chưa trỏ tới biến cụ thể nào nên được khởi tạo bằng giá trị nào để an toàn?
Đáp án: C
nullptr là giá trị chuẩn trong C++ để biểu thị một con trỏ không trỏ tới đâu cả, giúp tránh lỗi truy cập vùng nhớ không xác định.
Câu 156. Trên hệ thống 64-bit phổ biến, kích thước (sizeof) của một con trỏ thường là bao nhiêu byte?
Đáp án: C
Trên hệ thống 64-bit, mọi con trỏ (dù trỏ tới int, char, hay struct) đều có kích thước cố định là 8 byte, vì nó chỉ lưu địa chỉ bộ nhớ.
Câu 157. Đoạn code sau in ra gì?
int a = 1, b = 2;int *p = &a;p = &b;std::cout << *p;Đáp án: A
Một con trỏ có thể được gán lại để trỏ sang biến khác. Sau p = &b;, p trỏ tới b, nên *p bằng 2.
Câu 158. Cú pháp nào khai báo đúng một con trỏ trỏ tới kiểu int?
Đáp án: D
Con trỏ được khai báo bằng dấu * đặt trước tên biến (hoặc sau kiểu dữ liệu): int *p;.
Câu 159. Đoạn code sau in ra gì?
int x = 5;int *p = &x;(*p)++;std::cout << x;Đáp án: B
(*p)++; tăng giá trị mà p trỏ tới lên 1. Vì p trỏ tới x, x cũng tăng từ 5 thành 6.
Câu 160. Con trỏ (pointer) trong C++ dùng để lưu trữ gì?
Đáp án: B
Con trỏ là một biến đặc biệt lưu trữ địa chỉ bộ nhớ của một biến khác, thay vì lưu giá trị trực tiếp.
Nhóm 17: Struct cơ bản
Phần tiêu đề “Nhóm 17: Struct cơ bản”Câu 161. Từ khóa nào dùng để định nghĩa một kiểu dữ liệu struct trong C++?
Đáp án: A
struct là từ khóa dùng để định nghĩa một kiểu dữ liệu mới gồm nhiều thành viên, ví dụ struct Diem { int x, y; };.
Câu 162. Đoạn code sau in ra gì?
struct SinhVien { std::string ten; int tuoi;};
int main() { SinhVien sv; sv.ten = "An"; sv.tuoi = 20; std::cout << sv.ten; return 0;}Đáp án: C
Thành viên ten của biến sv được gán giá trị "An", và sv.ten truy cập đúng giá trị đó.
Câu 163. Toán tử nào dùng để truy cập thành viên (field) của một biến struct?
Đáp án: B
Với một biến struct thông thường (không phải con trỏ), ta dùng dấu chấm . để truy cập các thành viên, ví dụ sv.ten.
Câu 164. Đoạn code sau in ra gì?
struct Diem { int x; int y;};
int main() { Diem d = {3, 4}; std::cout << d.x + d.y; return 0;}Đáp án: D
d.x bằng 3 và d.y bằng 4, nên d.x + d.y bằng 7.
Câu 165. struct trong C++ thường được dùng để làm gì?
Đáp án: A
struct cho phép gom nhiều thuộc tính liên quan (có thể khác kiểu dữ liệu) lại thành một kiểu dữ liệu mới, ví dụ một điểm gồm x và y.
Câu 166. Đoạn code sau in ra gì?
struct Diem { int x, y; };
int main() { Diem a = {1, 2}; Diem b = a; b.x = 100; std::cout << a.x << " " << b.x; return 0;}Đáp án: B
Diem b = a; tạo ra một bản sao độc lập của a. Thay đổi b.x không ảnh hưởng đến a.x, nên a.x vẫn là 1, còn b.x là 100.
Câu 167. Có thể khai báo một mảng gồm nhiều biến struct trong C++ không?
Đáp án: A
struct là một kiểu dữ liệu, nên có thể khai báo mảng của nó bình thường, ví dụ Diem ds[10];.
Câu 168. Đoạn code sau in ra gì?
struct HinhChuNhat { int rong, cao;};
int dienTich(HinhChuNhat h) { return h.rong * h.cao;}
int main() { HinhChuNhat hcn = {5, 3}; std::cout << dienTich(hcn); return 0;}Đáp án: C
Hàm dienTich nhận một biến struct làm tham số và trả về rong * cao = 5 * 3 = 15.
Câu 169. Truy cập thành viên của struct thông qua con trỏ trỏ tới struct đó dùng toán tử nào?
Đáp án: B
Khi có một con trỏ trỏ tới struct, dùng toán tử mũi tên -> để truy cập thành viên, ví dụ p->ten thay vì (*p).ten.
Câu 170. Đoạn code sau in ra gì?
struct Diem { int x, y; };
int main() { Diem ds[2] = {{1, 2}, {3, 4}}; std::cout << ds[1].y; return 0;}Đáp án: D
ds[1] là phần tử thứ hai của mảng, tức {3, 4}. ds[1].y là thành viên y của phần tử đó, bằng 4.
Nhóm 18: Đệ quy (recursion) cơ bản
Phần tiêu đề “Nhóm 18: Đệ quy (recursion) cơ bản”Câu 171. Đệ quy (recursion) là gì?
Đáp án: B
Đệ quy là kỹ thuật lập trình trong đó một hàm tự gọi lại chính nó để giải quyết bài toán con nhỏ hơn.
Câu 172. Thành phần bắt buộc để một hàm đệ quy không chạy vô hạn là gì?
Đáp án: C
Hàm đệ quy cần có điều kiện dừng (base case) để ngừng gọi lại chính nó, tránh đệ quy vô hạn.
Câu 173. Đoạn code sau in ra gì?
int giaithua(int n) { if (n <= 1) return 1; return n * giaithua(n - 1);}
int main() { std::cout << giaithua(4); return 0;}Đáp án: D
giaithua(4) tính giai thừa: 4 × 3 × 2 × 1 = 24.
Câu 174. Đoạn code sau in ra gì?
int fib(int n) { if (n <= 1) return n; return fib(n - 1) + fib(n - 2);}
int main() { std::cout << fib(5); return 0;}Đáp án: A
Dãy Fibonacci: fib(0)=0, fib(1)=1, fib(2)=1, fib(3)=2, fib(4)=3, fib(5)=5.
Câu 175. Hàm đệ quy không có điều kiện dừng sẽ gây ra lỗi gì khi chạy chương trình?
Đáp án: B
Mỗi lần gọi hàm đệ quy chiếm thêm bộ nhớ ngăn xếp (stack). Không có điều kiện dừng, các lời gọi cứ chồng chất mãi cho tới khi hết bộ nhớ ngăn xếp, gây lỗi tràn ngăn xếp.
Câu 176. Đoạn code sau in ra gì?
void dem(int n) { if (n == 0) return; std::cout << n << " "; dem(n - 1);}
int main() { dem(3); return 0;}Đáp án: C
Hàm in n rồi gọi đệ quy với n - 1, giảm dần: in 3, rồi 2, rồi 1, dừng khi n == 0 (không in 0). Kết quả: 3 2 1.
Câu 177. Đoạn code sau in ra gì?
int tong(int n) { if (n == 0) return 0; return n + tong(n - 1);}
int main() { std::cout << tong(5); return 0;}Đáp án: A
tong(5) tính tổng 5 + 4 + 3 + 2 + 1 + 0 = 15.
Câu 178. So với dùng vòng lặp, đệ quy thường tiêu tốn nhiều hơn tài nguyên nào?
Đáp án: B
Mỗi lời gọi đệ quy tạo thêm một khung ngăn xếp (stack frame) mới, nên đệ quy sâu thường tốn nhiều bộ nhớ ngăn xếp hơn một vòng lặp tương đương.
Câu 179. Đoạn code sau in ra gì?
void dem(int n) { if (n > 3) return; std::cout << n << " "; dem(n + 1);}
int main() { dem(1); return 0;}Đáp án: D
Hàm in n rồi gọi đệ quy với n + 1, dừng khi n > 3. In lần lượt 1, 2, 3, sau đó n = 4 > 3 nên dừng, không in 4.
Câu 180. Mỗi lần gọi hàm đệ quy, C++ lưu trữ thông tin của lời gọi hàm ở đâu?
Đáp án: C
Mỗi lời gọi hàm (kể cả đệ quy) tạo ra một khung ngăn xếp (stack frame) trên ngăn xếp gọi hàm (call stack), lưu tham số, biến cục bộ và địa chỉ trở về.
Nhóm 19: Vector cơ bản (thư viện chuẩn STL)
Phần tiêu đề “Nhóm 19: Vector cơ bản (thư viện chuẩn STL)”Câu 181. Để sử dụng vector trong C++, cần include thư viện nào?
Đáp án: B
vector là một container trong thư viện chuẩn STL, cần #include <vector> để sử dụng.
Câu 182. Cú pháp nào khai báo đúng một vector chứa các số nguyên tên là v?
Đáp án: D
Cú pháp đúng để khai báo một vector chứa kiểu int là vector<int> v;.
Câu 183. Hàm thành viên nào dùng để thêm một phần tử vào cuối vector?
Đáp án: A
push_back(gia_tri) thêm một phần tử mới vào cuối vector.
Câu 184. Đoạn code sau in ra gì?
vector<int> v = {1, 2, 3};v.push_back(4);std::cout << v.size();Đáp án: C
v ban đầu có 3 phần tử, sau push_back(4) có 4 phần tử. v.size() trả về số lượng phần tử hiện có, là 4.
Câu 185. Đoạn code sau in ra gì?
vector<int> v = {10, 20, 30};std::cout << v[1];Đáp án: B
Giống mảng, chỉ số vector bắt đầu từ 0. v[1] là phần tử thứ hai, bằng 20.
Câu 186. Hàm thành viên nào trả về số lượng phần tử hiện có trong vector?
Đáp án: D
size() trả về số lượng phần tử hiện có trong vector.
Câu 187. So với mảng thông thường (array), ưu điểm nổi bật của vector là gì?
Đáp án: B
Khác với mảng có kích thước cố định khi khai báo, vector tự động thay đổi kích thước khi thêm hoặc xóa phần tử.
Câu 188. Đoạn code sau in ra gì?
vector<int> v = {1, 2, 3, 4};int sum = 0;for (int x : v) sum += x;std::cout << sum;Đáp án: A
Vòng lặp for (int x : v) (range-based for) duyệt qua từng phần tử của v và cộng dồn: 1 + 2 + 3 + 4 = 10.
Câu 189. Hàm thành viên nào dùng để kiểm tra vector có rỗng hay không?
Đáp án: C
empty() trả về true nếu vector không có phần tử nào, false nếu ngược lại.
Câu 190. Đoạn code sau in ra gì?
vector<int> v;std::cout << v.empty();Đáp án: D
v chưa có phần tử nào nên v.empty() trả về true. Khi cout in giá trị bool, true hiển thị dưới dạng số 1.
Nhóm 20: Tổng hợp và lỗi thường gặp
Phần tiêu đề “Nhóm 20: Tổng hợp và lỗi thường gặp”Câu 191. Đoạn code sau in ra gì?
int main() { int x; std::cout << x; return 0;}Đáp án: B
Biến x chưa được khởi tạo giá trị ban đầu, nên nó chứa dữ liệu rác còn sót trong vùng nhớ - kết quả không xác định.
Câu 192. Đoạn code sau xảy ra điều gì?
int a = 5;int b = 0;std::cout << a / b;Đáp án: C
Chia số nguyên cho 0 là hành vi không xác định trong C++ và thường gây lỗi (crash) khi chạy chương trình, khác với chia số thực cho 0 (ra inf).
Câu 193. Lỗi nào xảy ra khi thiếu dấu ; ở cuối một câu lệnh trong C++?
Đáp án: B
Dấu ; là bắt buộc để kết thúc câu lệnh trong C++. Thiếu nó khiến trình biên dịch không hiểu cú pháp và báo lỗi biên dịch.
Câu 194. Đoạn code sau có vấn đề gì?
for (int i = 0; i < 5; i++);{ std::cout << i;}Đáp án: A
Dấu ; thừa ngay sau for (...) khiến thân vòng lặp là một câu lệnh rỗng, và biến i chỉ tồn tại trong phạm vi của for. Khối {} phía dưới không còn thấy i, gây lỗi biên dịch. Đây là lỗi gõ nhầm rất phổ biến.
Câu 195. Đoạn code sau in ra gì?
int a = 10;if (a = 5) { std::cout << "Bang 5";} else { std::cout << "Khac 5";}Đáp án: D
Đây là lỗi phổ biến: dùng = (gán) thay vì == (so sánh). a = 5 gán 5 cho a và biểu thức có giá trị 5 (khác 0 nên coi là đúng), nên nhánh if được thực thi, in ra "Bang 5".
Câu 196. Đoạn code sau xảy ra điều gì?
int arr[5] = {1, 2, 3, 4, 5};std::cout << arr[5];Đáp án: D
Mảng có 5 phần tử với chỉ số hợp lệ từ 0 đến 4. arr[5] truy cập ngoài phạm vi; C++ không tự kiểm tra biên mảng, nên đây là hành vi không xác định (không gây lỗi biên dịch).
Câu 197. Đoạn code sau in ra gì?
double x = 10 / 3;std::cout << x;Đáp án: A
10 và 3 đều là số nguyên, nên 10 / 3 được tính bằng phép chia số nguyên trước, cho kết quả 3, rồi mới gán cho double x. Kết quả in ra là 3.
Câu 198. Đoạn code sau in ra gì?
double x = 10.0 / 3;std::cout << x;Đáp án: C
Vì 10.0 là số thực, phép chia 10.0 / 3 trở thành phép chia số thực, cho kết quả xấp xỉ 3.33333.
Câu 199. So sánh trực tiếp hai số thực (float/double) bằng toán tử == có rủi ro gì?
Đáp án: B
Số thực được lưu trong máy tính có sai số làm tròn, nên hai phép tính “về lý thuyết” cho cùng kết quả có thể lệch nhau một chút, khiến == trả về false ngoài mong đợi. Nên so sánh bằng một khoảng sai số nhỏ (epsilon) thay vì == trực tiếp.
Câu 200. Việc viết chú thích (comment) bằng // hoặc /* */ có tác dụng gì đối với chương trình khi biên dịch?
Đáp án: B
Chú thích (comment) chỉ dành cho người đọc code, hoàn toàn bị trình biên dịch bỏ qua và không ảnh hưởng đến kết quả chạy của chương trình.