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

Câu hỏi: PRF192 Cơ sở lập trình – Đề thi cuối kỳ SU26

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
Đề bài
int main()
{
        int i = 100;
        int *p = &i;
        *p +=2;
        printf("%d, %d", i, *p);
        getchar();
        return 0;
}
A102, 102
B100, 102
C100, 100
D102, 100
Lời giải
Đáp án đúng: "102, 102". Con trỏ p được gán địa chỉ của i nên nó trỏ thẳng vào ô nhớ của i; phép cộng dồn qua dấu sao không tạo bản sao nào mà cộng 2 ngay tại ô đó, vì vậy i trở thành 102. Khi printf chạy, cả i và nội dung được p trỏ tới đều đọc cùng một ô nhớ nên hai số in ra giống nhau; đó là bản chất của bí danh qua con trỏ, hai cách gọi tên cho cùng một vùng dữ liệu. Lựa chọn "100, 102" đòi i giữ nguyên trong khi vùng được trỏ tới đổi, chuyện chỉ xảy ra nếu p trỏ vào một biến khác. Lựa chọn "100, 100" là kết quả nếu phép cộng áp lên bản thân con trỏ, khi đó i không đổi nhưng con trỏ lại đọc sang vùng nhớ lạ. Lựa chọn "102, 100" vừa đòi i đổi vừa đòi phép lấy nội dung cho ra giá trị cũ, mâu thuẫn vì chúng là cùng một ô nhớ.
Mở trang câu hỏi này →
42What will be the result of the following C code?4 lựa chọncó code
Đề bài
char str1[20] = "Hello";
char str2[20] = "World";
strcat(str1, str2);
printf("%s", str1);
AHelloWorld
BHello World
CWorldHello
DWorld Hello
Lời giải
Đáp án đúng: "HelloWorld". Hàm strcat tìm byte rỗng kết thúc của chuỗi đích rồi chép chuỗi nguồn vào từ đúng chỗ đó, kèm một byte kết thúc mới; nó không tự chèn dấu cách và cũng không đổi thứ tự. Vậy str1 vốn là Hello được nối thêm World ngay sau chữ cuối, cho HelloWorld dài mười ký tự, vẫn vừa trong mảng hai mươi ô nên không tràn. Chuỗi "Hello World" đòi một dấu cách ở giữa, muốn có thì phải nối thêm một chuỗi chứa dấu cách trước khi nối từ thứ hai. Chuỗi "WorldHello" đảo vai hai chuỗi: strcat luôn ghi vào tham số đầu, nên muốn kết quả đó phải gọi với str2 làm đích. Chuỗi "World Hello" vừa đảo vai vừa thêm dấu cách, không khớp điều gì trong lời gọi.
Mở trang câu hỏi này →
Agetchar() , scanf()
Bgetchar() , fgets()
Cscanf() , fgetc()
Dfgets() , fgetc()
Lời giải
Đáp án đúng: "getchar() , scanf()". Hai hàm này làm việc thẳng trên luồng vào chuẩn mà không cần ai chỉ luồng cho chúng, và luồng vào chuẩn mặc định có vùng đệm: ký tự người dùng gõ nằm lại trong đệm cho tới khi được đọc, nên scanf đọc xong vẫn để lại phần chưa dùng, kể cả dấu xuống dòng, cho lần getchar sau. Cặp "getchar() , fgets()" lẫn một hàm cần đối số luồng, vì fgets đòi con trỏ tệp nên không gắn riêng với vào chuẩn, muốn đọc bàn phím phải truyền stdin vào. Cặp "scanf() , fgetc()" cũng vậy, fgetc nhận luồng làm đối số và dùng được cho tệp bất kỳ. Cặp "fgets() , fgetc()" gồm hai hàm đều mang đối số luồng, nên nó mô tả vào ra tệp tổng quát chứ không phải tiện ích đọc sẵn trên luồng vào chuẩn.
Mở trang câu hỏi này →
A"w+" truncates existing files, "a+" preserves them.
B"a+" can only append data, while "w+" can only write from the beginning.
C"a+" opens binary files, while "w+" opens text files.
D"a+" allows reading only, while "w+" allows both reading and writing.
Lời giải
Đáp án đúng: "w+" truncates existing files, "a+" preserves them. Khác biệt gốc nằm ở lúc mở một tệp đã có: chế độ w+ cắt tệp về rỗng ngay khi mở nên dữ liệu cũ mất sạch, còn a+ giữ nguyên nội dung cũ và mọi phép ghi luôn được đẩy xuống cuối tệp bất kể con trỏ đọc đang ở đâu; cả hai đều tạo tệp mới nếu tệp chưa tồn tại và cả hai đều cho cả đọc lẫn ghi nhờ dấu cộng. Câu "a+" can only append data, while "w+" can only write from the beginning. sai vì dấu cộng ở cả hai chế độ đều mở thêm quyền đọc. Câu "a+" opens binary files, while "w+" opens text files. sai vì chế độ nhị phân do chữ b quyết định, hai chuỗi này đều là chế độ văn bản. Câu "a+" allows reading only, while "w+" allows both reading and writing. sai vì a+ cho ghi, chỉ khác là ghi luôn vào cuối tệp.
Mở trang câu hỏi này →
Đề bài
int n;
char c;
scanf("%d", &n);
c = getchar();
printf("%d",c);
A10
B20
C0
DUndefined
Lời giải
Đáp án đúng: "10". Khi người dùng gõ 20 rồi nhấn phím xuống dòng, vùng đệm của luồng vào chuẩn chứa hai chữ số và một ký tự xuống dòng. Đặc tả %d đọc hai chữ số rồi dừng ngay khi gặp ký tự không phải chữ số, và bỏ lại ký tự xuống dòng trong đệm. Lệnh getchar kế đó lấy đúng ký tự còn lại ấy, tức ký tự xuống dòng, mã ASCII bằng 10; in nó bằng %d nên màn hình hiện 10. Số "20" là giá trị của n, nhưng printf in biến c chứ không in n, và c chỉ giữ được một ký tự. Số "0" ứng với byte rỗng, thứ không có trong dòng người dùng gõ. Kết luận "Undefined" sai vì luồng vào chuẩn có vùng đệm nên ký tự xuống dòng còn nguyên ở đó, kết quả hoàn toàn đoán được; đây cũng là lý do phải dọn đệm trước khi đọc ký tự.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    FILE *file_ptr;
    file_ptr = fopen("output.txt", "w");
    if (file_ptr == NULL) {
        printf("Unable to open the file.\n");
        return 1;
    }
    fprintf(file_ptr, "Hello, World!\nThis is a test.");
    fclose(file_ptr);
    return 0;
}

