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.

Danh sách câu hỏi

20/40 câuCòn 20
1What will be the output of the following C code?4 lựa chọncó code
Đề bài
#include <stdio.h>
void main()
{
    int x = 0;
    if (x == 0)
        printf("Hi");
    else
        printf("How are you");
        printf("Hello");
}
AHi
BHow are you
CHello
DHiHello
Lời giải
Đáp án đúng: "HiHello". Nhánh if và nhánh else khi không có ngoặc nhọn chỉ ôm đúng một lệnh ngay sau nó, nên nhánh else chỉ nhận lệnh in How are you; lệnh in Hello nằm ngoài cả hai nhánh dù được thụt vào cho giống thân else, bởi phạm vi khối trong C do ngoặc nhọn quyết định, không do thụt lề. x bằng 0 nên điều kiện x == 0 đúng, chương trình in Hi, bỏ qua nhánh else, rồi chạy tiếp lệnh in Hello; printf không tự xuống dòng nên hai chuỗi dính liền thành một dòng. "Hi" sai vì bỏ sót lệnh in nằm ngoài khối, lệnh đó luôn chạy. "How are you" sai vì nhánh else không chạy khi điều kiện đã đúng. "Hello" sai vì lệnh in Hi vẫn chạy trước đó.
Mở trang câu hỏi này →
AA "for" loop is used for iterating over a sequence of elements, while a "while" loop is used to execute a block of code repeatedly as long as a condition is true.
BA "for" loop is primarily used for conditional statements, while a "while" loop is designed for sequential processing.
CThe use of "for" and "while" loops is interchangeable; there is no substantial difference between them.
DA "for" loop is exclusively used with arrays, while a "while" loop is used with numerical calculations.
Lời giải
Đáp án đúng: "A "for" loop is used for iterating over a sequence of elements, while a "while" loop is used to execute a block of code repeatedly as long as a condition is true." Hai cấu trúc đều là vòng lặp và về lý thuyết thay nhau được, nhưng khuôn dạng quyết định chỗ dùng tự nhiên: vòng for gom khởi tạo, kiểm tra và cập nhật vào một dòng nên hợp với việc duyệt một dãy có số bước biết trước; vòng while chỉ có điều kiện nên hợp với việc lặp tới khi một điều kiện đổi, chẳng hạn chờ người dùng nhập đúng. "A "for" loop is primarily used for conditional statements, while a "while" loop is designed for sequential processing." sai vì câu điều kiện là việc của if và switch, vòng for không phải cấu trúc rẽ nhánh. Nhận định rằng hai khuôn lặp dùng thay nhau được và "there is no substantial difference between them" sai ở chỗ phủ nhận khác biệt, trong khi khác biệt về cú pháp và thói quen dùng là có thật. "A "for" loop is exclusively used with arrays, while a "while" loop is used with numerical calculations." sai vì vòng for chạy được với mọi biến đếm, không giới hạn ở mảng.
Mở trang câu hỏi này →
AThe program will skip the if-else block and continue with the next statement.
BThe program will raise an error.
CThe else if block will be executed.
DThe program will terminate abruptly.
Lời giải
Đáp án đúng: "The program will skip the if-else block and continue with the next statement." Cấu trúc if không bắt buộc có nhánh else trần; nếu mọi điều kiện đều sai và không có nhánh nào không điều kiện, luồng điều khiển chỉ đi qua cả chuỗi mà không chạy nhánh nào, rồi tiếp tục ở lệnh ngay sau cấu trúc. "The program will raise an error." sai vì điều kiện sai là tình huống bình thường của chương trình, không phải lỗi. "The else if block will be executed." sai vì nhánh else if cũng có điều kiện riêng, mà đề đã nói mọi điều kiện đều sai nên nhánh đó không chạy. "The program will terminate abruptly." sai vì không có lệnh kết thúc nào được gọi, chương trình chạy tiếp bình thường.
Mở trang câu hỏi này →
4What will the following program output?4 lựa chọncó code
Đề bài
#include <stdio.h>

