Tất cả câu hỏi

Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.

160/11.033 câuCòn 10.873
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 →
Đề bài
#include <stdio.h>

int main()
{
    int x = 5, y = 3, z = 1;
    x = x % 3 + z++;
    z = x * y--;
    printf("%d %d %d", x, y, z);

    return 0;
}
A5 3 1
B3 2 9
C2 2 5
DCompiler error
Lời giải
Đáp án đúng: "3 2 9". Đề hỏi biến b nhưng chương trình không có biến nào tên b, nên chỉ có thể trả lời theo đúng thứ printf in ra. Dòng x = x % 3 + z++ tính 5 % 3 bằng 2, còn z++ là tăng sau nên nó đưa vào biểu thức giá trị cũ 1 rồi mới nâng z lên 2; vậy x thành 3. Dòng z = x * y-- lấy x bằng 3 nhân với giá trị cũ của y là 3, cho 9, sau đó y giảm còn 2. Lúc printf chạy, x bằng 3, y bằng 2, z bằng 9. Dãy "5 3 1" là bộ giá trị khởi tạo ban đầu, tức bỏ qua cả hai phép gán. Dãy "2 2 5" ứng với việc tính x chỉ bằng 5 % 3 mà bỏ quên phần cộng z++, nên cả ba số sau đó đều lệch. Kết luận "Compiler error" sai vì mã hợp lệ: phép lấy dư, tăng sau và giảm sau đều áp đúng trên biến int.
Mở trang câu hỏi này →
Đề bài
char s[] = "AbCd";
printf("%d;%d;%d;%d", s[1],  s[2],  s[3],  s[4]);
A97;98;99;100
B65;66;67;68
C65;98;67;100
D98;67;100;0
Lời giải
Đáp án đúng: "98;67;100;0". Mảng s chiếm năm byte: bốn chữ cái và byte rỗng kết thúc ở chỉ số 4. Mỗi phần tử là một char, in bằng %d nên giá trị được nâng lên int và hiện ra dưới dạng mã ASCII. Chỉ số đếm từ 0, vậy s[1] là chữ b thường mã 98, s[2] là chữ hoa thứ hai mã 67, s[3] là chữ d thường mã 100, còn s[4] là byte kết thúc mang giá trị 0. Dãy "97;98;99;100" là mã của bốn chữ thường liên tiếp, tức giả định chuỗi toàn chữ thường và đọc từ chỉ số 0. Dãy "65;66;67;68" là mã của bốn chữ hoa liên tiếp, cũng không khớp vì chuỗi xen chữ thường. Dãy "65;98;67;100" đọc từ s[0] nên lấy mã chữ hoa đầu tiên, lệch một nhịp so với yêu cầu của đề.
Mở trang câu hỏi này →
A5
B6
C4
DUndefined
Lời giải
Đáp án đúng: "5". Hàm strlen đếm số ký tự thực của chuỗi bằng cách đi từ byte đầu tới khi gặp byte rỗng kết thúc, và không tính byte đó. Chuỗi hello có năm chữ cái nên hàm trả về 5, dù mảng str chiếm sáu byte trong bộ nhớ. Đây là ranh giới cần nhớ: strlen cho độ dài logic, còn sizeof cho kích thước vùng nhớ. Số "6" chính là sizeof(str), tức năm ký tự cộng byte kết thúc, không phải thứ strlen trả về. Số "4" thiếu một ký tự, chỉ đúng nếu chuỗi là hell. Kết luận "Undefined" sai vì mảng được khởi tạo từ hằng chuỗi nên byte kết thúc đã có sẵn, strlen tìm thấy điểm dừng hợp lệ và kết quả hoàn toàn xác định.
Mở trang câu hỏi này →
A+=
B+
C++
D-
Lời giải
Đáp án đúng: "+=". Bảng ưu tiên của C xếp phép gán, kể cả gán phức hợp, ở gần đáy, chỉ trên toán tử phẩy; lý do là gán phải nhận trọn giá trị của biểu thức bên phải nên mọi phép tính bên phải buộc phải xong trước. Vì thế a += b * 2 được hiểu là a += (b * 2) chứ không phải (a += b) * 2. Toán tử "+" cộng hai toán hạng, nằm ở mức cộng trừ, chặt hơn mức gán. Toán tử "++" tăng một đơn vị, thuộc nhóm một toán hạng, đứng ở mức cao nhất cùng với ngoặc tròn và chỉ số mảng. Toán tử "-" khi trừ hai số thì cùng mức với phép cộng, còn khi làm dấu âm một toán hạng thì còn cao hơn nữa, nên cả ba đều ưu tiên hơn phép gán phức hợp.
Mở trang câu hỏi này →
146What does the following program display?4 lựa chọncó code
Đề bài
#include <stdio.h>
int main() {
    int arr[] = {5, 10, 15};
    for (int i = 0; i < 3; i++)
        printf("%d ", arr[i]);
    return 0;
}
A5 10 15
B15 10 5
C0 1 2
D10 15 20
Lời giải
Đáp án đúng: "5 10 15". Khai báo arr[] = {5, 10, 15} tạo mảng ba phần tử theo đúng thứ tự liệt kê, chỉ số chạy từ 0 tới 2. Vòng for đặt i bằng 0, còn chạy khi i nhỏ hơn 3 và tăng i sau mỗi nhịp; thân vòng không có ngoặc nhọn nên chỉ ôm đúng một lệnh printf, lệnh đó in arr[i] theo %d kèm một dấu cách, cho ba lần in lần lượt 5, 10 rồi 15. Dòng "15 10 5" là thứ tự ngược, muốn có nó phải cho i đi từ 2 giảm về 0. Dòng "0 1 2" là dãy chỉ số i, sẽ ra nếu in i thay vì arr[i]. Dòng "10 15 20" là dãy đã cộng thêm 5 vào từng phần tử, không có phép tính nào trong mã làm việc đó.
Mở trang câu hỏi này →
ATo define how values are stored and how operations are performed
BTo determine the variable name and its scope within the program
CTo specify the program's execution order and control flow
DTo control the program's memory allocation and deallocation process
Lời giải
Đáp án đúng: "To define how values are stored and how operations are performed". Kiểu dữ liệu quyết định hai điều: số byte cấp cho biến cùng cách các byte đó mã hoá giá trị, và tập phép toán cùng ngữ nghĩa khi áp lên giá trị. Chính vì thế 5 / 2 cho 2 với int nhưng cho 2.5 với double, còn con trỏ int nhảy bốn byte mỗi lần tăng. Mô tả "To determine the variable name and its scope within the program" sai vì tên do người viết đặt, còn phạm vi do vị trí khai báo quyết định. Mô tả "To specify the program's execution order and control flow" là việc của câu rẽ nhánh và vòng lặp. Mô tả "To control the program's memory allocation and deallocation process" chỉ đúng một góc rất nhỏ: cấp phát rồi thu hồi vùng nhớ động là việc của malloc và free, kiểu chỉ cho biết một giá trị cần bao nhiêu byte.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    int quantity;
        double cost;
        printf("Enter the number of apples desired: ");
        scanf("%d", &quantity);
        printf("Now enter the cost of one apple (in $): ");
        scanf("%lf", &cost);
        printf("That will cost $%.2lf\n", quantity * cost);
    return 0;
}
AThat will cost $2.00
BThat will cost $2.000000
CThat will cost $2.0000
DThat will cost $2
Lời giải
Đáp án đúng: "That will cost $2.00". Lệnh scanf với %d nạp 4 vào quantity, rồi %lf nạp 0.5 vào cost. Biểu thức quantity * cost nâng số nguyên 4 lên double trước khi nhân, cho 2.0. Chuỗi định dạng viết %.2lf, nghĩa là in dạng thập phân với đúng hai chữ số sau dấu chấm, nên giá trị 2.0 hiện ra là 2.00. Thụt lề lệch trong thân main không ảnh hưởng gì vì C chỉ đọc dấu chấm phẩy và ngoặc nhọn. Dòng "That will cost $2.000000" là thứ printf in khi dùng %f trần, tức độ chính xác mặc định sáu chữ số, nhưng ở đây độ chính xác đã bị chỉ định là hai. Dòng "That will cost $2.0000" đòi bốn chữ số, ứng với %.4lf. Dòng "That will cost $2" đòi không chữ số nào sau dấu chấm, ứng với %.0lf, và cũng không phải cách printf in số thực mặc định.
Mở trang câu hỏi này →
AThroughout the entire program
BOnly within the function where it's declared
COnly within the block where it's declared
DWithin the structure where it's defined
Lời giải

