Câu hỏi: PRF192 Cơ sở lập trình – Bộ ôn tập số 3
50 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 đề. Trang 3/3 — câu 41–50.
Danh sách câu hỏi
50/50 câuHết danh sách
41What represents dynamic allocation in C?4 lựa chọn
Aint* a = (int*)malloc(5*sizeof(int));
Bint a[5];
Cint a[5][5];
Dfree(a);
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "int* a = (int*)malloc(5*sizeof(int));". Cấp phát động nghĩa là xin bộ nhớ lúc chương trình đang chạy, với kích thước có thể tính ra tại thời điểm đó, và vùng xin được nằm trên heap, sống tới khi được giải phóng. Hàm malloc làm đúng việc đó: nhận số byte cần, trả về địa chỉ đầu vùng nhớ hoặc con trỏ rỗng khi thất bại, nên phải gán vào một con trỏ. Lựa chọn "int a[5];" là mảng tự động, kích thước cố định ghi sẵn lúc dịch và vùng nhớ bị thu hồi khi ra khỏi khối. Lựa chọn "int a[5][5];" chỉ là mảng hai chiều, bản chất vẫn là cấp phát theo khai báo. Lựa chọn "free(a);" đứng ở đầu bên kia của vòng đời: nó trả vùng nhớ đã cấp phát về cho hệ thống, không xin thêm ô nhớ nào.
42Which function is used to open a text file?4 lựa chọn
A
open()B
fopen()C
fileopen()D
openfile()Lời giải
Mở trang câu hỏi này →Đáp án đúng: "fopen()". Thư viện chuẩn mở tệp bằng fopen, khai báo trong stdio.h: nó nhận tên tệp cùng chế độ mở rồi trả về một con trỏ tệp để các hàm fscanf, fgets, fprintf, fclose dùng tiếp, hoặc trả về con trỏ rỗng nếu mở thất bại, nên luôn phải kiểm tra trước khi đọc ghi. Lựa chọn "open()" là lời gọi hệ thống của POSIX, nằm ngoài thư viện chuẩn và trả về một số hiệu tệp chứ không phải con trỏ tệp, nên không ghép được với họ hàm trong stdio.h. Lựa chọn "fileopen()" không tồn tại trong thư viện chuẩn. Lựa chọn "openfile()" cũng không tồn tại; cả hai chỉ là những cái tên nghe hợp lý được dựng ra để gây nhầm.
A
putc(s)B
puts(s)C
printf(s)D
printf("%s",s)Lời giải
Mở trang câu hỏi này →Đáp án đúng gồm hai ý: "putc(s)" và "printf(s)". Hàm putc được khai báo để ghi một ký tự ra một dòng xuất, nên nó cần hai đối số là ký tự và dòng đích; đưa cho nó một chuỗi vừa thiếu đối số vừa sai kiểu, và dù có dịch được thì nó cũng chỉ xuất một ký tự. Còn cách gọi printf với chuỗi dữ liệu đặt ở vị trí chuỗi định dạng thì hễ trong chuỗi có dấu phần trăm, printf sẽ hiểu đó là đặc tả chuyển đổi rồi đi đọc đối số không tồn tại, sinh ra kết quả sai hoặc sự cố; đây là lỗi chuỗi định dạng kinh điển. Lựa chọn "puts(s)" là cách xuất chuỗi đúng và gọn, nó còn tự thêm ký tự xuống dòng. Lựa chọn "printf("%s",s)" cũng đúng vì chuỗi định dạng là hằng do người viết kiểm soát, còn dữ liệu được đặt đúng vị trí đối số.
44What does the following code print?6 lựa chọncó code
float y = 3 / 2;
printf("%f", y);A1.000000
B1.500000
C1.0
D1.5
E1
FCompiler error
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "1.000000". Phép 3 chia 2 có hai toán hạng đều là hằng nguyên, nên C thực hiện chia nguyên và cắt phần thập phân ngay tại đó, cho ra 1; kiểu của biến nhận kết quả không hề tham gia quyết định phép chia nào được dùng. Chỉ sau khi đã có 1, giá trị ấy mới được chuyển ngầm thành 1.0 khi gán cho y. Đặc tả số thực in sáu chữ số sau dấu thập phân theo mặc định, nên màn hình hiện 1.000000. Lựa chọn "1.500000" chỉ đúng nếu ít nhất một toán hạng là số thực, chẳng hạn viết 3.0 chia 2. Lựa chọn "1.0" sai về dạng in vì đặc tả này không rút ngắn phần thập phân. Lựa chọn "1.5" sai cả về giá trị lẫn dạng in. Lựa chọn "1" là dạng của đặc tả số nguyên chứ không phải số thực. Lựa chọn "Compiler error" sai vì gán một số nguyên cho biến float là chuyển kiểu hợp lệ.
A
fgetsB
fgetcC
fputsD
fpuscLời giải
Mở trang câu hỏi này →Đáp án đúng: "fgets". Hàm fgets đọc từ dòng đã mở cho tới khi gặp ký tự xuống dòng, hết tệp hay đủ số ký tự tối đa, rồi đặt kết quả vào vùng đệm do người gọi đưa tới và tự thêm ký tự kết thúc chuỗi. Chính tham số giới hạn kích thước làm nó an toàn hơn gets, hàm đã bị loại khỏi chuẩn vì không chặn được tràn vùng đệm. Cũng lưu ý fgets giữ lại ký tự xuống dòng nếu vùng đệm còn đủ chỗ. Lựa chọn "fgetc" chỉ đọc đúng một ký tự mỗi lần gọi, muốn lấy cả dòng phải tự viết vòng lặp. Lựa chọn "fputs" đi theo chiều ngược lại, nó ghi một chuỗi ra dòng xuất. Lựa chọn "fpusc" không phải tên hàm nào của thư viện chuẩn, nó chỉ là biến dạng gõ sai của fputc.
A"r"
B"w+"
C"a+"
D"r+"
Lời giải
Mở trang câu hỏi này →Đáp án đúng gồm hai ý: "w+" và "a+". Dấu cộng trong chế độ mở nghĩa là cho phép cả đọc lẫn ghi trên cùng một dòng; còn chữ đứng trước quyết định chuyện tệp có được tạo hay không. Chế độ ghi cắt sẽ tạo tệp mới nếu chưa có và xoá trắng nội dung nếu đã có; chế độ nối thêm cũng tạo tệp khi chưa có, giữ nguyên nội dung cũ và mọi lần ghi đều dồn về cuối tệp bất kể con trỏ tệp đang ở đâu. Cả hai vì vậy thoả đồng thời hai tiêu chí của câu hỏi. Lựa chọn "r" chỉ cho đọc và fopen trả về con trỏ rỗng nếu tệp không tồn tại, nên trượt cả hai tiêu chí. Lựa chọn "r+" cho cả đọc và ghi nhưng vẫn đòi tệp phải có sẵn, nó không tạo tệp mới, nên trượt đúng ở tiêu chí tạo tệp.
47What does the following code do?4 lựa chọncó code
int a = 5, b = 7;
int *pa = &a, *pb = &b;
*pa = *pa + *pb;AAdds values at addresses a and b
BSwaps the values
CStores the address of b in a
DMultiplies both numbers
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Adds values at addresses a and b". Con trỏ thứ nhất trỏ vào a, con trỏ thứ hai trỏ vào b, nên hai phép lấy nội dung chính là hai ô nhớ đó. Dòng lệnh đọc nội dung của cả hai ô, cộng lại rồi ghi tổng trở lại vào ô mà con trỏ thứ nhất trỏ tới, vì vậy a thành 12 còn b vẫn là 7. Toàn bộ việc diễn ra trên dữ liệu được trỏ tới, không có con trỏ nào bị gán lại. Lựa chọn "Swaps the values" sai vì đổi chỗ cần một biến tạm cùng hai phép gán, còn ở đây b không hề bị ghi. Lựa chọn "Stores the address of b in a" sai vì muốn vậy phải gán con trỏ này bằng con trỏ kia hay gán cho a địa chỉ của b, trong khi dòng lệnh chỉ làm việc với nội dung sau dấu sao. Lựa chọn "Multiplies both numbers" sai vì toán tử trong biểu thức là dấu cộng, không phải dấu nhân.
48How are strings typically represented in C?4 lựa chọn
AAs an array of characters
BAs an array of strings
CAs individual characters
DAs integers referencing ASCII values
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "As an array of characters". Trong C không có kiểu chuỗi dựng sẵn: một chuỗi chỉ là dãy ký tự liền kề kết thúc bằng ký tự rỗng, và hầu hết hàm trong string.h dò đúng ký tự kết thúc ấy để biết chuỗi dài bao nhiêu. Vì vậy khi cấp ô nhớ cho chuỗi phải tính thêm một ô cho ký tự kết thúc. Lựa chọn "As an array of strings" mô tả một danh sách nhiều chuỗi, tức mảng con trỏ ký tự hay mảng hai chiều, không phải cách biểu diễn một chuỗi. Lựa chọn "As individual characters" nói về kiểu char đơn lẻ; một ký tự rời không có ký tự kết thúc nên các hàm chuỗi không làm việc được với nó. Lựa chọn "As integers referencing ASCII values" đúng ở chỗ mỗi ký tự được lưu bằng mã số, nhưng chuỗi không phải mảng số nguyên và cũng không bỏ được ký tự kết thúc.
49Which of the following is NOT mentioned as a reason why C is selected as the first programming language?4 lựa chọn
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
Mở trang câu hỏi này →Đá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.
50What does the following program display?4 lựa chọncó code
#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
Mở trang câu hỏi này →Đá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ã.