Assuming the code is executed successfully, what will be the content of the "output.txt" file?

AHello, World! This is a test.
BHello, World! This is a test.
CHello, World!
DThis is a test.
Lời giải
Đáp án đúng: "Hello, World! This is a test." Chuỗi định dạng truyền cho fprintf chứa dãy thoát xuống dòng ở giữa, nên khi ghi ra tệp nó trở thành một ký tự xuống dòng thật, chia nội dung thành hai dòng; fprintf ghi đúng những gì chuỗi định dạng mô tả, không tự thêm hay bớt ký tự nào, và chế độ w tạo tệp mới hoặc xoá trắng tệp cũ trước khi ghi, còn fclose đẩy hết bộ đệm xuống đĩa nên nội dung chắc chắn được lưu đủ. "Hello, World! This is a test." sai vì nó thay ký tự xuống dòng bằng một khoảng trắng, chuyện đó không xảy ra. "Hello, World!" sai vì nó chỉ lấy phần trước dấu xuống dòng, trong khi một lần gọi fprintf ghi trọn chuỗi. "This is a test." sai vì nó bỏ phần đầu của chuỗi, mà không có lệnh nào ghi đè phần đó.
Mở trang câu hỏi này →
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
Đá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.
Mở trang câu hỏi này →
ARead data from the file.
BPrint to the screen.
CRead data from the keyboard.
DOpen a file.
EPrint to file.
Lời giải
Đáp án đúng: "Read data from the file." Hàm fscanf là bản mở rộng của scanf: tham số đầu là con trỏ tệp chỉ luồng nguồn, sau đó là chuỗi định dạng và danh sách địa chỉ biến; hàm đọc văn bản trong tệp, chuyển theo đặc tả rồi nạp vào các biến, và trả về số mục chuyển đổi thành công. Mô tả "Print to the screen." là việc của printf, in ra luồng ra chuẩn. Mô tả "Read data from the keyboard." là việc của scanf, tức fscanf với luồng stdin; bàn phím chỉ là một trường hợp riêng, còn fscanf nói chung đọc từ luồng được truyền vào. Mô tả "Open a file." là việc của fopen, hàm tạo ra con trỏ tệp mà fscanf cần. Mô tả "Print to file." là việc của fprintf, đi hướng ngược lại: lấy giá trị trong bộ nhớ, ghi thành văn bản vào tệp.
Mở trang câu hỏi này →
AIt must use recursion
BIt must be written in C language
CIt must have infinite steps
DIt must be finite and well-defined
Lời giải
Đáp án đúng: "It must be finite and well-defined". Thuật toán là dãy bước giải một bài toán, và hai tính chất không thể thiếu là hữu hạn, tức phải dừng sau số bước xác định, cùng rõ ràng, tức mỗi bước chỉ hiểu được theo một nghĩa để ai thực hiện cũng cho cùng kết quả. Thiếu một trong hai thì không còn là thuật toán. Yêu cầu "It must use recursion" sai vì đệ quy chỉ là một cách tổ chức lời giải; vô số thuật toán chỉ dùng vòng lặp. Yêu cầu "It must be written in C language" lẫn thuật toán với chương trình: thuật toán tồn tại độc lập, diễn đạt được bằng lời, bằng mã giả hay sơ đồ khối, rồi mới cài đặt bằng một ngôn ngữ bất kỳ. Yêu cầu "It must have infinite steps" trái hẳn tính hữu hạn; dãy bước không bao giờ dừng chỉ là vòng lặp vô tận, không giải xong việc gì.
Mở trang câu hỏi này →
A_abc
Bbc#
C1abc
Dcase
Lời giải

Đáp án đúng: "_abc". Tên định danh trong C chỉ gồm chữ cái, chữ số và dấu gạch dưới, ký tự đầu phải là chữ cái hoặc dấu gạch dưới, và tên không được trùng từ khoá; tên mở đầu bằng gạch dưới thoả cả ba điều kiện nên hợp lệ, dù theo quy ước lớp tên đó nên để dành cho thư viện. Tên "bc#" chứa dấu thăng, ký tự không thuộc tập cho phép; bộ phân tích từ vựng tách nó thành một ký tự riêng và câu khai báo vỡ. Tên "1abc" mở đầu bằng chữ số nên bị đọc như một hằng số, đúng điều cấm với ký tự đầu tiên. Tên "case" là từ khoá dành riêng cho nhãn trong cấu trúc switch; từ khoá đã có nghĩa cố định với trình dịch nên không dùng lại làm tên biến được.

Mở trang câu hỏi này →