Câu hỏi: PRF192 Cơ sở lập trình – Bộ ôn tập số 2
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 will be the output of the following program?4 lựa chọncó code
void func(int *p){
int j =11;
*p = j;
}
int main() {
int i = 1;
int *p = &i;
func(p);
printf("%d,%d", i, *p);
getchar();
return 0;
}A11,11
B1,1
C0,0
D0,1
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "11,11". Biến i của hàm chính bằng 1 và p giữ địa chỉ của i, nên truyền p vào func là truyền chính địa chỉ đó chứ không phải một bản sao của giá trị. Trong func, biến cục bộ j bằng 11 và lệnh ghi qua con trỏ đặt 11 vào ô nhớ mà p trỏ tới, tức ghi thẳng vào i; j chết khi hàm kết thúc nhưng giá trị đã nằm lại trong i. Sau lời gọi, i là 11 và nội dung chỗ p trỏ tới cũng là 11 vì p vẫn trỏ vào i, nên lệnh in xuất hai số 11 cách nhau bởi dấu phẩy. Dãy "1,1" là kết quả nếu hàm chỉ gán cho bản sao tham số, chẳng hạn cho con trỏ trỏ sang j, khi đó i không đổi. Dãy "0,0" cần một phép đặt về không, không có trong mã. Dãy "0,1" còn đòi hai số khác nhau, trong khi i và nội dung chỗ p trỏ tới luôn là cùng một ô nhớ nên không thể lệch nhau.
A
fseek()B
fftell()C
rewind()D
return()Lời giải
Mở trang câu hỏi này →Đáp án đúng: "rewind()". Mỗi dòng tệp đang mở có một chỉ báo vị trí cho biết lần đọc hoặc ghi tiếp theo bắt đầu từ đâu; lời gọi rewind đưa chỉ báo đó về byte đầu tệp và xoá luôn cờ báo hết tệp cùng cờ lỗi, nhờ vậy đọc lại được từ đầu mà không cần mở lại. Hàm "fseek()" cũng dịch được chỉ báo và về được đầu tệp nếu truyền độ dời 0 với mốc đầu tệp, nhưng nó là hàm định vị tổng quát cần ba đối số chứ không phải hàm chuyên đưa về đầu, và nó không xoá cờ lỗi. Tên "fftell()" viết sai chính tả của ftell, mà việc của ftell cũng chỉ là báo lại vị trí hiện thời dưới dạng một con số, hoàn toàn không dịch chuyển gì. Tên "return()" là từ khoá trả giá trị khỏi hàm, không liên quan tới tệp và cũng không phải hàm thư viện.
Ascanf will expect two integers inputted by user and write them to variables a and b.
Bscanf will expect two floating-point numbers inputted by user and write them to variables a and b.
Cscanf will expect two integers inputted by user separated by a comma, and write the first integer to variable a, the comma to variable b.
Dscanf will expect two integers inputted by user separated by a comma, and write the first integer to variable a, the second integer to variable b.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "scanf will expect two integers inputted by user separated by a comma, and write the first integer to variable a, the second integer to variable b.". Trong chuỗi định dạng của scanf, mỗi đặc tả %d đọc một số nguyên rồi ghi qua địa chỉ đi kèm, còn ký tự thường như dấu phẩy là đòi hỏi phải khớp đúng ký tự ấy trong dòng nhập; không gặp dấu phẩy thì scanf dừng ngay tại đó và biến thứ hai không nhận được gì. Vậy mô tả đúng phải nêu cả dấu phẩy phân cách lẫn thứ tự ghi vào a trước rồi b sau. Cách nói "scanf will expect two integers inputted by user and write them to variables a and b" bỏ mất ràng buộc dấu phẩy, khiến người đọc tưởng cứ cách nhau bằng khoảng trắng là đọc được. Cách nói "two floating-point numbers" sai đặc tả: số thực phải dùng %f cùng con trỏ float, đưa %d cho số thực là hành vi không xác định. Cách nói "the comma to variable b" sai bản chất: ký tự khớp được tiêu thụ rồi bỏ đi, scanf không lưu nó vào biến nào.
44What is the maximum index of the last character in a character array initialized with a size is 10?4 lựa chọn
A9
B10
C8
DIt depends on the contents of the array
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "9". Chỉ số mảng trong C đếm từ 0, nên mảng khai với kích thước 10 có các ô mang chỉ số từ 0 tới 9 và ô cuối cùng là 9; đây là hệ quả trực tiếp của cách ngôn ngữ tính địa chỉ, vì ô thứ k nằm cách đầu mảng đúng k lần kích thước một phần tử. Giá trị "10" là số phần tử chứ không phải chỉ số cuối; chạm vào ô mang chỉ số 10 là đọc ghi ra ngoài mảng, lỗi mà trình biên dịch không chặn giúp. Giá trị "8" là chỉ số của ký tự cuối khi mảng đang chứa một chuỗi dùng hết chỗ, vì khi đó ô cuối phải để dành cho ký tự kết thúc, nhưng câu hỏi hỏi chỉ số lớn nhất của mảng chứ không hỏi chuỗi. Mô tả "It depends on the contents of the array" không đúng: kích thước mảng cố định ngay từ lúc khai báo nên dải chỉ số không phụ thuộc nội dung đang chứa.
45If the file "data.txt" contains:
Hello World
42
Consider the following complete C program that reads data from a file:4 lựa chọncó code
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("data.txt", "r");
char buffer[100];
int number;
if (fp != NULL) {
fgets(buffer, sizeof(buffer), fp);
fscanf(fp, "%d", &number);
fclose(fp);
}
return 0;
}What will be stored in the variables after execution?
Abuffer = "Hello World\n", number = 42
Bbuffer = "Hello World", number = 42
Cbuffer = "Hello", number = 0
Dbuffer = "Hello World\n", number = undefined
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "buffer = "Hello World\n", number = 42". Hàm fgets đọc tới hết dòng hoặc tới khi gần đầy vùng đệm, nó giữ lại ký tự xuống dòng rồi mới thêm ký tự kết thúc chuỗi; vùng đệm 100 byte đủ chứa dòng đầu nên buffer nhận trọn Hello World kèm ký tự xuống dòng. Chỉ báo vị trí tệp lúc này nằm ở đầu dòng thứ hai, nên fscanf với đặc tả %d bỏ qua khoảng trắng dẫn đầu, đọc hai chữ số và ghi 42 vào number. Mô tả "buffer = "Hello World", number = 42" bỏ mất ký tự xuống dòng, mà đó đúng là chỗ khác nhau giữa fgets và các hàm đọc dòng kiểu cũ. Mô tả "buffer = "Hello", number = 0" ứng với cách đọc theo từ của scanf với đặc tả chuỗi, còn fgets không dừng ở khoảng trắng. Mô tả "buffer = "Hello World\n", number = undefined" sai ở phần số: dòng thứ hai có số nguyên hợp lệ nên fscanf đọc được và báo đã gán một giá trị.
46What commands are used to write data appended to the end of the file?(Choose 2 correct answers)5 lựa chọn
AFILE *f = fwrite("output.txt", "a" );
BFILE *f = fopen("output.txt", "a" );
CFILE *f = fopen("output.txt", "a+" );
DFILE *f = fopen("output.txt", "w+" );
EFILE *f = fopen("output.txt ", "w" );
Lời giải
Mở trang câu hỏi này →Đáp án đúng gồm hai ý: "FILE *f = fopen("output.txt", "a" );" và "FILE *f = fopen("output.txt", "a+" );". Chế độ ghi nối giữ nguyên nội dung cũ và đặt mọi lần ghi xuống cuối tệp, bất kể chỉ báo vị trí đang ở đâu; tệp chưa tồn tại thì thư viện tạo mới. Chế độ nối có thêm dấu cộng cũng ghi ở cuối, chỉ mở thêm quyền đọc, nên vẫn thoả yêu cầu. Lệnh "FILE *f = fwrite("output.txt", "a" );" sai hàm: fwrite không mở tệp mà ghi một khối dữ liệu, nó cần bốn đối số gồm con trỏ dữ liệu, kích thước phần tử, số phần tử và con trỏ tệp, lại trả về số phần tử đã ghi chứ không trả về con trỏ tệp. Lệnh "FILE *f = fopen("output.txt", "w+" );" cắt tệp về rỗng ngay khi mở nên dữ liệu cũ mất sạch, đó là ghi mới chứ không phải ghi thêm. Lệnh "FILE *f = fopen("output.txt ", "w" );" cũng cắt tệp, ngoài ra tên tệp còn thừa một dấu cách nên trỏ sang tên khác.
47What is correct about strcpy(s1, s2) function?5 lựa chọn
ACompare two s1 strings and s2 string
BCopy s2 string to s1 string
CCopy s1 string to s2 string
DConcatenate string s2 to the end of s1
EFind the address of a substring
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Copy s2 string to s1 string". Thứ tự tham số của nhóm hàm chuỗi trong C luôn là đích trước, nguồn sau, cùng chiều với phép gán; vì vậy lời gọi strcpy(s1, s2) chép nội dung của s2 sang vùng nhớ s1, ghi đè từ byte đầu tiên và chép cả ký tự kết thúc. Mô tả "Compare two s1 strings and s2 string" là việc của strcmp, hàm đó chỉ đọc hai chuỗi rồi trả về một số nguyên theo thứ tự từ điển, không ghi vào đâu cả. Mô tả "Copy s1 string to s2 string" đảo chiều, hiểu như thế thì dữ liệu đi sai hướng và vùng lẽ ra phải được cập nhật vẫn nguyên như cũ. Mô tả "Concatenate string s2 to the end of s1" là việc của strcat, hàm đó giữ nội dung cũ của s1 và ghi tiếp từ ký tự kết thúc. Mô tả "Find the address of a substring" là việc của strstr, hàm trả về con trỏ tới chỗ tìm thấy hoặc con trỏ rỗng.
ACreate a file named employee.dat. The address of the newly created file is assigned to the file pointer fp.
BOpen a file named employee.dat to read data. If the file exists, the address of the file is assigned to the file pointer fp.
COpen a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.
DOpen a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp and all existing data will be overwritten. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Open a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.". Chế độ nối của fopen giữ nguyên nội dung cũ và đặt mọi lần ghi xuống cuối tệp, còn tệp chưa có thì thư viện tạo mới; giá trị trả về là con trỏ tới cấu trúc mô tả dòng tệp, hoặc con trỏ rỗng khi mở thất bại. Mô tả "Create a file named employee.dat." nói như thể luôn tạo tệp mới, bỏ mất trường hợp tệp đã tồn tại và bỏ luôn ý nghĩa ghi nối. Mô tả "Open a file named employee.dat to read data." ứng với chế độ đọc, và chế độ đó còn trả về con trỏ rỗng khi tệp không tồn tại chứ không tạo tệp. Mô tả "all existing data will be overwritten" tự mâu thuẫn với việc nối thêm: xoá sạch nội dung cũ là hành vi của chế độ ghi mới.
49What happens in this do/while loop?4 lựa chọncó code
int n;
do {
printf("Enter a number:");
scanf("%d", &n);
} while (n < 1 || n > 5);ANever runs
BRuns only when n = 1
CInfinite loop
DRuns at least once
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Runs at least once". Vòng do-while đặt phép kiểm điều kiện ở cuối, nên thân luôn chạy trọn một lượt trước khi điều kiện được tính lần đầu; ở đây lượt đầu in lời mời rồi đọc n, sau đó mới xét n có nằm ngoài khoảng từ 1 tới 5 hay không để quyết định lặp lại. Đó chính là khuôn mẫu quen dùng để buộc người nhập phải nhập lại cho tới khi hợp lệ. Mô tả "Never runs" trái hẳn với vị trí của phép kiểm, không có đường nào để thân bị bỏ qua. Mô tả "Runs only when n = 1" lẫn chiều điều kiện: n bằng 1 làm điều kiện sai nên vòng lặp dừng, hơn nữa n chỉ có giá trị sau khi thân đã chạy một lượt. Mô tả "Infinite loop" chỉ xảy ra khi người nhập cứ đưa số ngoài khoảng, hoặc nhập chữ làm scanf thất bại và n giữ nguyên giá trị cũ, chứ không phải hành vi mặc định của đoạn mã.
50What will be printed after execution of the following program code?4 lựa chọncó code
#include <stdio.h>
int main() {
int a=12, b=5;
a=a^b;
b=a^b;
a=a^b;
printf("%d %d",a,b);
return 0;
}A5 12
B12 5
C9 5
D12 9
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "5 12". Phép hoặc loại trừ theo bit tự nghịch đảo, nên ba lệnh liên tiếp đổi chỗ được hai giá trị mà không cần biến tạm. Theo từng bước: a bằng 12 là dãy bit 1100, b bằng 5 là 0101; lệnh thứ nhất cho a thành 1001 tức 9; lệnh thứ hai lấy 1001 với 0101 cho b thành 1100 tức 12, đúng giá trị ban đầu của a; lệnh thứ ba lấy 1001 với 1100 cho a thành 0101 tức 5, đúng giá trị ban đầu của b. Lệnh in xuất a là 5 rồi b là 12. Dãy "12 5" là hai giá trị ban đầu, tức giả định ba lệnh không làm gì. Dãy "9 5" dừng ở trạng thái ngay sau lệnh thứ nhất, lúc a đã thành 9 nhưng b chưa đổi. Dãy "12 9" ghép giá trị ban đầu của a với con số trung gian 9, không ứng với trạng thái nào sau khi cả ba lệnh chạy xong.