int main()
{
    int a = -5;

    switch ((a > 0) - (a < 0)) {
        case 1:
            printf("a is an positive number.");
            break;
        case -1:
            printf("a is an negative number.");
            break;
        default:
            printf("a is zero.");
    }

    return 0;
}
Aa is an positive number.
Ba is an negative number.
Ca is zero.
DAn error will be raised.
Lời giải
Đáp án đúng: "a is an negative number." a bằng -5 nên phép so sánh a > 0 cho 0 và a < 0 cho 1; biểu thức chọn nhánh là 0 trừ 1, tức -1, và switch so khớp với nhãn case -1 nên in ra câu nói a là số âm rồi break thoát. Mẹo (a > 0) - (a < 0) chính là hàm dấu, nó dựa vào bản chất của C là phép so sánh trả về số nguyên 1 hoặc 0 chứ không trả về kiểu luận lý riêng. "a is an positive number." đòi biểu thức bằng 1, chỉ xảy ra khi a dương. "a is zero." là nhánh default, chỉ chạy khi hiệu bằng 0, tức khi a bằng 0. "An error will be raised." sai vì switch chỉ cần một biểu thức nguyên, nhãn case mang giá trị âm hoàn toàn hợp lệ.
Mở trang câu hỏi này →
ACheck the day of the week.
BSort an array ascending.
CSort an array descending.
DFind the average value of a sequence.
Lời giải
Đáp án đúng: "Check the day of the week." Lệnh switch so khớp một giá trị nguyên hoặc ký tự với từng nhãn hằng, nên nó hợp đúng với bài toán phân loại theo một tập giá trị rời rạc biết trước; thứ trong tuần chỉ có bảy giá trị nên mỗi case ứng một thứ, đọc rõ hơn chuỗi if else dài. "Sort an array ascending." sai vì sắp xếp cần so sánh và đổi chỗ từng cặp phần tử trong vòng lặp, không có tập nhãn hằng nào để so khớp. "Sort an array descending." sai vì lý do y hệt, chỉ khác chiều so sánh; switch không so sánh lớn nhỏ, nó chỉ xét bằng. "Find the average value of a sequence." sai vì tính trung bình là cộng dồn rồi chia, việc của vòng lặp và biểu thức số học, hơn nữa số phần tử không giới hạn nên không thể liệt kê thành case.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main()
{
    int i,j,result=0;
    for(i=3;i<=5;i++){
            for(j=5;j>i;j--)
            result+=j;
        }
    printf("%d",result);
            return 0;
}
A14
B15
C16
D20
Lời giải

Đáp án đúng: "14". Vòng trong for(j=5;j>i;j--) không có ngoặc nhọn nên thân nó chỉ gồm đúng một lệnh result+=j; phạm vi khối trong C do ngoặc nhọn quyết định, không do thụt lề. Lần theo từng lượt: i bằng 3 thì j nhận 5 rồi 4, cộng được 9; i bằng 4 thì j chỉ nhận 5, result thành 14; i bằng 5 thì j khởi tạo bằng 5 không thoả j>i nên vòng trong không chạy lần nào. Chương trình in 14. Cần công bố khuyết điểm: bản khoá in kèm ghi 16, con số đó không khớp với bất kỳ lần lần theo trung thực nào của hai vòng lặp. "15" là tổng 5+4+3+2+1, chỉ ra được nếu bỏ ràng buộc j>i và cho j chạy tới 1. "16" lớn hơn tổng thật 2 đơn vị mà không lượt lặp nào cộng thêm 2. "20" đòi cộng cả những giá trị j mà điều kiện j>i đã chặn.

Mở trang câu hỏi này →
Đề bài
#include<stdio.h>

