Ngân hàng câu hỏi của chương

Câu hỏi: PRF192 - Phần 3: Cấu trúc điều khiển - rẽ nhánh và vòng lặp

40 câu trắc nghiệm kèm lời giải của môn PRF192 - Cơ sở lập trình, xếp theo thứ tự nhập vào ngân hàng. Trang 2/2 — câu 21–40.

Danh sách câu hỏi

40/40 câuHết danh sách
Đề bài
#include<stdio.h>
int main()
{
    const int a=5;
    if(a>3)
        a++;
        break;
    else
        a--;
    printf("%d",a);
    return 0;
}
ACompile time error
B6
C4
D5
Lời giải
Đáp án đúng: "Compile time error". Phạm vi khối do ngoặc nhọn quyết định, không do thụt lề: nhánh if ở đây không có ngoặc nhọn nên chỉ ôm đúng một lệnh là lệnh tăng a, còn lệnh break phía sau đã nằm ngoài if dù được thụt vào ngang hàng. Vì vậy khi gặp từ khoá else, trình biên dịch không còn if nào để ghép nên báo lỗi ngay. Mã này còn hai lỗi nữa: break chỉ hợp lệ trong vòng lặp hoặc trong switch, mà đây không có cái nào; và a khai báo const nên cả lệnh tăng lẫn lệnh giảm đều là ghi vào đối tượng chỉ đọc. Giá trị "6" giả định lệnh tăng chạy được trên một hằng rồi chương trình in ra sau đó. Giá trị "4" ứng với nhánh giảm chạy, nhưng điều kiện a lớn hơn 3 với a bằng 5 vốn đã đúng. Giá trị "5" giả định không nhánh nào chạy, trong khi vấn đề thật là chương trình không dịch nổi.
Mở trang câu hỏi này →
22What happens in this do/while loop?4 lựa chọncó code
Đề bài
int n;
do {
    printf("Enter a number:");
    scanf("%d", &n);
} while (n < 1 || n > 5);
ANever runs
BRuns only when n = 1
CInfinite loop
DRuns at least once
Lời giải
Đáp án đúng: "Runs at least once". Vòng do-while đặt phép kiểm điều kiện ở cuối, nên thân luôn chạy trọn một lượt trước khi điều kiện được tính lần đầu; ở đây lượt đầu in lời mời rồi đọc n, sau đó mới xét n có nằm ngoài khoảng từ 1 tới 5 hay không để quyết định lặp lại. Đó chính là khuôn mẫu quen dùng để buộc người nhập phải nhập lại cho tới khi hợp lệ. Mô tả "Never runs" trái hẳn với vị trí của phép kiểm, không có đường nào để thân bị bỏ qua. Mô tả "Runs only when n = 1" lẫn chiều điều kiện: n bằng 1 làm điều kiện sai nên vòng lặp dừng, hơn nữa n chỉ có giá trị sau khi thân đã chạy một lượt. Mô tả "Infinite loop" chỉ xảy ra khi người nhập cứ đưa số ngoài khoảng, hoặc nhập chữ làm scanf thất bại và n giữ nguyên giá trị cũ, chứ không phải hành vi mặc định của đoạn mã.
Mở trang câu hỏi này →
Afor (initialization, condition, increment) { statements; }
Bfor { initialization; condition; increment; } (statements;)
Cfor (initialization; condition; increment) { statements; }
Dfor: (initialization; condition; increment) { statements; }
Lời giải

Đáp án đúng: "

Lời giải
for (initialization; condition; increment) {
  statements;
}

". Vòng for trong C có ba phần đặt trong một cặp ngoặc tròn và phân cách bằng đúng hai dấu chấm phẩy: khởi tạo chạy một lần, điều kiện kiểm trước mỗi lượt, phần cập nhật chạy sau mỗi lượt; thân vốn là một lệnh, muốn nhiều lệnh thì gom trong cặp ngoặc nhọn. Khuôn "

Lời giải
for (initialization, condition, increment) {
  statements;
}

" dùng dấu phẩy nên cả ngoặc thành một biểu thức duy nhất và vòng lặp mất chỗ kiểm điều kiện. Khuôn "

Lời giải
for {
  initialization;
  condition;
  increment;
}

(statements;)" đảo vai hai loại ngoặc: phần điều khiển phải nằm trong ngoặc tròn còn thân phải nằm trong ngoặc nhọn. Khuôn "

