[Lập trình C] Câu hỏi trắc nghiệm 1

Posted on January 2nd, 2021

Trong các bài viết trước, bạn đã được học về: Flowchart - sơ đồ thuật toán, biến và kiểu dữ liệu, toán tử và biểu thức, nhập xuất dữ liệu, điều kiện rẽ nhánh, vòng lặp - loop. Để giúp bạn ôn tập và hiểu rõ hơn về những kiến thức đó, bài viết này sẽ tổng hợp một số câu hỏi trắc nghiệm lập trình C kèm theo đáp án. Tuy nhiên, bạn cố gắng suy nghĩ để tìm ra cách giải quyết, trước khi xem lời giải nhé.

Mục lục:

Câu hỏi trắc nghiệm về Flowchart - sơ đồ thuật toán

Câu hỏi 1

Những phát biểu nào sau đây về flowchart là đúng?

A. Flowchart là một dạng mã giả, sử dụng chữ để minh họa sơ đồ thuật toán.
B. Flowchart là một dạng sơ đồ, sử dụng các hình để minh họa sơ đồ thuật toán.
C. Flowchart có thể có điểm đầu và điểm cuối tùy thuộc vào mỗi bài toán khác nhau.
D. Flowchart bắt buộc phải có điểm đầu và điểm cuối với mọi bài toán.

Đáp án đúng là: B, D

Flowchart là một dạng sơ đồ, sử dụng các hình để minh họa sơ đồ thuật toán. Và Flowchart luôn phải có điểm đầu và điểm cuối với mọi bài toán khác nhau.

Câu hỏi 2

Phát biểu nào sau đây về ý nghĩa của các dạng hình học trong Flowchart là đúng?

lap-trinh-c-trac-nghiem-1-flowchart-symbols

A. Hình A - bắt đầu hoặc kết thúc
   Hình B - tính toán
   Hình D - nhập xuất dữ liệu
   Hình E - điều kiện rẽ nhánh

B. Hình A - tính toán
   Hình B - điều kiện rẽ nhánh
   Hình D - bắt đầu hoặc kết thúc
   Hình E - nhập xuất dữ liệu

C. Hình A - bắt đầu hoặc kết thúc
   Hình B - nhập xuất dữ liệu
   Hình D - tính toán
   Hình E - điều kiện rẽ nhánh

D. Hình A - tính toán
   Hình B - nhập xuất dữ liệu
   Hình D - điều kiện rẽ nhánh
   Hình E - bắt đầu hoặc kết thúc

Đáp án đúng là: C

Câu hỏi 3

Cho flowchart sau:

lap-trinh-c-flow-chart-tinh-tong-chan-nho-hon-n

Hỏi đáp án nào sau đây là đúng?

A. N = 1, Sum = 1
B. N = 4, Sum = 6
C. N = 5, Sum = 6
D. N = 5, Sum = 4

Đáp án đúng là: C

Giải thích:

  • Sơ đồ thuật toán trên minh họa cho bài toán tính tổng các số tự nhiên chẵn nhỏ hơn N.
  • Do đó:
    • Với N = 1 thì Sum = 0. Suy ra, đáp án A là sai.
    • Với N = 4 thì Sum = 2. Suy ra, đáp án B là sai.
    • Với N = 5 thì Sum = 2 + 4 = 6. Suy ra, đáp án C là đúng và đáp án D là sai.

Câu hỏi trắc nghiệm về cấu trúc chương trình C

Câu hỏi 1

Chương trình C có bao nhiêu hàm main()?

A. 1
B. 2
C. 3
D. 4

Đáp án đúng là: A

Mọi chương trình C đều phải có 1 và chỉ 1 hàm main(). Đây chính là điểm bắt đầu của chương trình C.

Câu hỏi 2

Đâu là cặp kí hiệu dùng để bắt đầu và kết thúc một block code trong ngôn ngữ lập trình C?

A. <>
B. ()
C. {}
D. []

Đáp án đúng là: C