Đáp án đúng: "Throughout the entire program". Biến khai báo ngoài mọi hàm có phạm vi tệp và thời gian sống tĩnh: nó được cấp chỗ một lần khi chương trình nạp và tồn tại tới lúc kết thúc, nên mọi hàm viết sau khai báo đều thấy nó, và tệp nguồn khác cũng dùng được qua khai báo extern; đó chính là nghĩa của cả chương trình. Mô tả "Only within the function where it's declared" ứng với biến cục bộ, thứ sinh ra trên khung ngăn xếp mỗi lần gọi hàm rồi mất đi khi hàm trả về. Mô tả "Only within the block where it's declared" là phạm vi khối, áp cho biến khai báo trong cặp ngoặc nhọn của thân vòng lặp hay nhánh rẽ. Mô tả "Within the structure where it's defined" nhầm biến với trường của struct; trường chỉ là thành phần của một kiểu, chạm tới qua tên biến struct chứ không phải một biến toàn cục.

Mở trang câu hỏi này →
150What does the statement rewind(fp) do?4 lựa chọn
ABring the pointer fp back to the beginning of the file
BAssign to the pointer fp the address 0x00 (NULL)
CBring the pointer fp to the end of the file
DBring the pointer fp back to the beginning of the current line
Lời giải
Đáp án đúng: "Bring the pointer fp back to the beginning of the file". Mỗi tệp đang mở mang theo một vị trí đọc ghi hiện hành; rewind đặt vị trí đó về byte số không, đồng thời xoá cờ lỗi và cờ hết tệp, nên nó tương đương fseek về mốc đầu kèm clearerr và cho đọc lại tệp từ đầu mà không phải đóng rồi mở lại. Cách nói "Assign to the pointer fp the address 0x00 (NULL)" sai vì rewind không đụng tới giá trị của biến fp, fp vẫn trỏ vào cùng cấu trúc tệp; gán rỗng cho fp còn làm mọi lần dùng sau đó hỏng. Cách nói "Bring the pointer fp to the end of the file" là việc của fseek với mốc cuối, ngược hướng với rewind. Cách nói "Bring the pointer fp back to the beginning of the current line" không có trong C vì luồng tệp chỉ là dãy byte, thư viện chuẩn không ghi nhớ ranh giới dòng để lùi về đầu dòng.
Mở trang câu hỏi này →
151What is the output of the following code snippet?4 lựa chọncó code
Đề bài
char str1[] = "Hello";
char str2[10];
strcpy(str2, str1);
ACopies content of str1 into str2
BCompares str1 with str2
CRetrieves the length of str1
DAssign str2 to an empty string
Lời giải
Đáp án đúng: "Copies content of str1 into str2". Trong C, chuỗi chỉ là mảng ký tự kết thúc bằng một byte rỗng, nên ngôn ngữ không có phép gán chuỗi: muốn sao nội dung phải gọi một hàm đi từng ký tự. strcpy nhận đích trước, nguồn sau, chép lần lượt sáu byte của str1 gồm năm chữ cái của Hello cộng byte kết thúc vào str2, và vì str2 có mười ô nên không tràn. Mô tả "Compares str1 with str2" là việc của strcmp, hàm trả về số âm, số không hay số dương chứ không ghi gì vào đích. Mô tả "Retrieves the length of str1" là việc của strlen, nó chỉ đếm ký tự tới trước byte kết thúc rồi trả về một số nguyên. Mô tả "Assign str2 to an empty string" ứng với việc đặt phần tử đầu của str2 bằng byte rỗng, trái hẳn kết quả của đoạn mã vì sau khi chạy str2 mang nội dung Hello.
Mở trang câu hỏi này →
ACharacter array, Ary is a string
BAry has no Null character at the end
CString size is not mentioned
DThe string can not contain special characters
Lời giải
Đáp án đúng: "Character array, Ary is a string". Khai báo này tạo một mảng ký tự và khởi tạo nó bằng một hằng chuỗi, nên nó vừa là mảng char vừa là chuỗi theo nghĩa của C: dãy ký tự liền kề có ký tự rỗng đóng cuối, dùng được ngay với printf hay các hàm trong string.h. Lựa chọn "Ary has no Null character at the end" sai vì hằng chuỗi luôn kèm ký tự kết thúc, trình dịch cấp chín ô nhớ cho tám ký tự nhìn thấy cộng một ô cho ký tự rỗng. Lựa chọn "String size is not mentioned" gây hiểu lầm: cặp ngoặc để trống không có nghĩa kích thước bỏ lửng, trình dịch suy ra đủ chín ô ngay lúc dịch và kích thước đó cố định về sau. Lựa chọn "The string can not contain special characters" sai vì dấu chấm và dấu chấm than là ký tự bình thường, chuỗi chứa được mọi ký tự kể cả dãy thoát.
Mở trang câu hỏi này →
A{1, 8, 2, 7, 9}
B{8, 1, 2, 7, 9}
C{1, 2, 8, 7, 9}
D{1, 2, 7, 8, 9}
Lời giải
Đáp án đúng: "{1, 8, 2, 7, 9}". Sắp xếp chọn làm việc theo lượt: lượt đầu dò toàn mảng tìm phần tử nhỏ nhất rồi đổi chỗ nó với vị trí đầu tiên. Phần tử nhỏ nhất là 1, đang nằm ở vị trí thứ hai, nên nó đổi chỗ với 8 ở vị trí đầu; các phần tử còn lại không bị xê dịch vì thuật toán chỉ thực hiện đúng một phép đổi chỗ mỗi lượt, khác hẳn sắp xếp nổi bọt đổi chỗ liên tục. Lựa chọn "{8, 1, 2, 7, 9}" là mảng ban đầu, tức giả định lượt đầu không đổi chỗ gì, chỉ đúng nếu phần tử đầu vốn đã nhỏ nhất. Lựa chọn "{1, 2, 8, 7, 9}" là trạng thái sau hai lượt, khi 2 cũng đã được đưa về vị trí thứ hai. Lựa chọn "{1, 2, 7, 8, 9}" là mảng đã sắp xong, kết quả của cả bốn lượt chứ không phải một lượt.
Mở trang câu hỏi này →
154What is the output of the following code snippet?4 lựa chọncó code
Đề bài
void main()
{
        int const *p = 5;
        printf("%d", ++(*p));
        getchar();
}
ACompile error
B5
CNULL
D6
Lời giải
Đáp án đúng: "Compile error". Khai báo ở đây nói p là con trỏ tới int có tính bất biến, nghĩa là không được phép ghi vào vùng mà p trỏ tới. Vì vậy phép tăng áp lên nội dung được trỏ tới là ghi vào một đối tượng bất biến và trình dịch phải báo lỗi, không cần biết p đang trỏ đi đâu. Mã còn một chỗ sai nữa ngay trên đó: gán số 5 cho một con trỏ mà không ép kiểu cũng là vi phạm ràng buộc kiểu. Lựa chọn "5" giả định lệnh in chạy được và phép tăng không có hiệu lực, nhưng chương trình không bao giờ tới được bước thực thi. Lựa chọn "6" giả định phép tăng thành công, điều mà tính bất biến chặn lại ngay lúc dịch; hơn nữa nếu có chạy thì việc đọc nội dung tại địa chỉ 5 cũng làm chương trình gãy. Lựa chọn "NULL" không ứng với gì vì p được gán 5 chứ không phải hằng con trỏ rỗng.
Mở trang câu hỏi này →
155What will be the output of the following C code?4 lựa chọncó code
Đề bài
int a[5] = {1, 2, 3};
printf("%d", a[4]);
A3
B0
CRuntime error
DCompilation error
Lời giải
Đáp án đúng: "0". Khi danh sách khởi tạo có ít giá trị hơn số phần tử khai báo, chuẩn C bắt phần còn lại phải được khởi tạo như đối tượng tĩnh, nghĩa là bằng 0 với kiểu số. Mảng này có năm ô, ba ô đầu nhận 1, 2, 3 còn hai ô cuối được điền 0, nên phần tử ở chỉ số 4 là 0 và lệnh in cho ra 0. Chính quy tắc đó là lý do người ta hay viết cặp ngoặc với một số 0 duy nhất để xoá trắng cả mảng. Lựa chọn "3" là giá trị ở chỉ số 2, tức giá trị khởi tạo cuối cùng được viết ra. Lựa chọn "Runtime error" sai vì chỉ số 4 vẫn nằm trong năm phần tử đã khai báo, không có truy cập ngoài biên. Lựa chọn "Compilation error" sai vì viết thiếu giá trị khởi tạo là hợp lệ; chỉ viết nhiều hơn số phần tử mới bị báo lỗi.
Mở trang câu hỏi này →
Apointers
Bvalue
Ctype
Daddress
Lời giải
Đáp án đúng: "address". Vị trí ô nhớ của một biến được gọi là địa chỉ của biến đó, và toán tử lấy địa chỉ cho ra đúng giá trị này; chính nhờ địa chỉ mà chương trình đọc ghi được dữ liệu, mà hàm sửa được biến của nơi gọi, và mà số học con trỏ đi lại được trên mảng. Lựa chọn "pointers" nói về biến dùng để chứa địa chỉ, tức cái hộp, chứ không phải bản thân vị trí ô nhớ. Lựa chọn "value" là dữ liệu đang nằm trong ô nhớ, thứ thay đổi được trong khi địa chỉ của biến thì cố định suốt thời gian biến tồn tại. Lựa chọn "type" là kiểu dữ liệu, nó quyết định ô nhớ rộng bao nhiêu byte và nội dung được hiểu theo nghĩa nào, nhưng không nói gì về vị trí.
Mở trang câu hỏi này →
Đề bài
int a[MAX_SIZE];
int s = 0;
for (int i = 0; i < n; i++)
    s = s +  a[i] * a[i];