Lời giải
for: (initialization; condition; increment) {
  statements;
}

" thêm dấu hai chấm sau từ khoá, mà dấu hai chấm trong C chỉ dùng cho nhãn, và nhãn thì không được trùng từ khoá.

Mở trang câu hỏi này →
24What will the following program print?4 lựa chọncó code
Đề bài
#include <stdio.h>

int main()
{
    int x = 5, y = 10;

    while(x++ < y--)
    {
        printf("%d %d\n", x, y);
    }

    return 0;
}
A2 5 3 4 4 3
B6 9 7 8 8 7
C5 10 7 8 8 7
D6 9 2 2 8 7
Lời giải
Đáp án đúng: "6 9 7 8 8 7". Then chốt nằm ở dạng hậu tố của x++ và y--: điều kiện được so trên giá trị cũ, nhưng ngay khi việc so sánh xong thì hai biến đã mang giá trị mới, nên printf trong thân vòng lặp luôn thấy giá trị đã tăng giảm. Lượt một so 5 với 10, x thành 6 và y thành 9, in 6 9. Lượt hai so 6 với 9, x thành 7 và y thành 8, in 7 8. Lượt ba so 7 với 8, x thành 8 và y thành 7, in 8 7. Lượt bốn so 8 với 7 nên điều kiện sai và vòng lặp dừng, dù x cùng y vẫn kịp đổi thành 9 và 6. Lựa chọn mở đầu bằng "5 10" coi như printf thấy giá trị trước khi tăng giảm, tức hiểu sai dạng hậu tố. Lựa chọn mở đầu bằng "2 5" không khớp bước nào vì x chỉ tăng còn y chỉ giảm. Lựa chọn chứa dòng "2 2" đòi hai biến gặp nhau ở 2, nhưng chúng gặp nhau quanh 8 và 7 rồi vòng lặp kết thúc.
Mở trang câu hỏi này →
Đề bài
double result;
char op = '*';
int num1 = 5, num2 = 4;
switch (op) {
    case '+': result = num1 + num2; break;
    case '-': result = num1 - num2; break;
    case '*': result = num1 * num2; break;
    case '/': if (num2 != 0) result = num1 / num2; break;
    default: printf("Invalid Operator");
}
printf("%d", result);
A20
B9
C1.25
D0
Lời giải
Đáp án đúng: "20". Biến op mang hằng ký tự dấu nhân, nên switch rẽ vào đúng nhãn khớp với ký tự đó và thực hiện result bằng num1 nhân num2, tức 5 nhân 4 bằng 20, rồi break thoát switch. Cần công bố một khuyết điểm của đề: result khai báo kiểu double nhưng lại in bằng đặc tả số nguyên, đây là sai khớp định dạng nên con số hiện trên màn hình không được bảo đảm; câu hỏi chỉ xét giá trị mà switch tính ra, và giá trị đó là 20. Lựa chọn "9" là kết quả của nhánh cộng, chỉ chạy nếu op mang dấu cộng. Lựa chọn "1.25" là 5 chia 4 theo nghĩa thực, nhưng nhánh chia không được chọn, và hơn nữa num1 chia num2 giữa hai số nguyên sẽ cho 1 chứ không phải 1.25. Lựa chọn "0" ứng với trường hợp result chưa bao giờ được gán, tức op không khớp nhãn nào và chỉ nhánh mặc định chạy.
Mở trang câu hỏi này →
AIt can only be used with integer or character type expressions.
BIt can be used with any data type.
CIt can only be used in functions.
DIt can only have one case statement inside.
Lời giải
Đáp án đúng: "It can only be used with integer or character type expressions.". Chuẩn C đòi biểu thức điều khiển của switch phải có kiểu nguyên, và mỗi nhãn case phải là hằng nguyên tính được lúc dịch; ký tự thoả yêu cầu này vì char được nâng lên int và hằng ký tự chính là một số nguyên. Lý do nằm ở cách dịch: trình dịch cần so sánh bằng chính xác hoặc dựng bảng nhảy, điều không làm được với số thực hay chuỗi. Lựa chọn "It can be used with any data type." sai vì float, double hay mảng ký tự đều bị từ chối, muốn phân nhánh theo chúng phải dùng chuỗi if else. Lựa chọn "It can only be used in functions." không nói lên điều gì riêng của switch, bởi mọi câu lệnh thực thi trong C đều nằm trong thân hàm. Lựa chọn "It can only have one case statement inside." sai vì switch mang bao nhiêu nhãn case cũng được, đó chính là lý do người ta chọn nó.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int  main()
{
        int x=7;
        for(;x>3;)
            printf("Yes");
            x--;
    return 0;
}
AInfinite loop
BCompile time error
CYesYesYesYes
DYes
Lời giải
Đáp án đúng: "Infinite loop". Phạm vi của thân vòng lặp do ngoặc nhọn quyết định, không do thụt lề: for ở đây không mở ngoặc nhọn nên thân nó chỉ ôm đúng một lệnh là printf, còn x-- nằm ngoài vòng lặp dù được thụt vào cho giống thân. Vì vậy x giữ nguyên giá trị 7, điều kiện x lớn hơn 3 mãi đúng, chương trình in Yes không ngừng và x-- không bao giờ tới lượt chạy. Lựa chọn "Compile time error" sai vì for cho phép bỏ trống cả phần khởi tạo và phần cập nhật, chỉ cần giữ hai dấu chấm phẩy, nên mã này dịch được. Lựa chọn "YesYesYesYes" là kết quả nếu x-- được đưa vào trong ngoặc nhọn cùng printf, khi đó x giảm từ 7 xuống 3 và in bốn lần. Lựa chọn "Yes" đòi vòng lặp chỉ chạy một lượt, điều chỉ xảy ra nếu có break hoặc nếu điều kiện hỏng ngay sau lượt đầu.
Mở trang câu hỏi này →
AThe loop is skipped entirely.
BThe loop executes indefinitely.
CThe loop executes once and then terminates.
DAn error occurs.
Lời giải
Đáp án đúng: "The loop is skipped entirely.". while là vòng lặp kiểm tra trước: điều kiện được xét trước khi thân chạy lần nào, nên nếu nó sai ngay từ đầu thì thân không chạy lượt nào và chương trình đi thẳng tới lệnh sau vòng lặp. Đây chính là điểm phân biệt với do while, loại luôn chạy thân ít nhất một lần vì điều kiện bị xét ở cuối. Lựa chọn "The loop executes indefinitely." mô tả tình huống ngược lại, khi điều kiện luôn đúng vì thân không làm biến điều kiện thay đổi. Lựa chọn "The loop executes once and then terminates." đúng với do while chứ không đúng với while. Lựa chọn "An error occurs." sai vì điều kiện sai ngay từ đầu là tình huống hoàn toàn hợp lệ và thường dùng, chẳng hạn vòng lặp đọc dữ liệu khi không còn dữ liệu nào để đọc.
Mở trang câu hỏi này →
29What does the following program display?4 lựa chọncó code
Đề bài
#include <stdio.h>
int main() {
    int arr[] = {3, 6, 9, 12};
    for (int i = 3; i >= 0; i -= 2)
        printf("%d ", arr[i]);
    return 0;
}
A3 9
B12 6
C12 6 3
D12 9 6
Lời giải
Đáp án đúng: "12 6". Vòng lặp khởi tạo i bằng 3, điều kiện là i không nhỏ hơn 0, và mỗi lượt i giảm đi 2. Lượt đầu i bằng 3 nên in phần tử cuối mảng là 12; lượt sau i bằng 1 nên in phần tử thứ hai là 6; tiếp đó i thành -1, điều kiện sai nên dừng. Hai bước đã đủ vì bước nhảy 2 làm vòng lặp chỉ chạm các chỉ số lẻ. Lựa chọn "3 9" là kết quả khi đi từ chỉ số 0 tăng dần 2 đơn vị, tức đọc các chỉ số chẵn theo chiều thuận. Lựa chọn "12 6 3" thêm phần tử đầu mảng, nhưng từ chỉ số 1 giảm 2 sẽ ra -1 chứ không ghé chỉ số 0. Lựa chọn "12 9 6" ứng với bước giảm 1 đơn vị rồi dừng sớm, không khớp với phép giảm 2 viết trong mã.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
void main()
{
    int i = 0;
    while (i < 5)
    {
        i++;
        printf("Hi-");
        while (i < 4)
        {
            i++;
            printf("Hello-");
        }
    }
}
AHi-Hi-Hi-Hi-Hello-Hello-Hello-Hi-
BHi-Hi-Hi-Hi-Hi-Hello-Hello-Hello-
CHi-Hello-Hello-Hello-Hello-Hi-
DHi-Hello-Hello-Hello-Hi-
Lời giải
Đáp án đúng: "Hi-Hello-Hello-Hello-Hi-". Hai vòng lặp dùng chung biến i nên vòng trong ăn luôn phần đếm của vòng ngoài. Vào vòng ngoài lần đầu với i bằng 0: i tăng thành 1 rồi in Hi-; vòng trong chạy khi i còn nhỏ hơn 4, lần lượt đưa i lên 2, 3, 4 và in Hello- ba lần. Quay lại vòng ngoài, i bằng 4 vẫn nhỏ hơn 5 nên i thành 5 và in Hi- lần thứ hai; lúc này điều kiện vòng trong đã sai nên không in thêm Hello-. Vòng ngoài kiểm tra lại, i bằng 5 nên dừng. Lựa chọn "Hi-Hi-Hi-Hi-Hello-Hello-Hello-Hi-" giả định vòng ngoài chạy nhiều lượt trước khi vòng trong vào việc, trái với thứ tự lồng nhau. Lựa chọn "Hi-Hi-Hi-Hi-Hi-Hello-Hello-Hello-" tách hẳn hai vòng thành hai giai đoạn rời. Lựa chọn "Hi-Hello-Hello-Hello-Hello-Hi-" đếm bốn lần Hello-, nhưng i đã là 1 khi vào vòng trong nên chỉ còn ba bước để tới 4.
Mở trang câu hỏi này →
31What is the output of the following code?4 lựa chọncó code
Đề bài
for (int i = 0; i < 5; i++) {
    if (i == 2) continue;
    printf("%d ", i);
}
A0 1 3 4
B0 1 2 3 4
C0 1
D2 3 4
Lời giải
Đáp án đúng: "0 1 3 4". Lệnh continue không thoát vòng lặp, nó chỉ bỏ phần thân còn lại của lượt đang chạy rồi nhảy tới bước cập nhật và kiểm tra điều kiện. Với i bằng 0 và 1 thì điều kiện trong không thoả nên printf chạy; tới i bằng 2, continue cắt ngang trước printf nên số 2 không được in, nhưng i vẫn tăng bình thường; các lượt i bằng 3 và 4 lại in như thường. Lựa chọn "0 1 2 3 4" là kết quả nếu bỏ hẳn câu điều kiện, tức không bỏ qua lượt nào. Lựa chọn "0 1" là kết quả nếu dùng break, vì break mới kết thúc cả vòng lặp tại i bằng 2. Lựa chọn "2 3 4" làm ngược lại ý nghĩa của câu điều kiện, như thể chỉ bắt đầu in từ lúc i đạt 2.
Mở trang câu hỏi này →
AIt must always be placed at the beginning of the switch statement
BIt is mandatory for every switch statement
CIt executes when none of the case conditions match
DIt can be used multiple times within a single switch
Lời giải
Đáp án đúng: "It executes when none of the case conditions match". Nhánh mặc định là nơi switch rẽ vào khi giá trị của biểu thức điều khiển không khớp bất kỳ nhãn case nào, nhờ đó mọi đầu vào ngoài dự kiến vẫn được xử lý thay vì rơi qua switch mà không làm gì. Lựa chọn "It must always be placed at the beginning of the switch statement" sai vì vị trí của nó tự do, đặt ở cuối chỉ là thói quen cho dễ đọc, và nếu đặt giữa thì vẫn cần break để không chạy tràn sang nhãn sau. Lựa chọn "It is mandatory for every switch statement" sai vì nhánh này không bắt buộc, thiếu nó thì switch đơn giản không làm gì khi không khớp. Lựa chọn "It can be used multiple times within a single switch" sai vì mỗi switch chỉ được có một nhánh mặc định, viết hai lần là lỗi dịch.
Mở trang câu hỏi này →
AThe way the condition is checked.
BThey are essentially the same.
CThe type of tasks they can perform.
DThe variable in loop construct.
Lời giải
Đáp án đúng: "The way the condition is checked.". Khác biệt cốt lõi nằm ở chỗ điều kiện được xét trước hay sau thân vòng lặp: while xét trước nên thân có thể không chạy lần nào, còn do while xét ở cuối nên thân luôn chạy ít nhất một lượt. Hệ quả thực tế là do while phù hợp cho việc phải làm một lần rồi mới quyết định lặp lại, chẳng hạn hiện bảng chọn rồi đọc lựa chọn của người dùng. Lựa chọn "They are essentially the same." sai vì hai dạng cho kết quả khác nhau ngay khi điều kiện sai từ đầu. Lựa chọn "The type of tasks they can perform." sai vì cả hai đều lặp được mọi việc và luôn viết lại được từ dạng này sang dạng kia. Lựa chọn "The variable in loop construct." sai vì cả hai đều không ràng buộc phải dùng biến nào, điều kiện có thể là bất kỳ biểu thức nào.
Mở trang câu hỏi này →
AThe condition
BThe initialization block
CThe iteration statement
DThe body of the loop
Lời giải
Đáp án đúng: "The initialization block". Cấu trúc for có ba phần trong ngoặc tròn, cách nhau bằng dấu chấm phẩy, và phần đầu chạy đúng một lần trước khi vòng lặp thực sự bắt đầu, thường để tạo và gán giá trị đầu cho biến đếm. Thứ tự sau đó lặp lại mãi: kiểm điều kiện, chạy thân, rồi chạy phần cập nhật. Mô tả "The condition" được kiểm trước mỗi nhịp kể cả nhịp đầu, nhưng nó chỉ chạy sau khi phần khởi tạo đã xong nên không phải thứ chạy trước vòng lặp. Mô tả "The iteration statement" là phần thứ ba, chạy ở cuối mỗi nhịp rồi mới quay lại kiểm điều kiện. Mô tả "The body of the loop" chỉ chạy khi điều kiện còn đúng, và có thể không chạy lần nào nếu điều kiện sai ngay từ đầu.
Mở trang câu hỏi này →
35What will be the output of the following C code?4 lựa chọncó code
Đề bài
#include <stdio.h>
void main()
{
    int total=0;
    for(int s=1; s<15; s++)
        total=total+s;
    printf("%d",total);
}
A105
B150
C120
D210
Lời giải
Đáp án đúng: "105". Biến s khởi tạo bằng 1 và vòng lặp còn chạy khi s nhỏ hơn 15, nên s nhận lần lượt các giá trị từ 1 tới 14; thân vòng không có ngoặc nhọn nên chỉ gồm đúng lệnh cộng dồn total = total + s. Tổng các số nguyên từ 1 tới 14 bằng 14 nhân 15 rồi chia 2, tức 105, và printf in giá trị đó. Số "150" không ứng với tổng của dãy liên tiếp nào ở đây. Số "120" là tổng từ 1 tới 15, tức hiểu điều kiện s nhỏ hơn 15 thành nhỏ hơn hoặc bằng 15, nhưng khi s lên 15 thì điều kiện đã sai và thân vòng không chạy nữa. Số "210" là tổng từ 1 tới 20. Kiểu void main không chuẩn nhưng nhiều trình dịch vẫn nhận, nên kết quả in ra không đổi.
Mở trang câu hỏi này →
Awhile (condition) { statements; }
B(condition){ statements ;}
Cwhile (condition) { statements };
D{ statements } while (condition);
Lời giải