Câu hỏi 3

Đâu là kí tự dùng để kết thúc một câu lệnh trong ngôn ngữ lập trình C?

A. Dấu phẩy (,)
B. Dấu chấm (.)
C. Dấu chấm phẩy (;)
D. Không cần kí tự nào để kết thúc một câu lệnh

Đáp án đúng là: C

Câu hỏi 4

Những cách bình luận (commment) chính xác trong ngôn ngữ lập trình C là gì?

A. // Đây là comment 1 dòng
B. / Đây là comment 1 dòng /
C. /* Đây là comment nhiều dòng */
D. /*/ Đây là comment nhiều dòng /*/
E. <!-- Đây là comment nhiều dòng -->
F. # Đây là comment 1 dòng
G. \* Đây là comment nhiều dòng *\
H. \\ Đây là comment 1 dòng

Đáp án đúng là: A, C, D

Giải thích:

  • Trong ngôn ngữ lập trình C có 2 cách comment code là: dùng cặp dấu \\ và cặp dấu /**/
  • Cặp dấu \\ dùng để comment trên 1 dòng
  • Cặp dấu /**/ dùng để comment trên nhiều dòng

Câu hỏi trắc nghiệm về biến và kiểu dữ liệu

Câu hỏi 1

Những cách đặt tên biến nào sau đây là hợp lệ?

A. tongChan
B. tong-le
C. count1
D. giatri_Min
E. gia.tri.max
F. _int_
G. continue
H. Printf
I. 2var

Đáp án đúng là: A, C, D, F, H

Giải thích:

  • Trong lập trình C, quy tắc đặt tên biến là:

    • Chữ cái đầu tiên là chữ cái thường (a-z) hoặc chữ cái viết hoa (A-Z) hoặc dấu gạch dưới (_)
    • Các chữ cái tiếp theo cũng tương tự như chữ cái đầu, ngoài ra có thể là chữ số (0-9)
    • Tên biến không được trùng với từ khóa trong ngôn ngữ lập trình C
    • Tên biến phân biệt hoa thường
  • Các đáp án sai:

    • Đáp án B sai vì chứa kí tự gạch ngang (-)
    • Đáp án E sai vì chứa kí tự chấm (.)
    • Đáp án G sai vì trùng với từ khóa continue trong ngôn ngữ lập trình C
    • Đáp án I sai vì bắt đầu bằng số

Câu hỏi 2

Phát biểu nào sau đây là đúng?

A. int (số thực), float (số tự nhiên), double (số nguyên), char (chuỗi kí tự)
B. int (số nguyên), float (số thực), double (số tự nhiên), char (kí tự)
C. int (số nguyên), float (số thực), double (số thực), char (kí tự)
D. int (số tự nghiên), float (số nguyên), double (số thực), char (kí tự)

Đáp án đúng là: C

Ngôn ngữ lập trình C có một số kiểu dữ liệu cơ bản là:

  • int: kiểu số nguyên (thường là 4 bytes - đối với máy tính hệ 64bit như hiện nay)
  • float: kiểu số thực (4 bytes - độ chính xác 6 chữ số sau dấu phẩy)
  • double: kiểu số thực (8 bytes - độ chính xác 10 chữ số sau dấu phẩy)
  • char: kiểu kí tự (1 byte), dùng để biểu diễn 256 kí tự trong bảng mã ASCII

Câu hỏi 3

Cách khai báo biến nào sau đây là đúng?

A. int: x, y, z
B. x, y, z: float
C. double x, y, z;
D. x = 0, y = 1, z = 2;

Đáp án đúng là: C

Giải thích:

  • Cú pháp khai báo biến trong ngôn ngữ lập trình C là:
    <kiểu dữ liệu> <danh sách biến>;
  • Chú ý: cần có dấu chấm phẩy để kết thúc câu lệnh

Câu hỏi trắc nghiệm về toán tử và biểu thức

Câu hỏi 1

Đâu là cách gán giá trị cho biến int x; chính xác?

