Danh sách câu hỏi của đề

Câu hỏi: PRF192 Cơ sở lập trình – Đề thi lại kỳ SP26

49 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 đúng thứ tự trong đề.

Danh sách câu hỏi

20/49 câuCòn 29
Đề bài
#include <stdio.h>
int x = 9;
void someFunction() {
    int x = 8;
    printf("%d ", x);
}
int main() {
    someFunction();
    printf("%d", x);
    return 0;
}
A8 9
B9 8
C8 8
D9 9
Lời giải
Đáp án đúng: "8 9". Hàm someFunction khai báo một biến cục bộ tên x bằng 8; tên cục bộ che tên toàn cục trong suốt thân hàm nên lệnh in trong hàm cho ra 8. Khi hàm trả về, biến cục bộ hết phạm vi, tên x trong main lại chỉ về biến toàn cục bằng 9 nên lệnh in sau cho ra 9; thứ tự thực thi là gọi hàm trước rồi mới in, vì vậy màn hình hiện 8 9. Cần công bố khuyết điểm: bản khoá in kèm ghi 9 8, thứ tự đó chỉ đúng nếu hai lệnh in đổi chỗ cho nhau, nên "9 8" sai. "8 8" sai vì sau khi ra khỏi hàm không còn biến cục bộ nào, không ai gán 8 cho biến toàn cục. "9 9" sai vì trong thân hàm biến cục bộ đã che biến toàn cục nên lệnh in ở đó không thể thấy giá trị 9.
Mở trang câu hỏi này →
AC has object-oriented features.
BC is English-like
CC is faster and more powerful than other high-level languages.
DC supports basic ways to understand the memory of a program
Lời giải
Đáp án đúng: "C has object-oriented features." Ngôn ngữ C không có lớp, đối tượng, kế thừa hay đa hình, nên đặc tính hướng đối tượng không thể là lý do chọn C làm ngôn ngữ đầu tiên; muốn những thứ đó phải sang ngôn ngữ khác. "C is English-like" là lý do có thật được nêu, các từ khoá if, else, while, return đọc gần như tiếng Anh nên người mới dễ đoán ý. "C is faster and more powerful than other high-level languages." cũng là lý do được nêu, mã C dịch ra mã máy gọn và cho phép làm việc sát phần cứng. "C supports basic ways to understand the memory of a program" là lý do quan trọng nhất về mặt học thuật: con trỏ, địa chỉ và cấp phát động buộc người học hình dung bộ nhớ thật thay vì coi nó là chuyện trừu tượng.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    int a[] = {1,2,3,4,5,6};
    int* p = a;
    p += 3;
    printf("%d, %d",*(a+3), *(p++));
    return 0;
}
A3 3
B4 5
C4 4
D3 4
Lời giải
Đáp án đúng: "4 4". Mảng a chứa 1,2,3,4,5,6 nên a[3] bằng 4; biểu thức *(a+3) đúng là a[3], in ra 4. Con trỏ p ban đầu trỏ a[0], lệnh p += 3 đưa p tới a[3]; trong *(p++), phép tăng hậu tố trả về giá trị con trỏ trước khi tăng nên phép lấy nội dung đọc đúng a[3], cũng ra 4, chỉ sau đó p mới nhích sang a[4] và không còn được dùng nữa. Vì vậy chương trình in 4 4. "3 3" nhầm chỉ số với giá trị: cộng 3 vào con trỏ cho địa chỉ của phần tử thứ tư, không cho số 3. "4 5" là kết quả nếu phép tăng trả về giá trị sau khi tăng, tức viết *(++p); dạng hậu tố thì không như vậy. "3 4" đọc sai vế đầu thành a[2], mà hai vế đều trỏ vào cùng một phần tử nên hai số in ra phải giống nhau.
Mở trang câu hỏi này →
4What 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 →
AReturn type, function name, parameters, and function body.
BReturn type, function name, return value, and function body
CReturn type, function name, parameters, and return value
DReturn value, function name, parameters, and function body
Lời giải
Đáp án đúng: "Return type, function name, parameters, and function body.". Một định nghĩa hàm trong C được viết theo đúng trật tự mà trình biên dịch cần để biết cách gọi và cách nhận kết quả: trước hết là kiểu trả về, rồi tên hàm, rồi danh sách tham số trong cặp ngoặc đơn, cuối cùng là thân hàm trong cặp ngoặc nhọn. Ba thành phần đầu hợp thành tiêu đề hàm, cũng chính là phần được lặp lại khi khai báo nguyên mẫu, còn thân hàm mới chứa các lệnh thực thi. Ý "Return type, function name, return value, and function body" sai vì giá trị trả về không phải một thành phần cú pháp nằm trong tiêu đề, nó do lệnh return bên trong thân hàm sinh ra lúc chạy. Ý "Return type, function name, parameters, and return value" sai vì bỏ mất thân hàm, mà thiếu thân thì chỉ còn là một nguyên mẫu, không phải định nghĩa. Ý "Return value, function name, parameters, and function body" sai vì chỗ mở đầu buộc phải là một kiểu dữ liệu, không phải một giá trị cụ thể.
Mở trang câu hỏi này →
Agetchar() and putchar()
Bgets() and puts()
Cscanf() and printf()
Dfgets() and fputs()
Lời giải
Đáp án đúng: "getchar() and putchar()". Hai hàm này thuộc nhóm vào ra một ký tự: getchar đọc đúng một ký tự từ dòng vào chuẩn và trả về mã của nó dưới dạng int để còn chỗ biểu diễn giá trị EOF, còn putchar ghi đúng một ký tự ra dòng ra chuẩn. Vì mỗi lần gọi chỉ xử lý một ký tự nên chúng là lựa chọn cho bài toán đọc hoặc ghi từng ký tự một. Ý "gets() and puts()" sai vì cặp này làm việc với cả một chuỗi, gets đọc trọn một dòng cho tới khi gặp ký tự xuống dòng và puts in cả chuỗi kèm dấu xuống dòng. Ý "scanf() and printf()" sai vì đó là vào ra có định dạng, đọc và ghi theo chuỗi định dạng với nhiều đối số thuộc nhiều kiểu khác nhau. Ý "fgets() and fputs()" sai vì chúng cũng thao tác trên chuỗi và còn nhận thêm đối số dòng tệp, dùng cho tệp hoặc cho dòng chuẩn chứ không phải cho một ký tự riêng lẻ.
Mở trang câu hỏi này →
Aint _a3;
Bint a_3;
Cint 3_a;
Dint _3a
Lời giải
Đáp án đúng: "int 3_a;". Quy tắc đặt tên trong C bắt buộc định danh phải bắt đầu bằng chữ cái hoặc dấu gạch dưới, các ký tự sau đó mới được phép là chữ số. Lý do nằm ở bộ phân tích từ vựng: gặp ký tự số đứng đầu, nó cố đọc một hằng số, nên 3_a bị nhận là số 3 dính thêm phần rác phía sau và trình biên dịch báo lỗi cú pháp. Ý "int _a3;" hợp lệ vì mở đầu bằng dấu gạch dưới, sau đó là chữ và số. Ý "int a_3;" hợp lệ vì mở đầu bằng chữ cái, còn dấu gạch dưới và chữ số đều được phép đứng ở giữa tên. Ý "int _3a" cũng là một tên hợp lệ, dấu gạch dưới đứng đầu khiến chữ số theo sau không còn gây nhập nhằng; chỗ thiếu dấu chấm phẩy ở ý này chỉ là sai sót lúc chép đề, bản thân cái tên không vi phạm quy tắc nào.
Mở trang câu hỏi này →
Atime.h
Bconio.h
Cmath.h
Dstdlib.h
Lời giải
Đáp án đúng: "stdlib.h". Chuẩn C xếp hàm abs vào nhóm tiện ích số nguyên của stdlib.h cùng với labs, llabs và div, bởi abs làm việc trên int chứ không trên số thực, trong khi math.h được dành riêng cho các hàm toán học trên số thực. Ý "time.h" sai vì tệp tiêu đề đó khai báo những thứ liên quan tới thời gian như time, clock, difftime. Ý "conio.h" sai vì nó không phải tệp tiêu đề chuẩn, chỉ tồn tại trên một số trình biên dịch để làm các thao tác màn hình và bàn phím kiểu getch hay clrscr. Ý "math.h" sai vì nơi đó khai báo fabs cho double chứ không phải abs cho int; nhiều trình biên dịch có kèm thêm khai báo abs trong math.h như phần mở rộng riêng, nhưng chỗ được chuẩn hoá chính thức vẫn là stdlib.h.
Mở trang câu hỏi này →
Đề bài
int main()
{
    int i = 1;
    int *p = &i;
    int **k = &p;
    i+=2;
    printf("%d%d%d", *p, **k, *(*k));
    getchar();
    return 0;
}
A333
B111
C222
DCompile error
Lời giải
Đáp án đúng: "333". Biến i ban đầu bằng 1, p giữ địa chỉ của i, còn k giữ địa chỉ của p nên k là con trỏ hai cấp. Lệnh i+=2 nâng i lên 3 ngay trong ô nhớ của i. Vì p và k không sao chép giá trị mà chỉ ghi lại đường đi tới ô nhớ đó, mọi lần truy xuất về sau đều đọc ra giá trị mới nhất: *p lấy nội dung ô của i là 3, **k đi hai chặng từ k sang p rồi sang i cũng ra 3, và *(*k) chỉ là cách viết tường minh của **k nên cũng ra 3. Chuỗi định dạng có ba đặc tả %d liền nhau không chen dấu cách nên ba số in sát nhau thành 333. Ý "111" sai vì nó ứng với việc bỏ qua lệnh i+=2, hoặc tưởng con trỏ chụp lại giá trị ngay lúc được gán. Ý "222" sai vì không có phép tính nào trong chương trình sinh ra giá trị 2. Ý "Compile error" sai vì khai báo con trỏ hai cấp và phép lấy nội dung hai lần đều hợp lệ.
Mở trang câu hỏi này →
Đề bài
#include<stdio.h>