Đáp án đúng: "

Lời giải
while (condition) {
  statements;
}

". Vòng while chuẩn gồm từ khoá while, điều kiện trong ngoặc tròn, rồi một câu lệnh làm thân; thân là cả khối khi bọc trong ngoặc nhọn, và mỗi câu lệnh bên trong khối phải kết thúc bằng dấu chấm phẩy. Sau ngoặc nhọn đóng không cần dấu chấm phẩy vì khối đã là một câu lệnh hoàn chỉnh. Dạng "(condition){ statements ;}" thiếu hẳn từ khoá while nên trình dịch chỉ thấy một biểu thức rồi một khối rời rạc. Dạng "

Lời giải
while (condition) {
  statements
}

;" đặt dấu chấm phẩy sai chỗ: lệnh bên trong khối bị bỏ dấu kết thúc, còn dấu chấm phẩy lại nằm sau ngoặc nhọn đóng. Dạng "{ statements } while (condition); " là do while nhưng mất từ khoá do mở đầu, nên khối và phần while thành hai mảnh không gắn với nhau.

Mở trang câu hỏi này →
Đề bài
for (i = 2; i <= n; i++) {
    S *= i;
}
printf("%d", S);
A120
B60
C24
D100
Lời giải
Đáp án đúng: "120". Biến tích khởi tạo bằng 1 vì đó là phần tử trung tính của phép nhân; khởi tạo bằng 0 thì mọi phép nhân sau đó đều cho 0. Vòng lặp cho i chạy từ 2 tới n là 5, mỗi nhịp nhân dồn, nên giá trị lần lượt là 2, 6, 24 rồi 120, đúng bằng giai thừa của 5. Số "60" đúng bằng tích của 3, 4 và 5, tức bỏ mất nhịp nhân với 2 ở đầu vòng lặp. Số "24" là giai thừa của 4, tức kết quả khi điều kiện dừng ở i nhỏ hơn n thay vì nhỏ hơn hoặc bằng n, bỏ mất nhịp cuối. Số "100" không phải tích của dãy số nguyên liên tiếp nào bắt đầu từ 2. Ở đây thân vòng có ngoặc nhọn nên phạm vi rõ ràng, dù bên trong chỉ có một lệnh.
Mở trang câu hỏi này →
AIt is used to decide whether the part of the code will be executed or not based on the specified condition.
BIt allows you to repeat a block of code a specified number of times.
CIt is used to define a function in a programming language.
DIt is used to declare variables and assign values to them.
Lời giải
Đáp án đúng: "It is used to decide whether the part of the code will be executed or not based on the specified condition." Cấu trúc if tính giá trị biểu thức điều kiện, coi khác không là đúng, rồi chạy nhánh tương ứng, nhờ đó một khối mã có chạy hay không phụ thuộc dữ liệu lúc chạy. Cần nhớ nhánh không bọc ngoặc nhọn chỉ ôm đúng một lệnh, nên lệnh viết sau đó nằm ngoài nhánh dù được thụt vào. Câu "It allows you to repeat a block of code a specified number of times." là việc của vòng lặp; if không bao giờ quay lại chạy khối lần nữa. Câu "It is used to define a function in a programming language." sai vì định nghĩa hàm cần kiểu trả về, tên hàm và danh sách tham số. Câu "It is used to declare variables and assign values to them." là việc của câu khai báo và phép gán, hai thứ độc lập với điều kiện.
Mở trang câu hỏi này →
ATo execute a block of codes repeatedly as long as a specified condition is true.
BTo perform mathematical calculations.
CTo define variables within a program.
DTo execute a statement based on a condition
Lời giải
Đáp án đúng: "To execute a block of codes repeatedly as long as a specified condition is true." Vòng lặp trong C gồm một điều kiện và một thân; mỗi nhịp kiểm điều kiện rồi chạy thân, nên cùng một đoạn mã được dùng lại nhiều lần với dữ liệu khác nhau, và dừng khi điều kiện hết đúng. Thân là cả khối nếu bọc ngoặc nhọn, còn không thì chỉ gồm đúng một lệnh. Câu "To perform mathematical calculations." sai vì phép tính là việc của toán tử và hàm thư viện, thân vòng lặp có thể chẳng có phép tính nào. Câu "To define variables within a program." là việc của câu khai báo; phần khởi tạo của for có thể khai báo biến đếm nhưng đó không phải mục đích của vòng lặp. Câu "To execute a statement based on a condition" mô tả if: chạy hay không chạy một lần, thiếu hẳn ý lặp lại.
Mở trang câu hỏi này →
A(condition) ? True_Value : False_Value
Bfor ( InitBlock; Condition; Task2) Task1;
Cdo{ statements;} while (condition) ;
Dwhile (condition){ statements; }
Lời giải

Đáp án đúng: "(condition) ? True_Value : False_Value". Đây là toán tử điều kiện ba toán hạng: nó tính điều kiện rồi cho ra một trong hai giá trị, tức là một biểu thức trả về giá trị, chạy đúng một lần và không có cơ chế quay lại, nên không phải cấu trúc lặp. Dạng "for ( InitBlock; Condition; Task2) Task1; " là for chuẩn với ba phần khởi tạo, điều kiện, cập nhật, còn thân chỉ là một lệnh nên không cần ngoặc nhọn. Dạng "do{ statements;} while (condition) ; " là do while, chạy thân trước rồi mới kiểm điều kiện nên thân luôn chạy ít nhất một lần, và dấu chấm phẩy cuối là bắt buộc. Dạng "

Lời giải
while (condition){
  statements;
}

" là while chuẩn, kiểm điều kiện trước mỗi nhịp. Ba dạng này đều lặp được, chỉ toán tử điều kiện là không.

Mở trang câu hỏi này →