A. x := 6;
B. x = 6;
C. x = 6
D. x <- 6

Đáp án đúng là: B

Giải thích:

  • Toán tử gán trong ngôn ngữ lập trình C là dấu bằng (=). Do đó, đáp án đúng là B hoặc C
  • Kết thúc câu lệnh gán cần có dấu chấm phẩy. Suy ra, đáp án đúng là B
  • Ngoài ra, ta cũng có thể gán giá trị giống nhau cho nhiều biến bằng cách:
int x, y, z;
x = y = z = 6;

Câu hỏi 2

Cho đoạn code sau:

int x = 2, y = 3, z = -1;
int t = 3 * x / y - z * x + y % 5 / 2;

Hỏi giá trị của t bằng bao nhiêu?

A. 2
B. 3
C. 4
D. 5

Đáp án đúng là: D

Giải thích:

  • Trong ngôn ngữ lập trình C, có 5 toán tử số học cơ bản là: cộng (+), trừ (-), nhân (*), chia nguyên (/), chia lấy dư (%).
  • Các toán tử có độ ưu tiên khác nhau: các toán tử * / và % có độ ưu tiên cao hơn các toán tử + và -
  • Các toán tử có độ ưu tiên cao hơn (* / %) sẽ thực hiện trước, các toán tử có độ ưu tiên thấp hơn (+ -) sẽ thực hiện sau. Trường hợp các toán tử có độ ưu tiên ngang nhau thì thứ tự thực hiện là từ trái sang phải.
  • Quá trình thực hiện tính toán theo trình tự như sau:
int x = 2, y = 3, z = -1;
int t = 3 * x / y - z * x + y % 5 / 2;
//  t = 3 * 2 / 3 - (-1) * 2 + 3 % 5 / 2
//  t = (3 * 2) / 3 - (-1) * 2 + 3 % 5 /2
//  t = 6 / 3 - (-1) * 2 + 3 % 5 / 2
//  t = (6 / 3) - (-1) * 2 + 3 % 5 / 2
//  t = 2 - (-1) * 2 + 3 % 5 / 2
//  t = 2 - [(-1) * 2] + 3 % 5 / 2
//  t = 2 - (-2) + 3 % 5 / 2
//  t = 2 - (-2) + (3 % 5) / 2
//  t = 2 - (-2) + 3 / 2
//  t = 2 - (-2) + (3 / 2)
//  t = 2 - (-2) + 1
//  t = 4 + 1
//  t = 5

Trong quá trình thực hiện tính toán trên, bạn chú ý 2 chỗ:

  • Kết quả 3 % 5 bằng 3. Vì đây là phép chia lấy phần dư của 3 cho 5.
  • Kết quả 3 / 2 bằng 1. Vì đây là phép chia lấy phần nguyên của 3 cho 2 (kết quả thực là 1.5)

Câu hỏi 3

Những cách nào sau đây là chính xác khi so sánh giá trị của 2 biến?

A. x > y
B. x < y
C. x = y
D. x == y
E. x != y
F. x := y
G. x => y
H. x >= y
I. x <= y
K. x =< y

Đáp án đúng là: A, B, D, E, H, I

Giải thích:

  • Ngôn ngữ lập trình C có 6 toán tử so sánh là:
    • Lớn hơn (>)
    • Nhỏ hơn (<)
    • Bằng (==)
    • Khác (!=)
    • Lớn hơn hoặc bằng (>=)
    • Nhỏ hơn hoặc bằng (<=)
  • Đáp án C sai vì (=) là toán tử gán
  • Đáp án F, G, K sai vì không có toán tử (:=), (=>) và (=<)

Câu hỏi 4

Biết rằng trong ngôn ngữ lập trình C có 3 loại toán tử logic là: AND (&&), OR (||) và NOT (!). Hỏi kết quả của biểu thức 10 && (-10) || 0 && !(-1) là bao nhiêu?

A. -1
B. 0
C. 1
D. Sai cú pháp

