PRF192Chưa đoKỳ 1Cơ sở ngành Cập nhật 2 ngày trước

PRF192 - Cơ sở lập trình

PRF192 - Cơ sở lập trình (Programming Fundamentals) là môn học 3 tín chỉ của Đại học FPT, dạy cách giải quyết bài toán thực tế bằng máy tính thông qua ngôn ngữ C, với trọng tâm là thiết kế chương trình hướng hàm, mô-đun hoá, kiểm thử và kỷ luật lập trình. Nội dung môn học bao quát trọn bộ chương trình 60 buổi theo chín chuẩn đầu ra CLO1 đến CLO9. Nội dung gồm: máy tính và phần mềm (khái niệm cơ bản về hệ thống máy tính, các bước phát triển phần mềm, quy trình mã nguồn - biên dịch - liên kết - thực thi, cấu trúc một chương trình C với chỉ thị tiền xử lý #include, hàm main, dấu chấm phẩy kết thúc câu lệnh, chú thích, trình biên dịch và môi trường DevC++); biến, kiểu dữ liệu và biểu thức (khai báo biến và hằng, quy tắc đặt tên định danh, const và #define, các kiểu int, float, double, char và unsigned cùng miền giá trị, nhập xuất bằng scanf và printf với các đặc tả %d %f %c %s, toán tử số học, phép chia nguyên và phép chia lấy dư, toán tử quan hệ, toán tử logic, toán tử trên bit, toán tử gán rút gọn, tăng giảm một đơn vị, trộn kiểu dữ liệu, ép kiểu tường minh và ngầm định, độ ưu tiên và tính kết hợp); cấu trúc điều khiển (rẽ nhánh if, if-else, if lồng nhau, thang else-if, switch-case với break và default; vòng lặp for, while, do-while, break và continue, vòng lặp lồng nhau; phong cách lập trình với thụt lề, đặt tên có nghĩa và chú thích); mô-đun hoá và hàm (mô-đun là gì và vì sao phải mô-đun hoá, tính kết dính cao và ghép nối lỏng, nguyên tắc định nghĩa mô-đun, định nghĩa hàm với kiểu trả về và danh sách tham số, nguyên mẫu hàm, lời gọi hàm, truyền tham số theo giá trị, phân biệt hàm thư viện với hàm tự viết, phạm vi và thời gian sống của biến cục bộ - toàn cục - static, chương trình dạng menu gọi hàm); con trỏ (khái niệm và công dụng, khai báo con trỏ, toán tử lấy địa chỉ và toán tử truy xuất giá trị, số học con trỏ, con trỏ NULL, truyền tham số theo tham chiếu, quan hệ giữa con trỏ và mảng, cấp phát động bằng malloc, calloc, realloc và free, rò rỉ bộ nhớ); thư viện chuẩn C (stdlib.h, time.h, math.h, ctype.h và vào ra có định dạng); mảng và cấu trúc (mảng một chiều, chỉ số bắt đầu từ 0, mảng hai chiều và ma trận, tìm kiếm tuyến tính, sắp xếp chọn, kiểu struct, truy cập thành viên, mảng struct, typedef); chuỗi ký tự (chuỗi là mảng char kết thúc bằng ký tự null, nhập xuất chuỗi, các hàm trong string.h như strlen, strcpy, strcat, strcmp, mảng chuỗi); và tệp tin (tệp văn bản và tệp nhị phân, con trỏ FILE, fopen với các chế độ mở, fclose, truy cập tuần tự và ngẫu nhiên, fprintf, fscanf, fgets, fputs, fread, fwrite, fseek, ftell, feof).

266Câu hỏi
7Bộ đề
9Chủ đề

Câu hỏi của môn

104/266 câuCòn 162
AArrays provide constant-time access to elements.
BArrays allow for dynamic resizing during runtime.
CArrays can store elements of different data types.
DArrays automatically adjust their size based on the number of elements.
Lời giải
Đáp án đúng: "Arrays provide constant-time access to elements.". Mảng chiếm một dải ô nhớ liên tục và mọi phần tử cùng một kiểu nên cùng kích thước; nhờ vậy địa chỉ phần tử thứ i tính ra ngay bằng địa chỉ đầu cộng i nhân kích thước một phần tử, một phép tính không phụ thuộc vào i, tức là thời gian truy xuất là hằng số. Ý "Arrays allow for dynamic resizing during runtime." sai vì mảng khai báo tĩnh có kích thước cố định từ lúc dịch, muốn thay đổi dung lượng thì phải tự cấp vùng nhớ động rồi gọi realloc, và đó không còn là mảng ban đầu nữa. Ý "Arrays can store elements of different data types." sai vì mảng đòi hỏi các phần tử đồng kiểu, chính điều đó mới cho phép tính địa chỉ bằng một bước nhảy cố định. Ý "Arrays automatically adjust their size based on the number of elements." sai vì số phần tử ghi trong khai báo là bất biến; khởi tạo thiếu giá trị thì phần còn lại nhận 0 chứ mảng không tự co lại hay nở ra.
Mở trang câu hỏi này →
ATrue
B1
C0
D-1
Lời giải
Đáp án đúng: "0". Hàm strcmp so sánh hai chuỗi theo từng cặp ký tự dựa trên mã của chúng và trả về một số nguyên thể hiện quan hệ thứ tự: âm khi chuỗi thứ nhất bé hơn, dương khi lớn hơn, và đúng 0 khi hai chuỗi trùng nhau tới ký tự kết thúc. Vì thế phép thử hai chuỗi giống nhau phải viết là strcmp bằng 0, một cách diễn đạt thoạt nghe trái trực giác. Ý "True" sai vì strcmp trả về int, trong C không có giá trị nào mang tên như vậy; hơn nữa đem kết quả dùng trực tiếp làm điều kiện thì hai chuỗi bằng nhau lại bị coi là sai. Ý "1" sai vì giá trị dương chỉ xuất hiện khi chuỗi thứ nhất lớn hơn, và chuẩn cũng không hứa đúng con số 1. Ý "-1" sai vì giá trị âm ứng với trường hợp chuỗi thứ nhất bé hơn, chuẩn chỉ hứa dấu chứ không hứa độ lớn.
Mở trang câu hỏi này →
87What is the main() function in C?4 lựa chọn
AIt is the function where the program's execution starts.
BEvery program has exactly one main function.
CThe main function always returns an integer value or void.
DAll answers are correct.
Lời giải
Đáp án đúng: "All answers are correct.". Cả ba nhận định còn lại đều nói về cùng một hàm và đều đúng: main là nơi quá trình thực thi bắt đầu, mỗi chương trình có đúng một hàm main vì nếu không bộ liên kết không biết chọn điểm vào nào, và kiểu trả về của nó là số nguyên theo chuẩn, còn dạng void chỉ được một số trình biên dịch chấp nhận. Ý "It is the function where the program's execution starts." đúng về nội dung nhưng không thể là lựa chọn vì nó bỏ qua hai tính chất kia, chọn nó là bỏ sót phần còn lại của câu trả lời. Ý "Every program has exactly one main function." cũng đúng mà vẫn thiếu, nó không nói gì về điểm khởi đầu hay kiểu trả về. Ý "The main function always returns an integer value or void." đúng theo cách dùng phổ biến nhưng cũng chỉ mô tả một mặt, không đủ bao phủ câu hỏi.
Mở trang câu hỏi này →
88What is the output?4 lựa chọncó code
Đề bài
int x = 0, y = 5;
printf("%d", (x && y));
A1
B5
C-1
D0
Lời giải
Đáp án đúng: "0". Phép và luận lý trong C cho ra kết quả thuộc kiểu int và chỉ nhận một trong hai giá trị 0 hoặc 1, nó không trả lại chính toán hạng. Thêm nữa nó tính tắt: thấy toán hạng bên trái bằng 0, nghĩa là sai, thì cả biểu thức đã chắc chắn sai nên y không cần đọc tới. Vì vậy đặc tả %d in ra 0. Ý "1" sai vì 1 chỉ xuất hiện khi cả hai toán hạng đều khác 0. Ý "5" sai vì nó tưởng phép và trả về giá trị của toán hạng cuối, đó là cách làm của một số ngôn ngữ khác chứ không phải của C. Ý "-1" sai vì chuẩn quy định kết quả của các phép luận lý chỉ là 0 hoặc 1, không bao giờ là số âm.
Mở trang câu hỏi này →
A'\0'
B'\n'
C'\t'
D'\'
Lời giải
Đáp án đúng: "'\0'". Chuỗi trong C không mang theo độ dài, nó chỉ là một dãy ký tự nằm liên tục và kết thúc bằng một byte giá trị 0; mọi hàm như strlen, strcpy hay printf với đặc tả %s đều dò tới byte đó để biết chỗ dừng. Đây là lý do mảng chứa chuỗi phải khai báo thừa một ô so với số ký tự thật. Ý "'\n'" sai vì đó là ký tự xuống dòng, nó chỉ là một ký tự nội dung bình thường có thể nằm giữa chuỗi. Ý "'\t'" sai vì đó là ký tự tab, cũng là nội dung chứ không phải dấu kết thúc. Ý "'\'" sai vì cách viết này còn không hợp lệ: dấu gạch chéo ngược mở đầu một chuỗi thoát nên muốn biểu diễn chính nó phải viết gấp đôi.
Mở trang câu hỏi này →
ATo determine the value of a variable.
BTo determine the type of a variable.
CTo determine the size (in bytes) occupied by a variable or type.
DTo determine the address of a variable.
Lời giải
Đáp án đúng: "To determine the size (in bytes) occupied by a variable or type.". Toán tử sizeof cho biết số byte mà một đối tượng hay một kiểu chiếm trong bộ nhớ, và nó được tính ngay lúc dịch chứ không phải lúc chạy, vì trình biên dịch đã biết trọn vẹn cách bố trí kiểu. Nhờ nó mà các lời gọi malloc hay realloc viết được theo kiểu dữ liệu, không phải ghi cứng con số byte vốn khác nhau giữa các nền tảng. Ý "To determine the value of a variable." sai vì sizeof không hề đọc giá trị, áp nó lên một biến chưa khởi tạo vẫn ra kết quả đúng. Ý "To determine the type of a variable." sai vì nó trả về một con số, mà hai kiểu khác nhau vẫn có thể cùng kích thước nên con số đó không nhận dạng được kiểu. Ý "To determine the address of a variable." sai vì muốn lấy địa chỉ phải dùng toán tử lấy địa chỉ, sizeof không liên quan tới vị trí của biến.
Mở trang câu hỏi này →
91Assume 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 →
94What 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 →
95What 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 →
96What 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 →
97What 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 →
98What 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 →
Aint number = 10;
Bint number == 10;
Cint number : 10;
Dint number 10;
Lời giải
Đáp án đúng: "int number = 10;". Một khai báo kèm khởi tạo trong C gồm tên kiểu, tên biến, dấu bằng đơn và giá trị, kết thúc bằng dấu chấm phẩy; dấu bằng đơn ở đây là phép gán, nó ghi giá trị vào ô nhớ vừa được dành ra cho biến. Ý "int number == 10;" sai vì hai dấu bằng là phép so sánh, đặt nó vào chỗ khởi tạo khiến trình biên dịch gặp một toán tử không được phép trong khai báo và báo lỗi cú pháp. Ý "int number : 10;" sai vì dấu hai chấm không phải toán tử gán, nó chỉ xuất hiện trong nhãn, trong toán tử điều kiện hoặc trong khai báo trường bit của cấu trúc. Ý "int number 10;" sai vì thiếu hẳn toán tử gán: trình biên dịch đọc xong tên biến lại thấy một hằng số nên không ghép được thành câu lệnh nào.
Mở trang câu hỏi này →
AA module performs its tasks independently.
BA module shares performance with other modules.
CA module accesses global data.
DA module depends on many other modules.
Lời giải
Đáp án đúng: "A module performs its tasks independently.". Mức liên kết giữa các mô đun đo xem một mô đun phải biết và phải dựa vào bao nhiêu thứ bên ngoài để làm xong việc của nó. Liên kết thấp nghĩa là mô đun nhận dữ liệu qua tham số, trả kết quả qua giá trị trả về và tự lo phần việc của mình, nhờ vậy sửa hay thay nó không kéo theo sửa chỗ khác. Ý "A module shares performance with other modules." sai vì chia sẻ phần xử lý với nhiều mô đun khác làm tăng số đường phụ thuộc, đó là liên kết cao. Ý "A module accesses global data." sai vì dữ liệu toàn cục là kênh ngầm giữa các mô đun, ai cũng sửa được nên không ai dám đoán trạng thái, đây là dạng liên kết đặc biệt khó tháo. Ý "A module depends on many other modules." sai vì nó chính là định nghĩa của liên kết cao, trái hẳn điều câu hỏi đang hỏi.
Mở trang câu hỏi này →
102What will be the output of the following C code?4 lựa chọncó code
Đề bài
#include <stdio.h>
int main() {
    int x = 5, y = 10;

    if (x >= y) {
        printf("x is greater than or equal to y\n");
    } else {
        printf("x is less than y\n");
    }
    return 0;
}
Ax is greater than or equal to y
Bx is less than y
Cx is equal to y
DCompilation error
Lời giải
Đáp án đúng: "x is less than y". Điều kiện so sánh x lớn hơn hoặc bằng y được tính với x bằng 5 và y bằng 10; 5 không lớn hơn mà cũng không bằng 10 nên biểu thức cho 0, tức là sai, vì thế khối sau if bị bỏ qua và khối sau else được chạy. Chỉ một trong hai khối được chạy, đó là bản chất của cấu trúc rẽ nhánh hai đường. Ý "x is greater than or equal to y" sai vì đó là chuỗi nằm trong khối chỉ chạy khi điều kiện đúng, điều không xảy ra với bộ giá trị này. Ý "x is equal to y" sai vì trong mã không có chuỗi nào như vậy, chương trình chỉ in được một trong hai chuỗi đã viết sẵn. Ý "Compilation error" sai vì mọi biến đều được khai báo, hai khối đều có cặp ngoặc nhọn đầy đủ và các lời gọi printf đều hợp lệ.
Mở trang câu hỏi này →
Aif (strcmp(s1, s2) >= 0)
Bif (strcmp(s1, s2) < 0)
Cif (strlen(s1) >= strlen(s2))
Dif (s1 >= s2)
Lời giải
Đáp án đúng: "if (strcmp(s1, s2) >= 0)". Thứ tự giữa hai chuỗi trong C do strcmp quyết định: hàm này so từng cặp ký tự theo mã, dừng ở chỗ đầu tiên khác nhau và trả về số dương khi chuỗi thứ nhất lớn hơn, số âm khi bé hơn, 0 khi trùng nhau; vậy điều kiện lớn hơn hoặc bằng tương ứng với kết quả không âm. Ý "if (strcmp(s1, s2) < 0)" sai vì nó thử điều ngược lại, chuỗi thứ nhất bé hơn. Ý "if (strlen(s1) >= strlen(s2))" sai vì nó chỉ đo độ dài, trong khi thứ tự từ điển phụ thuộc nội dung từng ký tự; một chuỗi dài hơn vẫn có thể bé hơn. Ý "if (s1 >= s2)" sai vì tên mảng chuỗi được chuyển thành địa chỉ phần tử đầu, nên phép so sánh đó đối chiếu hai địa chỉ trong bộ nhớ, không liên quan gì tới nội dung.
Mở trang câu hỏi này →
A1 byte
B2 bytes
C4 bytes
D8 bytes
Lời giải
Đáp án đúng: "4 bytes". Kiểu float được hiện thực theo dạng dấu phẩy động độ chính xác đơn của chuẩn IEEE 754, gồm 1 bit dấu, 8 bit số mũ và 23 bit phần định trị, cộng lại đúng 32 bit tức 4 byte; đây là kích thước trên mọi nền tảng phổ thông, và cách kiểm chắc chắn nhất vẫn là in sizeof của kiểu. Ý "1 byte" sai vì đó là kích thước của char, chuẩn quy định sizeof của char luôn bằng 1. Ý "2 bytes" sai vì đó là kích thước thường gặp của short, một kiểu nguyên chứ không phải kiểu thực. Ý "8 bytes" sai vì đó là độ chính xác kép, tức kiểu double; chính vì double rộng gấp đôi nên nó giữ được nhiều chữ số có nghĩa hơn float.
Mở trang câu hỏi này →