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

Câu hỏi: PRF192 Cơ sở lập trình – Bộ ôn tập số 4

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
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 →
42What is the output of the following code snippet?4 lựa chọncó code
Đề bài
void main(){
    int x = 4;
    int *p = &x;
    int *k = p++;
    int r = p - k;
    printf("%d", r);
}
A1
B4
C5
D0
Lời giải
Đáp án đúng: "1". Phép tăng sau p++ nộp cho k giá trị cũ của p rồi mới đẩy p sang ô int kế tiếp, nên k trỏ vào x còn p trỏ vào ô liền sau. Hiệu hai con trỏ cùng kiểu trong C được tính theo số phần tử chứ không theo byte: trình biên dịch lấy khoảng cách byte rồi chia cho kích thước kiểu, vì vậy p trừ k bằng 1. Ý "4" sai vì 4 chính là khoảng cách tính bằng byte khi int chiếm 4 byte, tức là bỏ qua bước chia cho kích thước kiểu; nó lại trùng với giá trị của x nên càng dễ nhầm. Ý "5" sai vì không có phép tính nào cộng thêm 1 vào giá trị của x. Ý "0" sai vì nó cho rằng p++ chưa kịp có tác dụng hoặc k mãi mãi đi theo p; cần công bố rằng đây là khuyết điểm của đề, bộ khoá đi kèm ghi đúng giá trị 0 trong khi ngữ nghĩa của phép tăng sau buộc p và k phải lệch nhau đúng một phần tử.
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 →
Achar arr[] = "Hello";
Bchar arr[] = ['H', 'e', 'l', 'l', 'o','/e'];
CChar[] arr = "Hello";
DChar[] arr = {'H', 'e', 'l', 'l', 'o','/0'};
Lời giải
Đáp án đúng: "char arr[] = "Hello";". Hằng chuỗi trong dấu nháy kép đã mang sẵn ký tự rỗng kết thúc, nên khai báo này tạo mảng sáu phần tử gồm năm chữ và một ký tự kết thúc, kích thước do trình biên dịch tự đếm vì cặp ngoặc vuông để trống. "char arr[] = ['H', 'e', 'l', 'l', 'o','/e'];" sai hai chỗ: danh sách khởi tạo phải nằm trong ngoặc nhọn chứ không phải ngoặc vuông, và ký tự kết thúc viết bằng dấu chéo ngược với số 0, không phải dấu chéo xuôi với chữ e. "Char[] arr = "Hello";" sai vì C phân biệt chữ hoa chữ thường nên không có kiểu tên Char, lại đặt cặp ngoặc vuông sai chỗ, trong C nó đi sau tên biến. "Char[] arr = {'H', 'e', 'l', 'l', 'o','/0'};" mắc đúng hai lỗi vừa nêu, thêm nữa dấu chéo xuôi với 0 chỉ là hai ký tự thường, không phải ký tự rỗng.
Mở trang câu hỏi này →
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
Đá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.
Mở trang câu hỏi này →
Đề bài
#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
Đá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ị.
Mở trang câu hỏi này →
47What 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 →
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 →
49What does the following code do?4 lựa chọncó code
Đề bài
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
Đá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.
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 →