Đáp án đúng là: C

Giải thích:

  • Ngôn ngữ lập trình C có 3 toán tử logic là: AND(&&), OR(||) và NOT(!)
    • Toán tử &&: trả về TRUE(1) khi cả 2 toán hạng của nó đều là TRUE(1)
    • Toán tử ||: trả về TRUE(1) khi 1 trong 2 toán hạng của nó là TRUE(1)
    • Toán tử !: trả về TRUE(1) khi toán hạng là FALSE(0)
  • Độ ưu tiên của các toán tử theo thứ tự giảm dần là: NOT(!) AND(&&) OR(||). Do đó, toán tử NOT sẽ thực hiện trước, xong đến toán tử AND và cuối cùng là toán tử OR.
  • Khi các toán hạng có cùng độ ưu tiên
  • Kết quả của biểu thức sử dụng toán tử logic là: TRUE(1) hoặc FALSE(0)
  • Như vậy, trình tự thực hiện biểu thức trên như sau:
10 && (-10) || 0 && !(-1)   // toán tử ! sẽ thực hiện đầu tiên
10 && (-10) || 0 && [!(-1)] // -1 khác 0 nên hiểu là TRUE,
10 && (-10) || 0 && 0       // phủ định của TRUE là FALSE(0)
[10 && (-10)] || 0 && 0     // toán tử && bên trái thực hiện trước
1 || 0 && 0                 // 10 và -10 đều là TRUE nên kết quả là TRUE(1)
1 || [0 && 0]               // toán tử && còn lại thực hiện trước
1 || 0                      // 0 là FALSE nên kết quả của phép && là 0
1                           // kết quả của phép || còn lại là TRUE(1)
                            // vì có 1 toán hạng là TRUE(1)

Câu hỏi 5

Cho đoạn code sau:

int x = 2, y = 4, z = 3;
int t = -2 * z / 5 <= 6 + !(x * y - z) && y % (2 * z - 3);

Hỏi đáp án của t bằng bao nhiêu?

A. 0
B. 1
C. 2
D. 3

Đáp án đúng là: B

Giải thích:

  • Trong biểu thức trên có tồn tại 4 loại toán tử:
    • Toán tử đóng mở ngoặc đơn: ()
    • Toán tử số học: + - * / %
    • Toán tử so sánh: <=
    • Toán tử logic: &&
  • Độ ưu tiên của 4 loại toán tử trên theo thứ tự giảm dần là: toán tử đóng mở ngoặc đơn, toán tử số học, toán tử so sánh và toán tử logic
  • Trình tự thực hiện biểu thức trên là:
int x = 2, y = 4, z = 3;
int t = -2 * z / 5 <= 6 + !(x * y - z) && y % (2 * z - 3);
//  t = -2 * 3 / 5 <= 6 + !(2 * 4 - 3) && 4 % (2 * 3 - 3);
//  t = -2 * 3 / 5 <= 6 + !(8 - 3) && 4 % (2 * 3 - 3);
//  t = -2 * 3 / 5 <= 6 + !5 && 4 % (2 * 3 - 3);
//  t = -2 * 3 / 5 <= 6 + !5 && 4 % (6 - 3);
//  t = -2 * 3 / 5 <= 6 + !5 && 4 % 3;
//  t = -6 / 5 <= 6 + !5 && 4 % 3;
//  t = -1 <= 6 + !5 && 4 % 3;
//  t = -1 <= 6 + !5 && 1;
//  t = -1 <= 6 + !5 && 1;
//  t = -1 <= 6 + 0 && 1;
//  t = -1 <= 6 && 1;
//  t = 1 && 1;
//  t = 1;

Câu hỏi 6

Cho a và b là 2 số thực, hỏi những biểu thức nào sau đây là đúng:

A. a += b;
B. a -= b;
C. a /= b;
D. a %= b;
E. a *= b;
F. a &= b;
G. a++;
H. a--;

Đáp án đúng là: A, B, C, E, G, H