int main()
{
    char i, j;
    for (i = 'A'; i <= 'E'; i++)
    {
        for (j = 'A'; j <= i; j++)
        {
            printf("%c", i);
        }
        printf("\n");
    }
    return 0;
}
AA BB CCC DDDD EEEEE
BAAAAA BBBB CCC DD E
CA AB ABC ABCD ABCDE
DA AA AAA AAAA AAAAA
Lời giải
Đáp án đúng: "A BB CCC DDDD EEEEE". Vòng ngoài cho i chạy từ ký tự A tới E; với mỗi i, vòng trong cho j chạy từ A tới i nên số lượt đúng bằng thứ tự của i trong bảng mã, và thân vòng trong luôn in i chứ không in j. Vì thế dòng đầu có một ký tự A, dòng sau hai ký tự B, rồi ba ký tự C, bốn ký tự D, năm ký tự E; lệnh xuống dòng nằm trong vòng ngoài nên mỗi giá trị của i xuống dòng một lần. «AAAAA BBBB CCC DD E» sai vì số ký tự mỗi dòng phải tăng dần theo i, lại thêm khoảng trắng thụt đầu dòng mà mã không hề in. "A AB ABC ABCD ABCDE" là kết quả nếu thân vòng trong in j; ở đây in i nên các ký tự trên cùng một dòng giống nhau. "A AA AAA AAAA AAAAA" là kết quả nếu luôn in một ký tự cố định, nhưng ký tự in ra đổi theo i.
Mở trang câu hỏi này →
AThe loop exits immediately.
BThe loop continues with the next iteration and skips the remaining statements.
CThe program terminates completely, and all variables are destroyed.
DNothing happens; the break statement is completely ignored in for loops
Lời giải
Đáp án đúng: "The loop exits immediately." Lệnh break chuyển điều khiển ra ngay lệnh đầu tiên sau thân vòng lặp, bỏ luôn phần còn lại của lượt hiện tại và không chạy bước cập nhật biến đếm nữa; đó là cách thoát sớm khi đã tìm được thứ cần tìm, chỉ thoát một cấp vòng lặp gần nhất. "The loop continues with the next iteration and skips the remaining statements." là mô tả của continue, một lệnh khác: continue bỏ phần còn lại của lượt rồi quay về bước cập nhật và kiểm tra điều kiện. "The program terminates completely, and all variables are destroyed." sai vì kết thúc chương trình là việc của return trong main hoặc hàm exit. "Nothing happens; the break statement is completely ignored in for loops" sai vì break có hiệu lực giống nhau trong for, while, do while và switch.
Mở trang câu hỏi này →
9What will be the output of the following code?4 lựa chọncó code
Đề bài
int i = 10;
while (i > 0) {
    printf("%d ", i);
    i -= 3;
}
A10 7 4 1
B10 9 8 7 6 5 4 3 2 1
C10 7 4 1 -2
D10 7 4 1 -2 -5
Lời giải
Đáp án đúng: "10 7 4 1". i khởi tạo bằng 10; mỗi lượt thân vòng in i rồi trừ đi 3, nên lần lượt in 10, 7, 4, 1; sau lượt in 1 thì i thành -2, điều kiện i > 0 sai nên vòng lặp dừng trước khi in thêm. Bản chất của while là kiểm tra điều kiện trước mỗi lượt, vì vậy giá trị âm không bao giờ tới được lệnh in. "10 9 8 7 6 5 4 3 2 1" là kết quả nếu bước giảm là 1, trong khi i -= 3 trừ ba đơn vị mỗi lượt. "10 7 4 1 -2" sai vì khi i bằng -2 thì điều kiện đã sai, mà lệnh in nằm trong thân vòng nên không chạy nữa. "10 7 4 1 -2 -5" sai nặng hơn, nó cho vòng lặp chạy thêm hai lượt dù điều kiện i > 0 đã không còn đúng.
Mở trang câu hỏi này →
Đề bài
#include<stdio.h>
int main()
{
    int a=10,b=20,c=30;
    while(a>1)
    {
        if(b%2!=0)
            a/=10;
        b--;
        c*=2;
    }
    printf("%d ; %d ; %d",a,b,c);
    return 0;
}
A1 ; 18 ; 120
B10 ; 19 ; 60
C1 ; 20 ; 60
D10 ; 19 ; 120
Lời giải
Đáp án đúng: "1 ; 18 ; 120". Điểm then chốt là phạm vi khối do ngoặc nhọn quyết định, không do thụt lề: lệnh if trong vòng while không có cặp ngoặc nhọn nên nó chỉ ôm đúng một lệnh a/=10, còn b-- và c*=2 nằm ngoài if và chạy ở mọi lượt dù được thụt vào trông như thuộc nhánh đó. Lượt thứ nhất b bằng 20 chia hết cho 2 nên a giữ nguyên 10, b về 19, c lên 60. Lượt thứ hai b bằng 19 là số lẻ nên a/=10 đưa a về 1, b về 18, c lên 120. Kiểm tra lần ba, a bằng 1 không còn lớn hơn 1 nên vòng lặp dừng. Ý "10 ; 19 ; 60" sai vì nó dừng lại sau một lượt, trong khi điều kiện a>1 vẫn đúng nên vòng lặp phải chạy tiếp. Ý "1 ; 20 ; 60" sai vì b-- chạy mỗi lượt nên b không thể giữ nguyên 20. Ý "10 ; 19 ; 120" sai vì c đã nhân đôi hai lần thì vòng lặp đã đi hai lượt, mà cách duy nhất để vòng lặp kết thúc là a bị chia về 1.
Mở trang câu hỏi này →
11What is the output of this reverse loop?4 lựa chọncó code
Đề bài
#define SIZE 5
int nums[SIZE] = {5, 10, 2, -45, 6};
for (int i = SIZE - 1; i >= 0; i--)
    printf("%d ", nums[i]);