int isTriangle(float a, float b, float c)
{
    if ((a>0)&&(b>0)&&(c>0)&&(a<b+c)&&(b<c+a)&&(c<a+b))
        return 1;
    else
        return 0;
}

int main()
{
    float a = 1, b = 1, c = 1.25;
    if (isTriangle(a, b, c))
        printf("%.2f, %.2f, %.2f: a triangle.\n", a, b, c);
    else
        printf("%.2f, %.2f, %.2f: not a triangle.\n", a, b, c);
    return 0;
}
Aa, b, c: a triangle
B1.00, 1.00, 1.25: a triangle
C1, 1, 1.25: a triangle
D1.00, 1.00, 1.25: not a triangle
Lời giải
Đáp án đúng: "1.00, 1.00, 1.25: a triangle". Hàm isTriangle kiểm ba cạnh dương và ba bất đẳng thức tam giác: với a bằng 1, b bằng 1 và c bằng 1.25 thì 1 nhỏ hơn 2.25, 1 nhỏ hơn 2.25 và 1.25 nhỏ hơn 2, nên cả chuỗi phép và cho kết quả đúng và hàm trả về 1. Giá trị khác không được lệnh if trong main coi là điều kiện đúng nên nhánh in a triangle được chạy. Đặc tả %.2f buộc in số thực với đúng hai chữ số sau dấu chấm, vì thế 1 hiện ra thành 1.00 còn 1.25 giữ nguyên. Ý "a, b, c: a triangle" sai vì chuỗi định dạng dùng %.2f nên chỗ đó in giá trị, không in tên biến. Ý "1, 1, 1.25: a triangle" sai vì %.2f không bao giờ bỏ các chữ số thập phân thừa, muốn ra dạng gọn như vậy phải dùng đặc tả khác. Ý "1.00, 1.00, 1.25: not a triangle" sai vì điều kiện tam giác đã thoả nên nhánh else không được chạy.
Mở trang câu hỏi này →
Acompilation errors
Bruntime errors
Clogic or semantic errors
Dinterpreter errors
Lời giải
Đáp án đúng: "logic or semantic errors". Trình biên dịch chỉ kiểm được những gì thuộc hình thức: từ khoá, dấu câu, kiểu dữ liệu, khai báo. Nó không biết chương trình đáng lẽ phải làm gì, nên một công thức viết sai dấu, một vòng lặp chạy thiếu một lượt hay một điều kiện so sánh ngược đều dịch trơn tru rồi cho ra số liệu sai. Đó chính là lỗi tư duy, lỗi về ngữ nghĩa. Ý "compilation errors" sai vì mâu thuẫn với chính đề bài, đã dịch không lỗi thì không còn lỗi biên dịch nào sót lại. Ý "runtime errors" sai vì lỗi lúc chạy biểu hiện bằng việc chương trình dừng bất thường hoặc rơi vào hành vi không xác định như chia cho không, truy cập ngoài vùng nhớ, chứ không phải chạy xong êm ả rồi trả lời sai. Ý "interpreter errors" sai vì mã nguồn ở đây được biên dịch thành mã máy, không có bộ thông dịch nào tham gia.
Mở trang câu hỏi này →
A'c'
B'C'
C'c' or 'C' (depending on IDE)
DCompilation error
Lời giải
Đáp án đúng: "'c'". Hàm tolower chỉ đổi chữ hoa thành chữ thường tương ứng, còn với mọi ký tự khác nó trả về nguyên đối số. Ký tự truyền vào đã là chữ thường nên giá trị trả về vẫn là mã của chữ c, và đặc tả %c in ra đúng một ký tự c. Ý "'C'" sai vì biến chữ thường thành chữ hoa là việc của toupper, tolower không bao giờ làm ngược lại. Ý "'c' or 'C' (depending on IDE)" sai vì hành vi của tolower do chuẩn quy định dứt khoát theo miền ký tự đang dùng, nó không phụ thuộc môi trường soạn thảo hay trình biên dịch. Ý "Compilation error" sai vì lời gọi hoàn toàn hợp lệ, tolower nhận một int và trả về một int nên truyền hằng ký tự vào là chuyện bình thường; điều duy nhất cần nhớ là phải nạp tệp tiêu đề ctype.h để có khai báo của nó.
Mở trang câu hỏi này →
Atypedef struct { dataType1 field1; dataType2 field2; } structName;
Bstruct typedef { dataType1 field1; dataType2 field2; } structName;
Ctypedef { dataType1 field1; dataType2 field2; } struct structName;
DstructName typedef { dataType1 field1; dataType2 field2; };
Lời giải