Giải thích:

  • Trong ngôn ngữ lập trình C, có một cách viết biểu thức dạng rút gọn như sau:
    a += b tương đương với a = a + b
    a -= b tương đương với a = a - b
    a /= b  tương đương với a = a / b
    a %= b tương đương với a = a % b
    a *= b tương đương với a = a * b
    a &= b tương đương với a = a & b
    a++ tương đương với a = a + 1
    a-- tương đương với a = a - 1
  • Đáp án A, B, C, E, G, H đúng vì các toán tử trong những ví dụ đó có thể áp dụng cho cả số nguyên và số thực.
  • Đáp án D và F sai vì các toán tử trong những ví dụ đó chỉ có thể áp dụng cho số nguyên nên với a, b là số thực thì sẽ bị lỗi
    • Toán tử % là phép chia lấy dư giữa 2 số nguyên
    • Toán tử & là toán tử logic bit giữa 2 số nguyên

Câu hỏi trắc nghiệm về nhập xuất dữ liệu

Câu hỏi 1

Cho đoạn code sau:

char c = 'A';
int i = -1000;
unsigned int ui = 2500000000;
float f = -1.534534;

Hỏi những cách in ra màn hình nào sau đây là đúng (không mất dữ liệu)?

A. printf("c=%c", c);
B. printf("c=%d", c);
C. printf("c=%f", c);
D. printf("i=%c", i);
E. printf("i=%d", i);
F. printf("i=%u", i);
G. printf("i=%f", i);
H. printf("ui=%ud", ui);
I. printf("ui=%f", ui);
K. printf("ui=%u", ui);
L. printf("f=%f", f);
M. printf("f=%f", &f);

Đáp án đúng là: A, B, E, K, L

Giải thích:

  • Cú pháp của hàm printf trong ngôn ngữ lập trình C là:
    printf("chuỗi hiển thị", danh sách tham số)
  • Chuỗi hiển thị sẽ là dạng text bao gồm các kí tự nhìn thấy, không nhìn thấy (kí tự xuống dòng \n, kí tự tab \t) và format để hiển thị giá trị của biến.
  • Format để hiển thị giá trị của biến sẽ bắt đầu bằng kí tự phần trăm (%) theo sau là mã code để format.
  • Một số mã code như sau: lap_trinh-c-nhap-xuat-du-lieu-format-code
  • Giải thích các đáp án:
    • Đáp án A đúng vì: %c dùng để hiển thị kí tự
    • Đáp án B đúng vì: %d dùng để hiển thị số nguyên. Mà thực chất, kí tự char ứng với một số nguyên từ 0 đến 255 trong bảng mã ASCII.
    • Đáp án C sai vì: %f chỉ dùng để hiển thị số thực
    • Đáp án D sai vì: %c chỉ dùng để biểu diễn kí tự char, mà kiểu char chỉ có 1 byte nên không đủ để biểu diễn số nguyên -1000
    • Đáp án F sai vì: %u chỉ dùng để biểu diễn số nguyên không dấu, nên không dùng để hiển thị số nguyên -1000
    • Đáp án G sai vì: %f chỉ dùng để hiển thị số thực
    • Đáp án H sai vì: không có format %ud, khi đó kết quả hiển thị lên sẽ thừa chữ d
    • Đáp án I sai vì: %f chỉ dùng để biểu diễn số thực
    • Đáp án M sai vì: &f hiểu là lấy ra địa chỉ của biến f, chứ không phải giá trị của biến f.

Câu hỏi 2

Cách nhập số nguyên N (từ bàn phím) nào sau đây là đúng?

A. scanf("%c", &N);
B. scanf("%d, &N");
C. scanf("%d", N);
D. scanf("%d", &N);

Đáp án đúng là: D