A5 10 2 -45 6
B6 -45 2 10 5
C-45 2 10 5 6
DError
Lời giải
Đáp án đúng: "6 -45 2 10 5". Vòng for đặt i bắt đầu ở SIZE trừ 1 là 4, chạy tiếp khi i còn lớn hơn hoặc bằng 0 và giảm một đơn vị mỗi lượt, nên các chỉ số được thăm theo thứ tự 4, 3, 2, 1, 0. Đọc mảng theo thứ tự đó cho ra 6, -45, 2, 10, 5, mỗi số kèm một dấu cách vì chuỗi định dạng có dấu cách ở cuối. Ở đây vòng for không có cặp ngoặc nhọn nên nó chỉ ôm đúng một lệnh printf, vừa khớp ý định của mã. Ý "5 10 2 -45 6" sai vì đó là thứ tự xuôi, ứng với vòng lặp đi từ 0 lên. Ý "-45 2 10 5 6" sai vì nó bắt đầu từ chỉ số 3 rồi vòng lại phần tử cuối, không có phép lặp nào trong mã sinh ra trật tự ấy. Ý "Error" sai vì khai báo biến đếm ngay trong câu for là hợp lệ từ chuẩn C99, và chỉ số 4 vẫn nằm trong mảng 5 phần tử.
Mở trang câu hỏi này →
ALoop infinitely
BNo Output will be printed
CCompile time error
DThe loop will not work
Lời giải
Đáp án đúng: "Loop infinitely". Vòng lặp kiểm tra điều kiện trước mỗi lượt và chỉ thoát khi điều kiện cho giá trị 0; nếu điều kiện luôn khác không thì phép kiểm tra không bao giờ mở lối ra nên thân vòng lặp chạy mãi, trừ khi bên trong có break, return, goto hay một lời gọi kết thúc chương trình. Ý "No Output will be printed" sai vì nếu thân vòng lặp có lệnh in thì màn hình nhận dữ liệu không ngừng, ngược hẳn với việc không có gì; chỉ bộ đệm mới làm dữ liệu hiện ra chậm. Ý "Compile time error" sai vì trình biên dịch không có nhiệm vụ chứng minh một vòng lặp sẽ dừng, viết while với điều kiện 1 là mã hợp lệ và còn được dùng cố ý. Ý "The loop will not work" sai vì vòng lặp vẫn làm việc đúng như được viết, vấn đề là nó không chịu dừng.
Mở trang câu hỏi này →
13What will be the output of the following C code?4 lựa chọncó code
Đề bài
#include <stdio.h>
int main() {
    int x = 5, y = 10;

    if (x >= y) {
        printf("x is greater than or equal to y\n");
    } else {
        printf("x is less than y\n");
    }
    return 0;
}
Ax is greater than or equal to y
Bx is less than y
Cx is equal to y
DCompilation error
Lời giải
Đáp án đúng: "x is less than y". Điều kiện so sánh x lớn hơn hoặc bằng y được tính với x bằng 5 và y bằng 10; 5 không lớn hơn mà cũng không bằng 10 nên biểu thức cho 0, tức là sai, vì thế khối sau if bị bỏ qua và khối sau else được chạy. Chỉ một trong hai khối được chạy, đó là bản chất của cấu trúc rẽ nhánh hai đường. Ý "x is greater than or equal to y" sai vì đó là chuỗi nằm trong khối chỉ chạy khi điều kiện đúng, điều không xảy ra với bộ giá trị này. Ý "x is equal to y" sai vì trong mã không có chuỗi nào như vậy, chương trình chỉ in được một trong hai chuỗi đã viết sẵn. Ý "Compilation error" sai vì mọi biến đều được khai báo, hai khối đều có cặp ngoặc nhọn đầy đủ và các lời gọi printf đều hợp lệ.
Mở trang câu hỏi này →
Aif
Bswitch
Cwhile
Dfor
Lời giải
Đáp án đúng: "switch". Lệnh switch tính một biểu thức nguyên rồi so khớp giá trị ấy với các hằng ghi ở từng nhãn case, nhờ đó nhiều trường hợp rời rạc của cùng một biến được xếp cạnh nhau thành một bảng dễ đọc; trình biên dịch còn có thể dựng bảng nhảy để tới thẳng nhánh đúng thay vì thử lần lượt. Lệnh "if" cũng rẽ nhánh được nhưng mỗi lần chỉ xét một biểu thức đúng hoặc sai, muốn phủ nhiều giá trị thì phải viết chuỗi else if dài, lặp lại tên biến và mất hẳn dạng bảng. Lệnh "while" là vòng lặp kiểm điều kiện trước mỗi lần chạy, nhiệm vụ của nó là lặp lại công việc chứ không phải chọn một nhánh trong nhiều nhánh. Lệnh "for" cũng là vòng lặp, chỉ gói sẵn phần khởi tạo, điều kiện và cập nhật trong một cặp ngoặc; dùng nó để chọn trường hợp là đi lệch công dụng của cấu trúc.
Mở trang câu hỏi này →
Đề bài
    #include <stdio.h>
    int main()
    {
        int a = 1;
        switch (a)
        case 1:
            printf("%d", a);
        case 2:
            printf("%d", a);
        case 3:
            printf("%d", a);
        return 0;
}
ANo error, output is 1111
BNo error, output is 1
CCompile time error, no break statements
DCompile time error, case label outside switch statement
Lời giải
Đáp án đúng: "Compile time error, case label outside switch statement". Phạm vi của một khối do ngoặc nhọn quyết định, không do thụt lề: sau switch (a) ở đây không có ngoặc nhọn nào, nên thân của switch chỉ ôm đúng một lệnh, và lệnh đó là lệnh mang nhãn case 1 kèm lời gọi in giá trị a. Hai nhãn case 2 và case 3 viết tiếp phía sau đã nằm ngoài thân switch dù được thụt vào, mà nhãn case chỉ hợp lệ bên trong một switch, nên trình biên dịch dừng với lỗi nhãn case nằm ngoài lệnh switch. Kết luận "No error, output is 1111" sai cả hai mặt: chương trình không dịch được, và trong mã cũng chỉ có ba lệnh in. Kết luận "No error, output is 1" cũng giả định dịch được, hơn nữa nếu các nhãn đều nằm trong thân switch thì do không có break nên các nhánh sau vẫn chạy tiếp. Kết luận "Compile time error, no break statements" đúng chuyện có lỗi nhưng sai nguyên nhân: thiếu break không phải lỗi, đó là hành vi rơi xuống nhánh dưới mà chuẩn cho phép.
Mở trang câu hỏi này →
Awhile (condition) {...}
Bwhile (initialization; condition) {...}
Cwhile (condition; increment) {...}
Dwhile (initialization; increment; condition) {...}
Lời giải