Đáp án đúng: "typedef

Lời giải
struct {
  dataType1 field1;
  dataType2 field2;
}

structName;". Cách đọc một khai báo typedef luôn là từ khoá typedef, rồi kiểu đầy đủ, rồi tên mới đứng ngay trước dấu chấm phẩy. Ở đây kiểu đầy đủ là struct kèm danh sách thành viên trong cặp ngoặc nhọn, còn structName là tên mới, nhờ vậy về sau chỉ cần viết một từ thay cho cả cụm hai từ. Ý mở đầu bằng "struct typedef" sai vì typedef là bộ định rõ thuộc nhóm lớp lưu trữ, nó phải đứng trước phần mô tả kiểu chứ không được chen vào sau từ khoá struct. Ý viết "typedef {" rồi kết thúc bằng "} struct structName; " sai ở hai chỗ: thiếu từ khoá struct trước cặp ngoặc nhọn nên không có kiểu nào được định nghĩa, và struct đặt ở vị trí tên mới là vô nghĩa. Ý mở đầu bằng "structName typedef" sai vì tên mới bị đẩy lên trước typedef, trong khi chỗ dành cho nó là sau phần kiểu.

Mở trang câu hỏi này →
AIt is a bitwise operator OR
BIt is a logical operator AND
CIt is a bitwise operator AND
DIt is a logical operator OR
Lời giải
Đáp án đúng: "It is a bitwise operator OR". Dấu gạch dọc đơn làm việc ở mức từng bit: nó lấy hai toán hạng nguyên, so từng cặp bit cùng vị trí và cho bit kết quả bằng 1 nếu có ít nhất một bit bằng 1, nên kết quả là một số nguyên chứ không phải một giá trị đúng sai. Chính vì thế nó hay được dùng để bật cờ trong một mặt nạ bit. Ý "It is a logical operator AND" sai vì phép và luận lý phải viết bằng hai dấu và, nó chỉ cho 0 hoặc 1 và còn tính tắt, bỏ hẳn toán hạng bên phải khi bên trái đã sai. Ý "It is a bitwise operator AND" sai vì phép và trên bit viết bằng một dấu và đơn, cho bit 1 chỉ khi cả hai bit đều là 1. Ý "It is a logical operator OR" sai vì phép hoặc luận lý phải viết bằng hai dấu gạch dọc và cũng chỉ trả về 0 hoặc 1.
Mở trang câu hỏi này →
15Assume we have the following codes:4 lựa chọncó code
Đề bài
double d=9;
double *p = &d;

