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

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

49 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–49.

Danh sách câu hỏi

49/49 câuHết danh sách
41Assume we have a function such as:4 lựa chọncó code
Đề bài
void swap(int a, int b){
    int t = a;
    a=b;
    b=t;
}

What is the problem with a and b after executing the swap (a, b) function?

Aa and b do not change values.
Bcannot execute the swap(a,b) function.
Ca has the old value of b, and b has the new value of t.
Da and b change values for each other;
Lời giải

Đáp án đúng: "a and b do not change values.". C truyền tham số theo giá trị: lúc gọi hàm, hai đối số được sao chép vào hai biến cục bộ trùng tên bên trong swap. Mọi phép đổi chỗ sau đó chỉ xáo trộn bản sao, và khi hàm kết thúc các bản sao biến mất, hai biến ở chỗ gọi vẫn nguyên như trước. Muốn đổi thật thì tham số phải là con trỏ và thân hàm phải làm việc qua phép lấy nội dung. Ý "cannot execute the swap(a,b) function." sai vì hàm hoàn toàn hợp lệ, nó dịch được và chạy được, chỉ là không có tác dụng ra bên ngoài. Ý "a has the old value of b, and b has the new value of t." sai vì điều đó chỉ đúng với hai bản sao cục bộ và chỉ tới thời điểm trước khi hàm trả về. Ý "a and b change values for each other; " sai vì đó chính là ngộ nhận mà câu hỏi muốn phá: việc đổi chỗ có xảy ra nhưng không chạm tới ô nhớ của hai biến gốc.

