Câu hỏi: PRF192 Cơ sở lập trình – Bộ ôn tập số 1
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 đề.
Danh sách câu hỏi
20/50 câuCòn 30
1What is the incorrect definition?4 lựa chọn
AAlgorithm: a way to find out a solution
BData: Values are used to describe information. So, information can be called as the mean of data
CSolution: A situation in which something is hidden
DInformation: Knowledge about something
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Solution: A situation in which something is hidden". Câu này tả một tình huống có thứ gì bị che giấu, tức là mô tả của một vấn đề hay một câu đố, chứ không phải của giải pháp; giải pháp là cách làm cụ thể đưa bài toán từ dữ liệu đầu vào tới kết quả mong muốn, nên định nghĩa này sai. "Algorithm: a way to find out a solution" đúng, vì thuật toán chính là dãy bước hữu hạn dùng để tìm ra giải pháp. "Data: Values are used to describe information. So, information can be called as the mean of data" đúng theo cách môn học phân biệt hai khái niệm: dữ liệu là các giá trị thô, còn thông tin là nghĩa rút ra từ những giá trị đó. "Information: Knowledge about something" đúng, vì thông tin là hiểu biết về một đối tượng, kết quả của việc diễn giải dữ liệu.
2Which is not a type of bus in a computer?4 lựa chọn
AAddress bus
BSignal bus
CControl bus
DData bus
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Signal bus". Trong kiến trúc máy tính, các đường truyền nối bộ xử lý với bộ nhớ và thiết bị vào ra được chia theo chức năng thành ba nhóm: đường địa chỉ, đường dữ liệu và đường điều khiển; không có nhóm nào mang tên đường tín hiệu, bởi mọi đường đều truyền tín hiệu điện nên cách gọi đó chẳng phân loại được gì. "Address bus" là nhóm thật, chở số hiệu ô nhớ hoặc cổng mà bộ xử lý muốn đọc hay ghi, và độ rộng của nó quyết định lượng bộ nhớ tối đa máy chạm tới được. "Control bus" cũng là nhóm thật, mang các lệnh phối hợp như yêu cầu đọc, yêu cầu ghi, nhịp đồng hồ, tín hiệu ngắt. "Data bus" là nhóm thật còn lại, chở chính nội dung được trao đổi giữa bộ xử lý, bộ nhớ và thiết bị.
AThe comment mark will be removed. The content of the comments will be compiled line by line.
BThe comment is treated as an array of characters.
CComments are removed in the pre-processing step.
DEach comment is compiled as a statement that does nothing.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Comments are removed in the pre-processing step." Chú thích chỉ dành cho người đọc, không mang nghĩa gì với máy, nên nó bị loại bỏ ngay ở bước tiền xử lý, trước khi khâu phân tích cú pháp nhìn tới mã; mỗi chú thích được thay bằng một khoảng trắng, vì vậy mã máy sinh ra không đổi dù chú thích dài hay ngắn. "The comment mark will be removed. The content of the comments will be compiled line by line." sai vì nội dung chú thích không bao giờ được biên dịch; nếu biên dịch thì mọi câu văn trong chú thích đều thành lỗi cú pháp. "The comment is treated as an array of characters." sai vì chỉ chuỗi nằm trong dấu nháy kép mới trở thành mảng ký tự trong bộ nhớ, chú thích không sinh ra byte dữ liệu nào. "Each comment is compiled as a statement that does nothing." sai vì không có lệnh rỗng nào được sinh ra, chương trình dịch xong không còn dấu vết của chú thích.
ACompile time error
BRun time error
CInput error
DLinking error
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Compile time error". Lỗi cú pháp là chuyện vi phạm quy tắc viết của ngôn ngữ, chẳng hạn thiếu dấu chấm phẩy hay lệch cặp ngoặc, nên trình biên dịch phát hiện ngay khi phân tích mã nguồn và từ chối sinh tệp thực thi; chương trình chưa từng chạy nên không thể có lỗi lúc chạy. "Run time error" là loại khác, chỉ xuất hiện khi tệp thực thi đã chạy, như chia cho 0 hay truy cập con trỏ rỗng, lúc đó cú pháp vốn đã đúng. "Input error" nói về dữ liệu người dùng nhập sai khuôn dạng, thuộc phạm vi kiểm tra của chính chương trình, không liên quan tới cách viết mã. "Linking error" xảy ra sau khâu biên dịch, khi bộ liên kết không tìm thấy định nghĩa của một hàm đã khai báo, tức mã từng dịch thành công rồi mới vỡ.
ATo make our programs longer, we use higher-level languages.
BProgram code in a high level language can not run, it must be translated to binary code (machine code) before running.
CC is based on a view of structured programming.
DPrograms that perform relatively simple tasks and are written in assembly language typically require more lines of code than those written in higher-level languages
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "To make our programs longer, we use higher-level languages." Mục đích của ngôn ngữ bậc cao là ngược lại: một dòng mã bậc cao gói được nhiều lệnh máy, nhờ đó chương trình ngắn hơn, dễ đọc và dễ bảo trì hơn, nên câu này sai ở chỗ nói ta dùng ngôn ngữ bậc cao để chương trình dài ra. "Program code in a high level language can not run, it must be translated to binary code (machine code) before running." đúng, vì bộ xử lý chỉ hiểu mã máy, mã nguồn phải qua trình biên dịch mới chạy được. "C is based on a view of structured programming." đúng, C tổ chức chương trình bằng hàm cùng các khối rẽ nhánh và lặp theo tinh thần lập trình có cấu trúc. "Programs that perform relatively simple tasks and are written in assembly language typically require more lines of code than those written in higher-level languages" đúng, cùng một việc nhỏ viết bằng hợp ngữ phải tả từng bước của máy nên tốn nhiều dòng hơn.
A
constB
defineC
constantD
namedLời giải
Mở trang câu hỏi này →Đáp án đúng gồm hai ý: "const" và "define". Trong C có hai cách đặt tên cho một giá trị bất biến: từ khoá const gắn vào khai báo biến, bắt trình biên dịch chặn mọi phép gán lại; và chỉ thị tiền xử lý #define, thay tên bằng dãy ký tự giá trị trước khi biên dịch. Cần công bố một khuyết điểm của đề: câu ghi rõ chọn hai nhưng bản khoá in kèm chỉ tô được một ô, nên lời giải này dựng lại cặp đáp án từ chính quy tắc của ngôn ngữ chứ không đọc được từ khoá. "constant" không phải từ khoá của C, nó chỉ là từ tiếng Anh chỉ khái niệm hằng, viết vào mã sẽ bị xem là tên tự đặt và gây lỗi. "named" cũng không phải từ khoá, nó chỉ là tính từ trong cụm hằng có tên, trình biên dịch không hiểu gì.
7What is the binary representation of 0xA2?4 lựa chọn
A0b01100010
B0b10100010
C0b10010010
D0b10110010
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "0b10100010". Một chữ số thập lục phân ứng gọn với bốn bit nên đổi 0xA2 chỉ cần đổi riêng từng chữ: chữ A là 10 nên thành 1010, chữ 2 thành 0010, ghép lại được 10100010, đúng tám bit của một byte. Kiểm lại bằng giá trị: 0xA2 là 162, mà 128+32+2 cũng bằng 162. "0b01100010" là 98, ứng với 0x62, tức đã đọc chữ A thành 6. "0b10010010" là 146, ứng với 0x92, sai ở nhóm bốn bit cao vì 1001 là 9 chứ không phải 10. "0b10110010" là 178, ứng với 0xB2, vì nhóm bit cao 1011 là 11, lệch một đơn vị so với 10.
8What does the following program display?4 lựa chọncó code
#include <stdio.h>
int main() {
int a[5] = {1, 2, 3};
printf("%d %d %d %d %d", a[0], a[1], a[2], a[3], a[4]);
return 0;
}A1 2 3 0 0
B1 2 3 4 5
C1 2 3 a[3] a[4]
DAn error will be raised.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "1 2 3 0 0". Khi danh sách khởi tạo có ít phần tử hơn kích thước mảng, C điền ba giá trị đã cho vào a[0], a[1], a[2] rồi khởi tạo toàn bộ phần còn lại bằng 0, đúng theo quy tắc khởi tạo thiếu của ngôn ngữ, nên a[3] và a[4] đều bằng 0 chứ không phải rác. "1 2 3 4 5" sai vì ngôn ngữ không suy diễn quy luật tăng dần từ ba số đầu, nó chỉ biết điền 0. "1 2 3 a[3] a[4]" sai vì printf với %d in giá trị của biểu thức, không bao giờ in lại tên phần tử; tên chỉ tồn tại trong mã nguồn, sau khi dịch không còn. "An error will be raised." sai vì khởi tạo thiếu phần tử là hợp lệ hoàn toàn, trình biên dịch không báo lỗi.
9Which statements are correct when copying string s1 into s2 manually?(Choose 2 correct answers)4 lựa chọn
AUses array indexing
BUses pointer arithmetic
CRequires memory allocation
DWorks without checking for buffer overflow
Lời giải
Mở trang câu hỏi này →Đáp án đúng gồm hai ý: "Uses array indexing" và "Uses pointer arithmetic". Chép chuỗi bằng tay nghĩa là tự viết vòng lặp chuyển từng ký tự của s1 sang s2 cho tới khi gặp ký tự rỗng kết thúc, rồi đặt ký tự rỗng cho s2; vòng lặp đó có đúng hai cách cài đặt tương đương trong C, hoặc truy cập theo chỉ số kiểu s2[i] = s1[i], hoặc dịch con trỏ kiểu *d++ = *s++, bởi phép lấy chỉ số trong C vốn được định nghĩa qua số học con trỏ. Cần công bố khuyết điểm của đề: câu ghi rõ chọn hai nhưng bản khoá in kèm chỉ tô được một ô. "Requires memory allocation" sai vì s2 là mảng đã có sẵn chỗ từ lúc khai báo, vòng lặp chỉ ghi vào chỗ đó, không gọi malloc. "Works without checking for buffer overflow" nói đúng về sự kiện nhưng đó là khuyết điểm phải tránh của cách làm, không phải cách chép chuỗi; nếu s1 dài hơn s2 thì chương trình ghi tràn và hỏng bộ nhớ.
10Which condition increases the word count in a sentence?4 lựa chọncó code
#include <stdio.h>
#include <string.h>
int main() {
char s[1000];
int i, count = 0;
printf("Enter a sentence: ");
fgets(s, sizeof(s), stdin);
for (i = 0; s[i] != '\0'; i++) {
if (condition???) {
count++;
}
}
printf("Total words: %d\n", count);
return 0;
}As[i] != ' '
Bs[i] != '\n'
Cs[i] != ' ' && (i == 0 || s[i-1] == ' ')
Ds[i] == ' ' && s[i-1] == ' '
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "s[i] != ' ' && (i == 0 || s[i-1] == ' ')". Đếm từ thực chất là đếm số lần một từ bắt đầu, nên điều kiện phải nhận ra hai việc cùng lúc: ký tự hiện tại không phải khoảng trắng, và chỗ ngay trước nó là ranh giới, tức đang ở đầu chuỗi hoặc ký tự liền trước là khoảng trắng. Nhánh i == 0 đặt trước phép đọc s[i-1] nên nhờ tính rút mạch của toán tử hoặc, chương trình không bao giờ đọc ra ngoài mảng. "s[i] != ' '" sai vì nó cộng một lần cho mỗi ký tự khác khoảng trắng, một từ năm chữ sẽ bị đếm thành năm từ. "s[i] != '\n'" sai nặng hơn, nó so với ký tự xuống dòng nên đếm gần như mọi ký tự, kể cả khoảng trắng. "s[i] == ' ' && s[i-1] == ' '" sai vì nó đếm các cặp khoảng trắng liền nhau, lại còn đọc s[-1] khi i bằng 0, tức truy cập ngoài vùng mảng.
Ax < z && y < z
Bx < z || y < z
Cy > x || y > z
Dy < z && z < x
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "x < z || y < z". Toán tử hoặc chỉ cần một vế đúng là cả biểu thức đúng, nên khi y < z đã đúng thì biểu thức này đúng bất kể x mang giá trị nào; dù vế đầu sai, vế sau vẫn được xét và cho kết quả đúng. "x < z && y < z" chưa chắc đúng vì toán tử và đòi cả hai vế đúng, mà quan hệ giữa x và z thì đề không cho biết. "y > x || y > z" không suy ra được: y > z chắc chắn sai vì đã có y < z, còn y > x thì không có dữ kiện nào bảo đảm. "y < z && z < x" cũng phụ thuộc điều kiện chưa biết, nó đòi thêm z < x mới đúng, nên hoàn toàn có thể sai.
12What will be the output of the following C code?4 lựa chọncó code
#include <stdio.h>
void main()
{
int x = 0;
if (x == 0)
printf("Hi");
else
printf("How are you");
printf("Hello");
}AHi
BHow are you
CHello
DHiHello
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "HiHello". Nhánh if và nhánh else khi không có ngoặc nhọn chỉ ôm đúng một lệnh ngay sau nó, nên nhánh else chỉ nhận lệnh in How are you; lệnh in Hello nằm ngoài cả hai nhánh dù được thụt vào cho giống thân else, bởi phạm vi khối trong C do ngoặc nhọn quyết định, không do thụt lề. x bằng 0 nên điều kiện x == 0 đúng, chương trình in Hi, bỏ qua nhánh else, rồi chạy tiếp lệnh in Hello; printf không tự xuống dòng nên hai chuỗi dính liền thành một dòng. "Hi" sai vì bỏ sót lệnh in nằm ngoài khối, lệnh đó luôn chạy. "How are you" sai vì nhánh else không chạy khi điều kiện đã đúng. "Hello" sai vì lệnh in Hi vẫn chạy trước đó.
13What does a variable store in memory?4 lựa chọn
ACompiler instructions
BDebug information
CBinary data
DMemory addresses of other programs
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "Binary data". Biến là một vùng ô nhớ được đặt tên, mà bộ nhớ chỉ lưu được các bit, nên mọi thứ nằm trong biến đều là dữ liệu nhị phân; kiểu của biến chỉ là cách trình biên dịch quy định đọc dãy bit đó thành số nguyên, số thực hay ký tự. "Compiler instructions" sai vì chỉ thị dành cho trình biên dịch tồn tại trong mã nguồn và biến mất sau khi dịch, chúng không được lưu vào biến lúc chạy. "Debug information" sai vì thông tin gỡ lỗi nằm ở các phần riêng của tệp thực thi do trình biên dịch sinh ra, không nằm trong biến của chương trình. "Memory addresses of other programs" sai vì một biến con trỏ chỉ giữ địa chỉ trong không gian nhớ của chính tiến trình này; hệ điều hành không cho chương trình này chạm vào vùng nhớ của chương trình khác.
AA "for" loop is used for iterating over a sequence of elements, while a "while" loop is used to execute a block of code repeatedly as long as a condition is true.
BA "for" loop is primarily used for conditional statements, while a "while" loop is designed for sequential processing.
CThe use of "for" and "while" loops is interchangeable; there is no substantial difference between them.
DA "for" loop is exclusively used with arrays, while a "while" loop is used with numerical calculations.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "A "for" loop is used for iterating over a sequence of elements, while a "while" loop is used to execute a block of code repeatedly as long as a condition is true." Hai cấu trúc đều là vòng lặp và về lý thuyết thay nhau được, nhưng khuôn dạng quyết định chỗ dùng tự nhiên: vòng for gom khởi tạo, kiểm tra và cập nhật vào một dòng nên hợp với việc duyệt một dãy có số bước biết trước; vòng while chỉ có điều kiện nên hợp với việc lặp tới khi một điều kiện đổi, chẳng hạn chờ người dùng nhập đúng. "A "for" loop is primarily used for conditional statements, while a "while" loop is designed for sequential processing." sai vì câu điều kiện là việc của if và switch, vòng for không phải cấu trúc rẽ nhánh. Nhận định rằng hai khuôn lặp dùng thay nhau được và "there is no substantial difference between them" sai ở chỗ phủ nhận khác biệt, trong khi khác biệt về cú pháp và thói quen dùng là có thật. "A "for" loop is exclusively used with arrays, while a "while" loop is used with numerical calculations." sai vì vòng for chạy được với mọi biến đếm, không giới hạn ở mảng.
A
IdentificationB
NameC
DeclarationD
DefinitionLời giải
Mở trang câu hỏi này →Đáp án đúng: "Declaration". Khai báo là câu lệnh cho trình biên dịch biết một tên sẽ tồn tại và mang kiểu gì; nhờ có kiểu, trình biên dịch mới biết dành bao nhiêu byte và hiểu dãy bit ấy theo nghĩa nào, nên thuật ngữ chỉ việc nêu đồng thời kiểu và tên chính là khai báo. "Identification" không phải thuật ngữ của C cho việc này; từ gần nó là identifier, chỉ riêng cái tên do người viết đặt. "Name" chỉ nói tới phần tên, không mang thông tin kiểu, nên không đủ để trình biên dịch làm việc. "Definition" là bước mạnh hơn, nó vừa khai báo vừa cấp chỗ thật trong bộ nhớ hoặc viết thân hàm; với hàm thì nguyên mẫu đặt ở đầu tệp là khai báo, còn phần thân mới là định nghĩa.
AIt improves code portability
BIt makes the code shorter
CIt prevents the use of symbolic names
DIt increases code complexity
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "It improves code portability". Giá trị thần bí nằm rải rác trong mã là nguồn lỗi khi phải chuyển chương trình sang môi trường khác; đặt tên cho nó bằng #define thì mọi nơi dùng chung một chỗ sửa, nên khi kích thước bộ đệm hay giới hạn của một kiểu thay đổi theo máy, chỉ cần sửa một dòng là cả chương trình thích ứng. "It makes the code shorter" sai vì tên có nghĩa thường dài hơn con số nó thay; lợi ích nằm ở chỗ dễ đọc và sửa một nơi, không ở số ký tự. "It prevents the use of symbolic names" sai ngược hẳn, bởi #define chính là công cụ tạo ra tên tượng trưng. "It increases code complexity" sai vì thay con số vô nghĩa bằng tên nói rõ ý làm mã dễ hiểu hơn, độ phức tạp giảm chứ không tăng.
17What will be the result of the following expression?
"int a = 8, b = 6, c = 4, b++ * ++c + --a;"5 lựa chọn
A16
B28
C37
D32
E-28
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "37". Với a bằng 8, b bằng 6, c bằng 4, biểu thức b++ * ++c + --a chạy như sau: b++ dùng giá trị cũ 6 rồi mới tăng b lên 7; ++c tăng c thành 5 rồi dùng 5; --a giảm a thành 7 rồi dùng 7; phép nhân làm trước phép cộng nên kết quả là 6 nhân 5 cộng 7, tức 37. Cốt lõi là hậu tố trả về giá trị trước khi tăng, còn tiền tố trả về giá trị sau khi tăng. "16" không thể ra được vì riêng phép nhân đã ít nhất 6 nhân 4 là 24, cộng thêm số dương thì càng xa. "28" ứng với việc lấy b sau khi tăng là 7 nhân c trước khi tăng là 4 rồi bỏ hẳn hạng tử --a. "32" ứng với việc bỏ qua cả hai toán tử tăng, tính 6 nhân 4 cộng 8. "-28" đòi một hạng tử âm, mà cả ba biến đều dương nên không phép nào sinh ra dấu trừ.
18What is the output?4 lựa chọncó code
int a = 8;
int b = 3;
int result = a % b * 2;
printf("%d", result);A2
B4
C1
D5
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "4". Phép lấy dư và phép nhân cùng mức ưu tiên nên biểu thức a % b * 2 được tính từ trái sang phải: 8 % 3 cho 2 vì 8 chia 3 được 2 dư 2, rồi 2 nhân 2 cho 4, nên chương trình in 4. Thứ tự này là bản chất của ngôn ngữ, không phải quy ước toán học quen tay. "2" là giá trị của riêng 8 % 3, tức bỏ mất phép nhân 2 phía sau. "1" ứng với việc chia kết quả cho 2 bằng phép chia nguyên thay vì nhân, hoặc hiểu sai phần dư của 8 cho 3. "5" ứng với việc coi dấu phần trăm là phép trừ, lấy 8 trừ 3; trong C dấu đó chỉ có nghĩa lấy phần dư của phép chia nguyên và chỉ dùng được với toán hạng nguyên.
19In a C program, what happens if none of the conditions in an if-else statement are true?4 lựa chọn
AThe program will skip the if-else block and continue with the next statement.
BThe program will raise an error.
CThe else if block will be executed.
DThe program will terminate abruptly.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "The program will skip the if-else block and continue with the next statement." Cấu trúc if không bắt buộc có nhánh else trần; nếu mọi điều kiện đều sai và không có nhánh nào không điều kiện, luồng điều khiển chỉ đi qua cả chuỗi mà không chạy nhánh nào, rồi tiếp tục ở lệnh ngay sau cấu trúc. "The program will raise an error." sai vì điều kiện sai là tình huống bình thường của chương trình, không phải lỗi. "The else if block will be executed." sai vì nhánh else if cũng có điều kiện riêng, mà đề đã nói mọi điều kiện đều sai nên nhánh đó không chạy. "The program will terminate abruptly." sai vì không có lệnh kết thúc nào được gọi, chương trình chạy tiếp bình thường.
20What will the following program output?4 lựa chọncó code
#include <stdio.h>
int main()
{
int a = -5;
switch ((a > 0) - (a < 0)) {
case 1:
printf("a is an positive number.");
break;
case -1:
printf("a is an negative number.");
break;
default:
printf("a is zero.");
}
return 0;
}Aa is an positive number.
Ba is an negative number.
Ca is zero.
DAn error will be raised.
Lời giải
Mở trang câu hỏi này →Đáp án đúng: "a is an negative number." a bằng -5 nên phép so sánh a > 0 cho 0 và a < 0 cho 1; biểu thức chọn nhánh là 0 trừ 1, tức -1, và switch so khớp với nhãn case -1 nên in ra câu nói a là số âm rồi break thoát. Mẹo (a > 0) - (a < 0) chính là hàm dấu, nó dựa vào bản chất của C là phép so sánh trả về số nguyên 1 hoặc 0 chứ không trả về kiểu luận lý riêng. "a is an positive number." đòi biểu thức bằng 1, chỉ xảy ra khi a dương. "a is zero." là nhánh default, chỉ chạy khi hiệu bằng 0, tức khi a bằng 0. "An error will be raised." sai vì switch chỉ cần một biểu thức nguyên, nhãn case mang giá trị âm hoàn toàn hợp lệ.