Suppose that a double occupies the memory block of 8 bytes, and the address of d is 1200. What is the result of the following expression: p + 8?

A1264
B1200
C1208
D1209
Lời giải
Đáp án đúng: "1264". Phép cộng trên con trỏ trong C được tính theo đơn vị phần tử, không theo byte: p có kiểu con trỏ tới double nên p cộng 8 nghĩa là nhảy qua 8 ô double, tức là dịch 8 nhân 8 bằng 64 byte kể từ địa chỉ 1200, cho ra 1264. Nhờ đúng quy ước này mà cách viết p cộng i luôn trỏ tới phần tử thứ i mà người viết không phải nhân tay với kích thước kiểu. Ý "1200" sai vì đó là giá trị của chính p khi chưa cộng gì. Ý "1208" sai vì 1208 là kết quả của p cộng 1, nhảy đúng một ô double. Ý "1209" sai vì nó coi con trỏ như một số nguyên thường rồi cộng thẳng 9 vào, vừa nhầm bước nhảy vừa nhầm cả số hạng; địa chỉ đó còn rơi vào giữa một ô double nên không phải chỗ bắt đầu của phần tử nào.
Mở trang câu hỏi này →
Aabs()
Blabs()
Cllabs()
Dfabs()
Lời giải
Đáp án đúng: "abs()". Thư viện chuẩn chia hàm lấy trị tuyệt đối theo từng kiểu để tránh chuyển đổi ngầm gây mất mát: abs nhận int và trả về int, nên đó là hàm dành riêng cho kiểu int. Ý "labs()" sai vì nó dành cho long, đem dùng cho int thì vẫn chạy nhờ phép nâng kiểu nhưng đó không phải hàm đặc trưng cho int. Ý "llabs()" sai vì nó dành cho long long, một kiểu nguyên rộng hơn và được bổ sung muộn hơn vào chuẩn. Ý "fabs()" sai vì nó nhận và trả về double, tức là dành cho số thực; truyền một int vào fabs thì giá trị bị đổi sang double, kết quả cũng là double, muốn gán về int lại phải cắt phần thập phân nên vừa sai kiểu vừa thừa hai bước chuyển đổi.
Mở trang câu hỏi này →
17What does the following program display?4 lựa chọncó code
Đề bài
#include <stdio.h>