AThe sum of squares of all elements in the array a.
BThe sum of all even elements in the array a.
CThe sum of all odd elements in the array a.
DThe sum of all elements in the array a.
Lời giải
Đáp án đúng: "The sum of squares of all elements in the array a.". Biến s bắt đầu từ 0, vòng lặp đi qua mọi chỉ số từ 0 tới n trừ 1, và mỗi lượt cộng vào s tích của phần tử với chính nó, tức bình phương của nó. Vì không có câu điều kiện nào lọc bớt nên mọi phần tử đều góp phần, và vì bình phương không bao giờ âm nên s luôn không âm dù mảng có chứa số âm. Lựa chọn "The sum of all even elements in the array a." đòi một phép kiểm tra chia hết cho 2 trước khi cộng, điều mã không có. Lựa chọn "The sum of all odd elements in the array a." cũng đòi phép lọc theo tính chẵn lẻ tương tự. Lựa chọn "The sum of all elements in the array a." ứng với dòng cộng thẳng phần tử vào s, không có phép nhân phần tử với chính nó.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>

double average(int a, int b, int c) {
    double result;
    result = (a+b+c)/3.0;
    return result;
}

int main() {
    printf("%.6f", average(5, 8, 7));
    return 0;
}
A6.666667
B6.000000
C20.000000
D6
Lời giải
Đáp án đúng: "6.666667". Tổng ba đối số là 20, và chia cho 3.0 là phép chia có một toán hạng thực nên C nâng 20 lên double rồi chia thực, cho 6.666 và còn lặp mãi, khác hẳn việc chia cho hằng nguyên. Giá trị ấy được trả về qua kiểu double, còn đặc tả yêu cầu in sáu chữ số sau dấu thập phân kèm làm tròn chữ số cuối, nên màn hình hiện 6.666667. Lựa chọn "6.000000" là kết quả nếu mẫu số viết là hằng nguyên 3, khi đó chia nguyên cắt phần thập phân trước cả lúc gán vào biến double. Lựa chọn "20.000000" là tổng chưa chia. Lựa chọn "6" sai về dạng in vì đặc tả này luôn kéo đủ sáu chữ số thập phân chứ không rút ngắn, và cũng sai về giá trị vì phần thập phân bị bỏ mất.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
void swap(int *px, int *py)
{
    int z;
    z=*px;
    *px=*py ;
    *py=z ;
}
int main()
{
    int a=15, b=21 ;
    swap(&a,&b);
    printf ("%d  %d",a,b);
   return 0;
}
A15 21
B21 15
CError while executing the program
DNone of these
Lời giải
Đáp án đúng: "21 15". Hàm main truyền địa chỉ của a và địa chỉ của b, nên hai tham số con trỏ trỏ thẳng vào hai biến của main. Thân hàm giữ nội dung ô thứ nhất vào biến tạm, ghi nội dung ô thứ hai sang ô thứ nhất, rồi ghi biến tạm sang ô thứ hai; mọi phép ghi đều đi qua dấu sao nên tác động lên chính a và b chứ không lên bản sao. Sau lời gọi, a mang 21 và b mang 15. Lựa chọn "15 21" là trạng thái ban đầu, chỉ đúng nếu hàm nhận hai int theo giá trị và đổi chỗ trên bản sao. Lựa chọn "Error while executing the program" sai vì địa chỉ của hai biến đang sống trong main là hợp lệ, việc ghi vào đó không gây sự cố nào. Lựa chọn "None of these" không dùng được vì đã có một lựa chọn khớp đúng kết quả thật của chương trình.
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 →