1. Mục đích chính của việc sử dụng chú thích (comment) trong mã nguồn là gì?
A. Làm cho chương trình chạy nhanh hơn.
B. Giúp người khác (và chính mình sau này) hiểu rõ hơn về mã nguồn.
C. Thay đổi cách chương trình hiển thị trên màn hình.
D. Bảo vệ mã nguồn khỏi bị sao chép.
2. Độ phức tạp thuật toán (time complexity) dùng để đánh giá điều gì?
A. Lượng bộ nhớ chương trình sử dụng.
B. Thời gian thực thi của thuật toán tăng lên như thế nào khi kích thước đầu vào tăng lên.
C. Độ khó hiểu của mã nguồn.
D. Số lượng lỗi trong chương trình.
3. Thuật toán (algorithm) trong lập trình là gì?
A. Một loại lỗi thường gặp trong chương trình.
B. Một phương pháp cụ thể để sắp xếp dữ liệu.
C. Một tập hợp các bước hướng dẫn rõ ràng để giải quyết một vấn đề cụ thể.
D. Tên gọi của một ngôn ngữ lập trình cụ thể.
4. Ngôn ngữ lập trình bậc cao (high-level programming language) có đặc điểm gì?
A. Khó học và khó sử dụng.
B. Gần gũi với ngôn ngữ máy, khó hiểu với con người.
C. Dễ đọc, dễ viết, gần gũi với ngôn ngữ tự nhiên, và cần được biên dịch hoặc thông dịch.
D. Chỉ dùng để lập trình phần cứng.
5. Biên dịch (compilation) là quá trình chuyển đổi mã nguồn chương trình sang:
A. Ngôn ngữ tự nhiên.
B. Mã máy (machine code) mà máy tính có thể trực tiếp thực thi.
C. Mã giả (pseudocode).
D. Lưu đồ thuật toán (flowchart).
6. Cấu trúc dữ liệu (data structure) có vai trò gì trong lập trình?
A. Tăng tốc độ biên dịch chương trình.
B. Giúp tổ chức và lưu trữ dữ liệu một cách hiệu quả để dễ dàng truy cập và thao tác.
C. Tự động tạo giao diện người dùng cho chương trình.
D. Bảo vệ dữ liệu khỏi virus máy tính.
7. Mảng (array) là một loại cấu trúc dữ liệu như thế nào?
A. Tập hợp các phần tử có kiểu dữ liệu khác nhau.
B. Tập hợp các phần tử có cùng kiểu dữ liệu, được lưu trữ liên tiếp trong bộ nhớ.
C. Cấu trúc dữ liệu động, kích thước có thể thay đổi linh hoạt.
D. Cấu trúc dữ liệu chỉ dùng để lưu trữ văn bản.
8. Hàm (function) trong lập trình có vai trò chính là gì?
A. Đảm bảo chương trình chạy nhanh hơn.
B. Tổ chức mã nguồn thành các khối nhỏ, dễ quản lý và tái sử dụng.
C. Tự động sửa lỗi trong chương trình.
D. Thay đổi giao diện người dùng của chương trình.
9. Gỡ lỗi (debugging) là quá trình:
A. Viết mã nguồn chương trình.
B. Biên dịch mã nguồn thành mã máy.
C. Tìm và sửa các lỗi trong chương trình.
D. Tối ưu hóa hiệu suất của chương trình.
10. Đệ quy (recursion) trong lập trình là gì?
A. Một loại vòng lặp vô hạn.
B. Một kỹ thuật lập trình trong đó một hàm tự gọi chính nó.
C. Một cách để sắp xếp dữ liệu.
D. Một phương pháp gỡ lỗi chương trình.
11. Tính đa hình (polymorphism) trong OOP đề cập đến khả năng nào?
A. Một lớp có thể có nhiều thuộc tính.
B. Một đối tượng có thể thuộc nhiều lớp khác nhau.
C. Các đối tượng thuộc các lớp khác nhau có thể phản ứng khác nhau với cùng một phương thức gọi.
D. Một phương thức có thể có nhiều tham số.
12. SOLID là một tập hợp các nguyên tắc thiết kế hướng đối tượng tốt, chữ `L` trong SOLID đại diện cho nguyên tắc nào?
A. Liskov Substitution Principle (Nguyên tắc thay thế Liskov).
B. Law of Demeter (Luật Demeter).
C. Lack of Cohesion (Thiếu tính kết dính).
D. Lazy Loading (Tải chậm).
13. Thông dịch (interpretation) khác với biên dịch ở điểm nào?
A. Thông dịch tạo ra mã máy, còn biên dịch thì không.
B. Thông dịch thực thi mã nguồn từng dòng một, còn biên dịch chuyển đổi toàn bộ mã nguồn trước khi thực thi.
C. Thông dịch chỉ dùng cho ngôn ngữ bậc thấp, còn biên dịch cho ngôn ngữ bậc cao.
D. Không có sự khác biệt, thông dịch và biên dịch là hai tên gọi khác nhau của cùng một quá trình.
14. Tính đóng gói (encapsulation) trong OOP có nghĩa là gì?
A. Khả năng một lớp kế thừa các thuộc tính và phương thức từ lớp khác.
B. Che giấu thông tin chi tiết bên trong của đối tượng và chỉ cho phép truy cập thông qua giao diện công khai.
C. Khả năng một đối tượng có thể có nhiều hình thức khác nhau.
D. Khả năng tạo ra nhiều đối tượng từ một lớp.
15. Ngôn ngữ lập trình bậc thấp (low-level programming language) như hợp ngữ (assembly language) có ưu điểm gì so với ngôn ngữ bậc cao?
A. Dễ học và dễ sử dụng hơn.
B. Cho phép kiểm soát phần cứng trực tiếp và tối ưu hóa hiệu suất.
C. Có khả năng tương thích với nhiều hệ điều hành hơn.
D. Ít bị lỗi hơn.
16. Nguyên tắc DRY (Don`t Repeat Yourself) trong lập trình khuyến khích điều gì?
A. Viết mã lặp đi lặp lại để dễ nhớ.
B. Tránh lặp lại mã bằng cách trừu tượng hóa và tái sử dụng mã.
C. Viết mã càng chi tiết càng tốt.
D. Không sử dụng hàm hoặc thủ tục.
17. Lỗi cú pháp (syntax error) trong lập trình là loại lỗi nào?
A. Lỗi do chương trình chạy quá chậm.
B. Lỗi do logic chương trình sai, dẫn đến kết quả không đúng.
C. Lỗi do vi phạm các quy tắc ngữ pháp của ngôn ngữ lập trình.
D. Lỗi do thiếu bộ nhớ để chương trình hoạt động.
18. Trong lập trình hướng đối tượng (OOP), khái niệm `đối tượng` (object) đại diện cho điều gì?
A. Một hàm hoặc một thủ tục.
B. Một kiểu dữ liệu cơ bản.
C. Một thực thể cụ thể có trạng thái (dữ liệu) và hành vi (phương thức).
D. Một biến toàn cục.
19. Kế thừa (inheritance) trong OOP cho phép điều gì?
A. Tạo ra các đối tượng độc lập hoàn toàn.
B. Một lớp con (subclass) kế thừa các thuộc tính và phương thức của lớp cha (superclass), tái sử dụng mã và xây dựng hệ thống phân cấp lớp.
C. Thay đổi hành vi của đối tượng trong thời gian chạy.
D. Đóng gói dữ liệu và phương thức vào trong một đơn vị duy nhất.
20. Cấu trúc điều khiển `if-else` được sử dụng để làm gì?
A. Lặp lại một khối lệnh nhiều lần.
B. Thực hiện một khối lệnh dựa trên một điều kiện đúng hoặc sai.
C. Khai báo một biến mới.
D. Định nghĩa một hàm.
21. Tham số (parameter) của hàm là gì?
A. Giá trị trả về của hàm sau khi thực thi.
B. Biến được khai báo bên trong hàm và chỉ sử dụng được trong hàm đó.
C. Giá trị được truyền vào hàm khi gọi hàm, để hàm sử dụng trong quá trình thực thi.
D. Tên của hàm, dùng để gọi hàm từ nơi khác trong chương trình.
22. Phép toán nào sau đây dùng để gán giá trị trong hầu hết các ngôn ngữ lập trình?
23. Kiểu dữ liệu nào sau đây thường được sử dụng để lưu trữ số nguyên (không có phần thập phân)?
A. float
B. string
C. int
D. bool
24. Trong quản lý phiên bản mã nguồn (version control), Git là gì?
A. Một ngôn ngữ lập trình mới.
B. Một hệ thống quản lý phiên bản phân tán, giúp theo dõi và quản lý thay đổi mã nguồn.
C. Một trình biên dịch mã nguồn.
D. Một công cụ thiết kế giao diện người dùng.
25. Vòng lặp `for` thường được sử dụng khi nào?
A. Khi muốn lặp lại một khối lệnh vô hạn lần.
B. Khi biết trước số lần lặp cần thiết.
C. Khi muốn thực hiện một khối lệnh chỉ một lần duy nhất.
D. Khi điều kiện lặp phụ thuộc vào giá trị trả về của một hàm.
26. Stack và Heap là hai vùng nhớ chính trong bộ nhớ máy tính, chúng khác nhau cơ bản ở điểm nào trong việc quản lý bộ nhớ?
A. Stack dùng cho dữ liệu tĩnh, Heap dùng cho dữ liệu động.
B. Stack quản lý bộ nhớ tự động (ví dụ biến cục bộ), Heap quản lý bộ nhớ thủ công (ví dụ cấp phát động).
C. Stack nhanh hơn Heap trong việc truy cập bộ nhớ.
D. Tất cả các đáp án trên đều đúng.
27. Biến cục bộ (local variable) là gì?
A. Biến được khai báo bên ngoài tất cả các hàm và có thể truy cập từ mọi nơi trong chương trình.
B. Biến được khai báo bên trong một hàm và chỉ có thể được sử dụng trong phạm vi của hàm đó.
C. Biến dùng để lưu trữ địa chỉ bộ nhớ.
D. Biến có giá trị không đổi trong suốt chương trình.
28. Biến toàn cục (global variable) khác biến cục bộ như thế nào?
A. Biến toàn cục nhanh hơn biến cục bộ.
B. Biến toàn cục có phạm vi sử dụng rộng hơn, có thể truy cập từ nhiều phần khác nhau của chương trình, trong khi biến cục bộ chỉ giới hạn trong một phạm vi nhất định.
C. Biến toàn cục chỉ dùng cho số nguyên, biến cục bộ cho các kiểu dữ liệu khác.
D. Không có sự khác biệt lớn, chỉ là cách gọi khác nhau.
29. Trong lập trình, biến (variable) được hiểu là:
A. Một vùng nhớ được đặt tên, dùng để lưu trữ dữ liệu có thể thay đổi trong quá trình thực thi chương trình.
B. Một giá trị không đổi được gán cho một tên cụ thể trong suốt chương trình.
C. Một loại dữ liệu đặc biệt chỉ chứa các ký tự văn bản.
D. Một lệnh điều khiển luồng thực thi của chương trình.
30. Kiểm thử đơn vị (unit testing) là gì?
A. Kiểm tra toàn bộ chương trình sau khi hoàn thành.
B. Kiểm tra từng thành phần (đơn vị) nhỏ nhất của chương trình (ví dụ: hàm, lớp) một cách độc lập.
C. Kiểm tra hiệu suất của chương trình.
D. Kiểm tra giao diện người dùng của chương trình.