int main()
{
    int a[5] = {1, 2, 3};
    printf("%d", a[0]);
    return 0;
}
A3
B2
C1
DAn error will be raised.
Lời giải
Đáp án đúng: "1". Khi danh sách khởi tạo có ít giá trị hơn số phần tử, C lấp lần lượt từ đầu mảng rồi tự đặt 0 cho những phần tử còn lại, nên a giữ các giá trị 1, 2, 3, 0, 0. Chỉ số trong C đếm từ 0, vì vậy a[0] là phần tử đầu tiên và bằng 1, đúng cái mà printf in ra. Ý "3" sai vì 3 nằm ở a[2], tức là phần tử thứ ba của mảng. Ý "2" sai vì 2 nằm ở a[1]; nhầm lẫn này bắt nguồn từ việc tưởng chỉ số bắt đầu từ 1. Ý "An error will be raised." sai vì khởi tạo thiếu giá trị là hợp lệ và được chuẩn quy định rõ ràng; trình biên dịch không báo lỗi, cũng không để các phần tử còn lại mang giá trị rác.
Mở trang câu hỏi này →
18What does the following program print?4 lựa chọncó code
Đề bài
#include <stdio.h>

int main() {
    int a = 4, *b = &a;
    a--;
    *b=*b-1;
    printf("%d %d", a, *b);
    return 0;
}
A2 2
B2 1
C3 1
D3 3
Lời giải
Đáp án đúng: "2 2". Con trỏ b được gán địa chỉ của a nên từ đó a và *b là hai tên gọi của cùng một ô nhớ. Lệnh a-- hạ ô đó từ 4 xuống 3, rồi *b = *b - 1 đọc chính ô đó được 3, trừ đi 1 và ghi lại 2; khi printf chạy, cả a lẫn *b đều lấy từ ô duy nhất ấy nên hai số in ra buộc phải giống nhau. Ý "3 1" sai vì nó coi a và *b là hai biến riêng, mỗi biến bị giảm đúng một lần; đây cũng là khuyết điểm phải công bố của câu này, bộ khoá đi kèm đề ghi đúng cặp số ấy trong khi mã nguồn không thể sinh ra hai giá trị khác nhau. Ý "2 1" sai vì nó cộng cả hai lần giảm vào a nhưng chỉ tính một lần cho *b, điều không thể xảy ra với hai tên của cùng một ô nhớ. Ý "3 3" sai vì nó bỏ quên một trong hai lệnh giảm, chỉ hạ giá trị từ 4 xuống 3.
Mở trang câu hỏi này →
A=
B||
C==
D!=
Lời giải
Đáp án đúng: "=". Dấu bằng đơn là phép gán: nó ghi giá trị của biểu thức bên phải vào ô nhớ bên trái rồi trả về chính giá trị vừa ghi, nên nó thuộc nhóm toán tử gán chứ không so sánh cũng không tổ hợp điều kiện. Đây là cái bẫy kinh điển của C, bởi viết if với một dấu bằng vẫn dịch được mà ý nghĩa đã khác hẳn phép so sánh bằng. Ý "||" sai vì đó là phép hoặc luận lý, nhận hai điều kiện và cho 1 khi có ít nhất một điều kiện đúng. Ý "==" sai vì đó là phép so sánh bằng, trả về 1 hoặc 0 tuỳ hai toán hạng có bằng nhau hay không. Ý "!=" sai vì đó cũng là một phép so sánh, nó kiểm tra hai toán hạng khác nhau và trả về 1 hoặc 0.
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 →