Giải thích:

  • Cú pháp để nhập dữ liệu từ bàn phím là:
    scanf("chuỗi định dạng nhập dữ liệu", danh sách tham số)
  • Chuỗi định dạng nhập dữ liệu là định dạng kiểu dữ liệu cần nhập. Ở đây chỉ được phép chứa mã code ứng với kiểu dữ liệu muốn nhập (loại code giống với hàm printf() ở bên trên). Nếu muốn nhập vào giá trị ứng với nhiều biến cùng một lúc, thì các mã code phải viết liên tiếp nhau hoặc cách nhau bằng dấu cách, không được dùng thêm kí tự nào khác như dấu phẩy (,)
  • Danh sách tham số là danh sách địa chỉ của các biến muốn nhập vào, thứ tự tương ứng với các mã code trong phần chuỗi định dạng nhập dữ liệu.
  • Giải thích các đáp án:
    • Đáp án A sai vì: %c chỉ dùng để nhập kí tự
    • Đáp án B sai vì: danh sách tham số (&N) phải nằm ngoài dấu nháy kép (")
    • Đáp án C sai vì: danh sách tham số phải là địa chỉ của biến (thêm kí tự & phía trước biến), chứ không phải giá trị của biến
    • Đáp án D đúng vì: %d dùng để nhập vào số nguyên, danh sách tham số đúng là địa chỉ của biến N (&N)

Câu hỏi trắc nghiệm về điều kiện rẽ nhánh

Câu hỏi 1

Cách viết nào sau đây là đúng với cú pháp khai báo của câu lệnh if?

A. if biểu_thức
B. if <biểu thức>
C. if {biểu thức}
D. if (biểu thức)

Đáp án đúng là: D

Câu hỏi 2

Cho đoạn code sau:

int a = 3, b = 4, x = 0;

if (a != 3)
	x++;
	x += b;

if (b == 4) {
	x--;
	x *= a;
}

Hỏi kết quả của biến x sau đoạn code trên là bao nhiêu?

A. -3
B. 0
C. 12
D. 9

Đáp án đúng là: D

Giải thích:

  • Với mệnh đề if, nếu điều kiện trong if đúng thì câu lệnh hoặc khối lệnh ngay sau if sẽ được thực hiện. Ngược lại, nếu điều kiện trong if sai thì câu lệnh hoặc khối lệnh ngay sau if sẽ không được thực hiện.
  • Với mệnh đề if đầu tiên, a có giá trị 3 nên a != 3 là sai. Do đó câu lệnh ngay sau if là x++ không được thực hiện.
  • Câu lệnh tiếp theo x += b không liên quan đến if nên vẫn thực hiện bình thường. Sau biểu thức này, x = x + b = 0 + 4 = 4;
  • Với mệnh đề if tiếp theo, điều kiện b == 4 là đúng, nên khối lệnh tiếp theo if sẽ được thực hiện. Kết quả là:
    x--;    // -> x = x - 1 = 4 - 1 = 3
    x *= a; // -> x = x * a = 3 * 3 = 9

Câu hỏi 3

Cho đoạn code sau:

int x = 3;

if (x == 1)
	printf("One");
else if (x == 2)
	printf("Two");
else if (x == 3)
	printf("Three");
else
	printf("Other");

Hỏi kết quả hiển thị ra màn hình console là gì?

A. One
B. Two
C. Three
D. Other

Đáp án đúng là: C

Giải thích:

  • Trong chuỗi câu lệnh if-else-if liên tiếp nhau, thứ tự thực hiện là từ trên xuống dưới.
  • Bất cứ khi nào một điều kiện if là đúng thì câu lệnh hoặc khối lệnh ngay sau if sẽ được thực hiện. Những đoạn if-else phía sau sẽ không được thực hiện.
  • Với x = 3, thì x == 1 hay x == 2 đều sai. Chỉ có x == 3 cho giá trị đúng. Nên câu lệnh ứng với if đó được thực hiện.

Câu hỏi 4

Cho đoạn code sau:

int x = 3;

switch(x) {
	case 1:
		printf("One");
	case 2:
		printf("Two");
	case 3:
		printf("Three");
	default:
		printf("Other");
}

Hỏi kết quả hiển thị lên màn hình console là gì?

A. Three
B. OneTwoThree
C. ThreeOther
D. OneTwoThreeOther

Đáp án đúng là: C

Giải thích:

  • Switch dùng để kiểm tra điều kiện và rẽ nhánh.

  • Biểu thức được dùng để kiểm tra điều kiện phải có giá trị là số (kí tự bản chất cũng là số)

  • Giá trị ứng với các case phải là hằng số.

  • Khi giá trị của case bằng với giá trị của biểu thức kiểm tra điều kiện thì các câu lệnh ứng với case đó sẽ được thực hiện.

  • Ở đây, biểu thức dùng để kiểm tra điều kiện là x, giá trị của x bằng 3. Nên các câu lệnh ứng với case 3 sẽ được thực hiện. Khi đó câu lệnh printf("Three") sẽ thực hiện in ra màn hình chữ Three.

  • Tuy nhiên, đối với switch-case, nếu ta không sử dụng từ khóa break ở cuối mỗi case thì các câu lệnh ứng với các case sau và default sẽ được thực hiện. Do đó câu lệnh printf("Other") sẽ thực hiện in ra tiếp chữ Other. Tóm lại, kết quả thu được là: ThreeOther

  • Để kết quả hiển thị chỉ tương ứng với những case đúng (Three) thì bạn cần thêm từ khóa break ở cuối mỗi case như sau:

    int x = 3;
    
    switch(x) {
    	case 1:
    		printf("One");
    		break;
    	case 2:
    		printf("Two");
    		break;
    	case 3:
    		printf("Three");
    		break;
    	default:
    		printf("Other");
    }

Câu hỏi trắc nghiệm về vòng lặp - loop

Câu hỏi 1

Cho đoạn code sau:

int i, N = 10;
for (i = 0; i < N; i += 2) {
	printf("%d ", i);
}

Hỏi kết quả hiển thị trên màn hình console là gì?

A. 0 1 2 3 4 5 6 7 8 9 10
B. 0 1 2 3 4 5 6 7 8 9
C. 0 2 4 6 8 10
D. 0 2 4 6 8

Đáp án đúng là: D

Giải thích:

  • Cú pháp của vòng lặp for là:
    for (khởi tạo vòng lặp; điều kiện thực hiện; thực hiện sau vòng lặp) {
    
    }
  • Đoạn code trên khởi tạo vòng lặp với i = 0
  • Điều kiện để vòng lặp thực hiện là i < N
  • Sau mỗi vòng lặp, thực hiện tăng i lên 2 đơn vị (i += 2)
  • Trong mỗi vòng lặp, thực hiện in ra giá trị của i
  • Giải thích các vòng lặp:
    • Vòng 1: i = 0, i < N đúng. Như vậy, in ra giá trị của i là: 0. Sau khi in ra i, tăng giá trị của i lên 2 đơn vị, ta được i = 2
    • Vòng 2: i = 2, i < N đúng. Như vậy, in ra giá trị của i là: 2. Sau khi in ra i, tăng giá trị của i lên 2 đơn vị, ta được i = 4
    • Vòng 3: i = 4, i < N đúng. Như vậy, in ra giá trị của i là: 4. Sau khi in ra i, tăng giá trị của i lên 2 đơn vị, ta được i = 6
    • Vòng 4: i = 6, i < N đúng. Như vậy, in ra giá trị của i là: 6. Sau khi in ra i, tăng giá trị của i lên 2 đơn vị, ta được i = 8
    • Vòng 5: i = 8, i < N đúng. Như vậy, in ra giá trị của i là: 8. Sau khi in ra i, tăng giá trị của i lên 2 đơn vị, ta được i = 10
    • Vòng 6: i = 10, i < N sai. Như vậy, vòng lặp kết thúc. Tóm lại, kết quả thu được là đáp án D.

Câu hỏi 2

Cho đoạn code sau:

int x = 4;
while (x) {
	printf("%d ", x--);
}

Hỏi kết quả hiển thị trên màn hình console là gì?

A. 4 3 2 1 0
B. 4 3 2 1
C. 3 2 1 0
D. 4 3 2 1 0 -1 -2 ... (vô hạn)

Đáp án đúng là B

Giải thích:

  • Cú pháp của vòng lặp while là:

    while(điều kiện) {
    
    }
  • Vòng lặp while sẽ luôn được thực hiện nếu điều kiện trong while là đúng.

  • Giải thích các vòng lặp:

    • Vòng 1: x = 4, TRUE. Như vậy, in ra giá trị của x là 4. Sau đó, x-- nên giá trị của x giảm đi 1, còn là 3
    • Vòng 2: x = 3, TRUE. Như vậy, in ra giá trị của x là 3. Sau đó, x-- nên giá trị của x giảm đi 1, còn là 2
    • Vòng 3: x = 2, TRUE. Như vậy, in ra giá trị của x là 2. Sau đó, x-- nên giá trị của x giảm đi 1, còn là 1
    • Vòng 4: x = 1, TRUE. Như vậy, in ra giá trị của x là 1. Sau đó, x-- nên giá trị của x giảm đi 1, còn là 0
    • Vòng 5: x = 0, FALSE. Như vậy vòng lặp while kết thúc. Tóm lại, kết quả là đáp án B.

Câu hỏi 3

Cho đoạn code sau:

int x = 0;
do {
	x++;
	if (x == 1) {
		printf("One");
		continue;
	}

	printf("%d", x);

	if (x == 3) {
		printf("Three");
		break;
	}

} while (x < 5);

Hỏi kết quả hiển thị trên màn hình console là gì?

A. One23
B. 23Three
C. One23Three
D. Vòng lặp vô hạn

Đáp án đúng là: C

Giải thích:

  • Cú pháp của vòng lặp do-while là:

    do {
    
    } while(điều kiện);
  • Vòng lặp do-while sẽ thực hiện khối lệnh bên trong do-while trước sau đó kiểm tra điều kiện trong while. Nếu điều kiện đó vẫn TRUE thì vòng lặp tiếp tục, ngược lại thì dừng ngay vòng lặp.

  • Giải thích các vòng lặp:

    • Ban đầu khởi tạo x = 0
    • Vòng lặp 1: x++, nên x tăng lên 1 được x = 1. Nên x == 1 TRUE. Do đó, khối lệnh tương ứng với mệnh đề if(x==1) sẽ được thực hiện. Câu lệnh printf("One") in ra màn hình chữ One. Tiếp theo, từ khóa continue được thực hiện. Từ khóa này sẽ bỏ qua đoạn câu lệnh phía dưới (còn lại của vòng lặp) để quay về đầu vòng lặp.
    • Vòng lặp 2: x++, nên x tăng lên 1 được x = 2. Nên x == 1 FALSE. Do đó, khối lệnh tương ứng với mệnh đề if(x==1) không được thực hiện. Tiếp theo, câu lệnh printf("%d", x) sẽ được thực hiện. Nên nó lại in ra màn hình giá trị ứng với x lúc này là 2. Tiếp theo, mệnh đề if(x==3) không thực hiện vì x == 3 FALSE.
    • Vòng lặp 3: x++, nên x tăng lên 1 được x = 3. Nên x == 1 FAlSE. Do đó, khối lệnh tương ứng với mệnh đề if(x==1) không được thực hiện. Tiếp theo, câu lệnh printf("%d", x) sẽ được thực hiện. Nên nó lại in ra màn hình giá trị ứng với x lúc này là 3. Tiếp theo, mệnh đề if(x==3) TRUE nên khối lệnh tương ứng sẽ được thực hiện. Câu lệnh printf("Three") sẽ in ra màn hình chữ Three. Tiếp tục, gặp từ khóa break. Từ khóa này sẽ dừng vòng lặp ngay lập tức. Tóm lại kết quả thu được là đáp án C.