Mở trang câu hỏi này →
AA constant value stored in memory
BA reference to a memory location
CA function used for binary conversion
DA line number in the code
Lời giải
Đáp án đúng: "A reference to a memory location". Khai báo một biến là yêu cầu trình biên dịch dành ra một vùng nhớ có kích thước đúng theo kiểu rồi gắn cho vùng đó một cái tên; từ đó tên biến trở thành cách gọi tới ô nhớ ấy, đọc tên là đọc nội dung ô, gán cho tên là ghi vào ô. Ý "A constant value stored in memory" sai vì điểm khác biệt của biến so với hằng chính là nội dung có thể thay đổi suốt thời gian chương trình chạy. Ý "A function used for binary conversion" sai vì biến là chỗ chứa dữ liệu, không phải một đoạn mã thực hiện công việc, và nó cũng chẳng làm phép chuyển đổi nào. Ý "A line number in the code" sai vì số dòng chỉ là thông tin của tệp văn bản nguồn, nó không tồn tại trong chương trình đã dịch và không dính gì tới nơi lưu giá trị.
Mở trang câu hỏi này →
A3
B2
C2.5
D2.6
Lời giải
Đáp án đúng: "3". Hàm ceil trong math.h làm tròn lên: nó trả về số nguyên nhỏ nhất không bé hơn đối số, nên với 2.55 kết quả là 3, dù phần thập phân có nhỏ tới đâu cũng vẫn bị kéo lên số nguyên kế tiếp. Cần nhớ kiểu trả về vẫn là double nên giá trị thực chất là 3.0, muốn in ra dạng số nguyên thì phải chuyển kiểu hoặc chọn đặc tả thích hợp. Ý "2" sai vì đó là kết quả của floor, phép làm tròn xuống, hoặc của việc cắt phần thập phân khi ép sang int. Ý "2.5" sai vì ceil không làm tròn tới nửa đơn vị, nó luôn đưa về một số nguyên. Ý "2.6" sai vì đó là làm tròn tới một chữ số thập phân, việc mà ceil không bao giờ làm.
Mở trang câu hỏi này →
44What will be printed by the code below?4 lựa chọncó code
Đề bài
#include <stdio.h>
#include <stdlib.h>
int main() {
    int *p = (int*) malloc(sizeof(int));
    *p = 50;
    printf("%d", *p);
    free(p);
    return 0;
}
AAddress of p
BGarbage value
C50
DCompilation error
Lời giải
Đáp án đúng: "50". Lời gọi malloc xin một khối nhớ vừa đủ cho một int và trả về địa chỉ khối đó, p giữ địa chỉ này. Lệnh *p = 50 ghi số 50 vào chính khối vừa xin, nên khi printf đọc *p nó lấy ra 50. Thứ tự các lệnh là điều cốt yếu: giá trị được in trước, chỉ sau đó free mới trả khối nhớ về cho hệ thống, nên không có chuyện đọc vào vùng đã giải phóng. Ý "Address of p" sai vì đặc tả %d đi với *p, tức là nội dung tại địa chỉ, chứ không phải bản thân địa chỉ. Ý "Garbage value" sai vì malloc đúng là không xoá vùng nhớ, nhưng ô đó đã được gán tường minh trước khi đọc. Ý "Compilation error" sai vì mã đã nạp stdlib.h cho malloc và ép kiểu con trỏ trả về đúng cách, mọi lệnh đều hợp lệ.
Mở trang câu hỏi này →
45What is the output of the following code snippet?4 lựa chọncó code
Đề bài
char words[4][11];
strcpy(words[0], "apple");
strcat(words[0], "juice");
printf("%s\n", words[0]);
Aapplejuice
Bapple
Cjuice
Djuiceapple
Lời giải
Đáp án đúng: "applejuice". Khai báo words là mảng hai chiều gồm 4 hàng, mỗi hàng là một mảng 11 ký tự, nên words[0] dùng được như một chuỗi. Hàm strcpy đặt apple cùng ký tự kết thúc vào đầu hàng đó; sau đó strcat tìm tới ký tự kết thúc ấy và ghi tiếp juice từ đúng chỗ đó, rồi đặt lại ký tự kết thúc. Kết quả là một chuỗi mười ký tự, cộng byte kết thúc là vừa đủ 11 ô của hàng. Ý "apple" sai vì nó bỏ qua tác dụng của strcat. Ý "juice" sai vì strcat nối thêm vào phía sau, nó không ghi đè từ đầu hàng; muốn thay hẳn nội dung thì phải gọi strcpy lần nữa. Ý "juiceapple" sai vì trật tự nối luôn là chuỗi đích trước rồi chuỗi nguồn sau, đối số thứ nhất là nơi nhận và nó giữ nguyên phần đầu của mình.
Mở trang câu hỏi này →
46What will this code output?4 lựa chọncó code
Đề bài
int a = 5, b = 10;
printf("%d", !(a > b || b == 10));
A0
B1
C5
D-1
Lời giải
Đáp án đúng: "0". Bên trong cặp ngoặc đơn, phép so sánh a lớn hơn b cho 0 vì 5 không lớn hơn 10, còn phép so sánh b bằng 10 cho 1 vì đúng; phép hoặc luận lý của hai giá trị đó cho 1. Cuối cùng phép phủ định đảo một giá trị khác không thành 0, nên số in ra là 0. Nói gọn thì phủ định một biểu thức đúng luôn cho 0, và kết quả của mọi phép luận lý trong C chỉ nhận hai giá trị 0 hoặc 1. Ý "1" sai vì nó ứng với trường hợp biểu thức trong ngoặc là sai, trong khi nhánh b bằng 10 đã thoả nên cả phép hoặc đã đúng. Ý "5" sai vì không có đường nào để giá trị của a lọt ra kết quả, phép phủ định luôn trả về 0 hoặc 1. Ý "-1" sai vì chuẩn không cho phép phép phủ định sinh ra số âm.
Mở trang câu hỏi này →
47What will this code print?4 lựa chọncó code
Đề bài
int x[5] = {0};
printf("%d", x[3]);
A0
BGarbage value
C3
DError
Lời giải
Đáp án đúng: "0". Khi một mảng có danh sách khởi tạo, những phần tử không được nêu giá trị đều bị đặt về 0 theo đúng quy định của chuẩn; vì thế cách viết với một số 0 duy nhất trong cặp ngoặc nhọn là lối quen dùng để xoá trắng cả mảng. Phần tử ở chỉ số 3 nằm trong nhóm được lấp 0 nên printf in ra 0. Ý "Garbage value" sai vì giá trị rác chỉ xuất hiện khi một mảng cục bộ không có bất kỳ danh sách khởi tạo nào; ở đây đã có danh sách nên toàn bộ mảng được xác định. Ý "3" sai vì 3 là chỉ số, không phải nội dung của ô; vị trí và nội dung là hai chuyện khác nhau. Ý "Error" sai vì khởi tạo thiếu giá trị là hợp lệ, và chỉ số 3 vẫn nằm trong phạm vi mảng 5 phần tử.
Mở trang câu hỏi này →
48What is a pointer in C programming?4 lựa chọn
AA variable stores anything
BA variable stores address of another variable or a variable stores address of the dynamically allocated memory
CAn address in the memory
DA variable stores any number
Lời giải
Đáp án đúng: "A variable stores address of another variable or a variable stores address of the dynamically allocated memory". Con trỏ trước hết là một biến, nên nó có ô nhớ riêng và có kiểu; thứ nó chứa là địa chỉ, có thể là địa chỉ của một biến khác lấy bằng toán tử lấy địa chỉ, hoặc địa chỉ của khối nhớ xin được từ malloc. Kiểu của con trỏ không để trang trí: nó quyết định bước nhảy khi làm phép tính trên con trỏ và quyết định cách đọc dữ liệu tại địa chỉ ấy. Ý "A variable stores anything" sai vì nói vậy thì mọi biến đều là con trỏ, định nghĩa mất hết ý nghĩa. Ý "An address in the memory" sai vì nó lẫn giữa giá trị và vật chứa: địa chỉ là nội dung mà con trỏ giữ, còn con trỏ là biến giữ nội dung đó. Ý "A variable stores any number" sai vì con trỏ không chứa số tuỳ ý, nó chỉ hợp lệ khi giữ địa chỉ của một ô nhớ có thật hoặc giá trị rỗng.
Mở trang câu hỏi này →
ALoop infinitely
BNo Output will be printed
CCompile time error
DThe loop will not work
Lời giải
Đáp án đúng: "Loop infinitely". Vòng lặp kiểm tra điều kiện trước mỗi lượt và chỉ thoát khi điều kiện cho giá trị 0; nếu điều kiện luôn khác không thì phép kiểm tra không bao giờ mở lối ra nên thân vòng lặp chạy mãi, trừ khi bên trong có break, return, goto hay một lời gọi kết thúc chương trình. Ý "No Output will be printed" sai vì nếu thân vòng lặp có lệnh in thì màn hình nhận dữ liệu không ngừng, ngược hẳn với việc không có gì; chỉ bộ đệm mới làm dữ liệu hiện ra chậm. Ý "Compile time error" sai vì trình biên dịch không có nhiệm vụ chứng minh một vòng lặp sẽ dừng, viết while với điều kiện 1 là mã hợp lệ và còn được dùng cố ý. Ý "The loop will not work" sai vì vòng lặp vẫn làm việc đúng như được viết, vấn đề là nó không chịu dừng.
Mở trang câu hỏi này →