Câu hỏi: PRF192 Cơ sở lập trình – Bộ ôn tập số 5
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
41Assume we have the following codes:4 lựa chọncó code
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
Mở trang câu hỏi này →Đá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.
42After the following code is executed with the input is 2.5 3.6, what are the values of the variables N, RE and X?4 lựa chọncó code
#include <stdio.h>
int main(){
int n =12, re;float x, y;
printf("input =");
re = scanf("%d%f%f",&n,&x,&y);
printf("%d, %d, %f",n, re, x);
}A2, 2, 2.5
B2, 3, 2.5
C2, 2, 0.5
D2, 3, 0.5
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "2, 3, 0.5". Dãy ký tự nhập là 2.5 rồi dấu cách rồi 3.6, nhưng scanf đọc theo đặc tả chứ không theo cách con người đọc. Đặc tả %d chỉ nhận chữ số nên nó lấy 2 rồi dừng ngay trước dấu chấm, n thành 2. Đặc tả %f tiếp tục từ dấu chấm, đọc .5 thành số thực 0.5 cho x. Đặc tả %f thứ hai bỏ qua dấu cách rồi đọc 3.6 cho y. Cả ba chuyển đổi đều thành công nên scanf trả về 3, giá trị gán cho re. Dãy "2, 2, 2.5" đếm thiếu một chuyển đổi và coi như %f đã lấy trọn 2.5. Dãy "2, 3, 2.5" đúng số chuyển đổi nhưng vẫn gán 2.5 cho x, điều không thể vì phần nguyên đã bị %d lấy mất. Dãy "2, 2, 0.5" đúng x nhưng báo chỉ hai chuyển đổi, trong khi y cũng được nạp từ 3.6.
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ố.
A'\0'
B'\n'
C'\t'
D'\'
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "'\0'". Chuỗi trong C không mang theo độ dài, nó chỉ là một dãy ký tự nằm liên tục và kết thúc bằng một byte giá trị 0; mọi hàm như strlen, strcpy hay printf với đặc tả %s đều dò tới byte đó để biết chỗ dừng. Đây là lý do mảng chứa chuỗi phải khai báo thừa một ô so với số ký tự thật. Ý "'\n'" sai vì đó là ký tự xuống dòng, nó chỉ là một ký tự nội dung bình thường có thể nằm giữa chuỗi. Ý "'\t'" sai vì đó là ký tự tab, cũng là nội dung chứ không phải dấu kết thúc. Ý "'\'" sai vì cách viết này còn không hợp lệ: dấu gạch chéo ngược mở đầu một chuỗi thoát nên muốn biểu diễn chính nó phải viết gấp đôi.
AWriting formatted data to a file.
BReading formatted data from a file.
CAppending formatted data to a file.
DClosing a file.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Writing formatted data to a file." Hàm fprintf là bản mở rộng của printf: tham số đầu là con trỏ tệp chỉ luồng đích, phần sau vẫn là chuỗi định dạng và danh sách giá trị, nên nó biến các giá trị trong bộ nhớ thành văn bản rồi ghi vào luồng đó. Mô tả "Reading formatted data from a file." là việc của fscanf, hàm đi hướng ngược lại và cần địa chỉ biến để nạp vào. Mô tả "Appending formatted data to a file." nói về vị trí ghi chứ không phải về hàm: ghi nối vào cuối hay ghi từ đầu do chế độ mở trong fopen quyết định, cùng một fprintf sẽ nối thêm với chế độ mở nối và ghi đè với chế độ mở ghi. Mô tả "Closing a file." là việc của fclose, hàm đẩy nốt vùng đệm xuống đĩa rồi giải phóng cấu trúc tệp.
A
fgets()B
fputs()C
ftell()D
fopen()Lời giải
Mở trang câu hỏi này →Đáp án đúng: "fgets()". Hàm này đọc từ một dòng tệp cho tới khi gặp ký tự xuống dòng hoặc khi đã lấy đủ số ký tự mà ta giới hạn, rồi tự thêm ký tự kết thúc chuỗi vào cuối vùng đệm. Chỗ giới hạn kích thước chính là lý do fgets được dùng thay cho gets, vì nó không cho dữ liệu vào tràn khỏi mảng đích. Ý "fputs()" sai vì nó làm việc ngược lại, ghi một chuỗi ra tệp. Ý "ftell()" sai vì nó chỉ cho biết vị trí hiện tại của con trỏ đọc ghi trong tệp, không chuyển một byte dữ liệu nào. Ý "fopen()" sai vì nó chỉ mở tệp và trả về con trỏ FILE cho các hàm khác dùng; mở xong vẫn chưa có ký tự nào được đọc vào bộ nhớ.
A
fputs()B
fscanf()C
fgets()D
fopen()Lời giải
Mở trang câu hỏi này →Đáp án đúng: "fputs()". Hàm này nhận một chuỗi kết thúc rỗng cùng con trỏ tệp, rồi ghi các ký tự của chuỗi vào luồng, bỏ lại byte kết thúc và không tự thêm dấu xuống dòng, nên nó là cách trực tiếp nhất để đưa một chuỗi ra tệp. Hàm "fscanf()" đi hướng ngược lại, đọc dữ liệu từ tệp theo chuỗi định dạng và cần địa chỉ biến để nạp vào, nên không ghi gì cả. Hàm "fgets()" cũng là hàm đọc, lấy một dòng từ tệp vào vùng đệm có giới hạn độ dài; cặp fgets và fputs dễ nhầm chính vì tên gần giống nhau mà hướng dữ liệu trái ngược. Hàm "fopen()" chỉ mở tệp và trả về con trỏ tệp cho các hàm khác dùng, bản thân nó không chuyển một byte nội dung nào.
A
fopen("file.txt", "r")B
open("file.txt", "w")C
fopen("file.txt", "w")D
open("file.txt", "r")Lời giải
Mở trang câu hỏi này →Đáp án đúng: "fopen("file.txt", "r")". Thư viện chuẩn mở tệp bằng fopen: hàm nhận tên tệp và chuỗi chế độ, trả về con trỏ tệp hoặc giá trị rỗng nếu thất bại; chế độ đọc mở tệp sẵn có, đặt vị trí ở đầu và không làm hỏng nội dung. Lệnh "fopen("file.txt", "w")" vẫn đúng hàm nhưng chế độ ghi cắt tệp về rỗng nếu tệp đã có, dùng để đọc là mất dữ liệu. Lệnh "open("file.txt", "r")" sai hàm: open là lời gọi hệ thống của POSIX, khai báo trong fcntl.h, nhận cờ dạng số chứ không nhận chuỗi chế độ, và trả về số hiệu tệp chứ không phải con trỏ tệp. Lệnh "open("file.txt", "w")" sai cả hai mặt, vừa dùng lời gọi hệ thống với chuỗi chế độ không hợp lệ, vừa nhắm ý ghi trong khi đề hỏi mở để đọc.
49What will be the output of this program? int n = 5, i, S = 1;4 lựa chọncó code
for (i = 2; i <= n; i++) {
S *= i;
}
printf("%d", S);A120
B60
C24
D100
Lời giải
Mở trang câu hỏi này →Đá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.
50What will be the output of the following C code?4 lựa chọncó code
#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
Mở trang câu hỏi này →Đá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ệ.