Đáp án đúng: "

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

". Lệnh while trong C chỉ nhận duy nhất một biểu thức trong cặp ngoặc tròn; biểu thức đó được tính trước mỗi lần chạy thân và vòng lặp còn tiếp khi giá trị khác 0, nên mọi việc khởi tạo phải làm trước vòng lặp còn việc cập nhật phải nằm trong thân. Khuôn "

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

" đưa phần khởi tạo vào trong ngoặc, đó là thành phần riêng của for, hơn nữa dấu chấm phẩy không được phép xuất hiện trong ngoặc điều kiện. Khuôn "

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

" mắc đúng lỗi ấy: phần tăng giảm phải là một lệnh trong thân chứ không phải vế thứ hai của điều kiện. Khuôn "

Lời giải
while (initialization; increment; condition) {
  ...
}

" là khuôn ba phần của for và còn xếp sai trật tự, vì trong for thì điều kiện đứng giữa còn phần cập nhật đứng cuối.

Mở trang câu hỏi này →
Ado{ statements; } while(condition) ;
Bdo while(condition) { statements;}
Cdo{ statements; } while (condition)
Ddo( statements;) while (condition) ;
Lời giải

Đáp án đúng: "do{ statements; } while(condition) ; ". Vòng do-while chạy thân trước rồi mới kiểm điều kiện, và cả cấu trúc đó được ngôn ngữ coi là một lệnh duy nhất, nên bắt buộc phải kết thúc bằng dấu chấm phẩy ngay sau ngoặc điều kiện; thân có nhiều lệnh thì gom trong cặp ngoặc nhọn. Khuôn "do

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

" đặt điều kiện trước thân, thành ra do không có thân nào đi kèm còn khối phía sau trở thành một khối rời, sai hẳn trật tự của cấu trúc. Khuôn "do{ statements; } while (condition)" đúng mọi thứ trừ dấu chấm phẩy kết thúc, mà thiếu nó thì trình biên dịch coi lệnh chưa viết xong và báo lỗi cú pháp. Khuôn "do( statements;) while (condition) ; " dùng ngoặc tròn để gom lệnh, nhưng trong C chỉ cặp ngoặc nhọn mới tạo được khối lệnh, ngoặc tròn chỉ dành cho biểu thức và danh sách tham số.

Mở trang câu hỏi này →
Afor ( Init1, Init2; Condition ; Task1, Task2);
Bfor ( Init1, Condition ,Task1);
Cfor (Condition ; Init1, Init2; Task1);
Dfor ( Init1; Init2; Condition ; Task2)
Lời giải

Đáp án đúng: "for ( Init1, Init2; Condition ; Task1, Task2); ". Cặp ngoặc của for luôn chia thành đúng ba phần bởi hai dấu chấm phẩy: phần khởi tạo chạy một lần khi vào vòng, phần điều kiện kiểm trước mỗi lần chạy thân, phần cập nhật chạy sau mỗi lần chạy thân. Muốn nhồi nhiều việc vào một phần thì dùng toán tử phẩy, nên hai khởi tạo và hai việc cập nhật viết cách nhau bằng dấu phẩy là hợp lệ; dấu chấm phẩy ngay sau ngoặc đóng chỉ làm thân rỗng, vẫn dịch được. Khuôn "for ( Init1, Condition ,Task1); " chỉ dùng dấu phẩy nên cả ngoặc trở thành một biểu thức duy nhất, trình biên dịch không tìm ra điều kiện lặp. Khuôn "for (Condition ; Init1, Init2; Task1); " đảo chỗ: vế đầu bị tính một lần rồi bỏ, còn phần khởi tạo lại bị dùng làm điều kiện. Khuôn "for ( Init1; Init2; Condition ; Task2)"có tới ba dấu chấm phẩy, tức bốn phần, vượt khuôn mà ngôn ngữ cho phép.

Mở trang câu hỏi này →
ACompile time error
BLoop infinitely
CNo Output will be printed
DThe loop will not work
Lời giải
Đáp án đúng: "Compile time error". Câu hỏi viết thiếu một từ, phải hiểu là vòng while không có điều kiện lặp. Cú pháp của while trong C đòi bắt buộc một biểu thức điều khiển trong cặp ngoặc tròn, nên viết while với ngoặc rỗng là sai cú pháp: trình biên dịch báo lỗi và không sinh ra bản thực thi nào; muốn lặp mãi thì vẫn phải viết một biểu thức luôn đúng. Kết luận "Loop infinitely" là hành vi của while có điều kiện luôn khác 0, chẳng hạn hằng số 1, tức là vẫn có biểu thức chứ không phải để trống. Kết luận "No Output will be printed" giả định chương trình đã chạy rồi không in gì, trong khi ở đây chưa có chương trình nào để chạy. Kết luận "The loop will not work" cũng nói về lúc chạy và lại mơ hồ, không phân biệt được chuyện lỗi dịch với chuyện vòng lặp chạy không lần nào.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    int i = 10;
    do {
        printf("%d ", i);
        i -= 2;
    } while (i >= 1);
    return 0;
}
A10 8 6 4 2
B10 8 6 4 2 0
C10 8 6 4 2 0 -2 -4
D10 9 8 7 6 5 4 3 2
Lời giải
Đáp án đúng: "10 8 6 4 2". Phép kiểm điều kiện của vòng lặp này nằm ở cuối thân, nên mỗi lượt diễn ra theo đúng thứ tự in xong, giảm đi, rồi mới so sánh. Biến i vào vòng với 10: in 10 rồi i thành 8, in 8 rồi i thành 6, in 6 rồi i thành 4, in 4 rồi i thành 2, in 2 rồi i thành 0; lúc này điều kiện i lớn hơn hoặc bằng 1 cho sai nên vòng lặp dừng. Dãy "10 8 6 4 2 0" cần thân chạy thêm một lượt với i bằng 0, nhưng giá trị 0 chỉ sinh ra ở cuối lượt cuối và điều kiện đã chặn trước khi kịp in. Dãy "10 8 6 4 2 0 -2 -4" đòi điều kiện cho phép số âm, trong khi mốc so sánh là 1. Dãy "10 9 8 7 6 5 4 3 2" ứng với bước giảm một đơn vị, còn lệnh i -= 2 ở đây lấy đi hai đơn vị mỗi lượt nên chỉ in các số chẵn.
Mở trang câu hỏi này →