Ngân hàng câu hỏi của chương

Câu hỏi: PRF192 - Phần 6: Thư viện chuẩn C và vào ra có định dạng

28 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 theo thứ tự nhập vào ngân hàng. Trang 2/2 — câu 21–28.

Danh sách câu hỏi

28/28 câuHết danh sách
Aputc(s)
Bputs(s)
Cprintf(s)
Dprintf("%s",s)
Lời giải
Đáp án đúng gồm hai ý: "putc(s)" và "printf(s)". Hàm putc được khai báo để ghi một ký tự ra một dòng xuất, nên nó cần hai đối số là ký tự và dòng đích; đưa cho nó một chuỗi vừa thiếu đối số vừa sai kiểu, và dù có dịch được thì nó cũng chỉ xuất một ký tự. Còn cách gọi printf với chuỗi dữ liệu đặt ở vị trí chuỗi định dạng thì hễ trong chuỗi có dấu phần trăm, printf sẽ hiểu đó là đặc tả chuyển đổi rồi đi đọc đối số không tồn tại, sinh ra kết quả sai hoặc sự cố; đây là lỗi chuỗi định dạng kinh điển. Lựa chọn "puts(s)" là cách xuất chuỗi đúng và gọn, nó còn tự thêm ký tự xuống dòng. Lựa chọn "printf("%s",s)" cũng đúng vì chuỗi định dạng là hằng do người viết kiểm soát, còn dữ liệu được đặt đúng vị trí đối số.
Mở trang câu hỏi này →
22What will be the output of the following C code?4 lựa chọncó code
Đề bài
#include <stdio.h>
void main()
{
    int i = 10, j = 3, k = 3;
    printf("%d %d ", i, j, k);
}
ACompile time error
B10 3 3
C10 3
D10 3 somegarbage value
Lời giải
Đáp án đúng: "10 3". Hàm printf nhận số đối số thay đổi nên nó không kiểm tra số lượng lúc dịch; chính chuỗi định dạng quyết định lấy ra bao nhiêu giá trị. Ở đây chuỗi chỉ có hai đặc tả nên printf lấy i và j, in 10 rồi 3 kèm khoảng trắng, còn k vẫn được tính nhưng bị bỏ qua hoàn toàn. Chuẩn C cho phép truyền thừa đối số; chỉ truyền thiếu mới là hành vi không xác định. Lựa chọn "Compile time error" sai vì thừa đối số nhiều lắm chỉ bị cảnh báo, và dạng main trả về void dù phi chuẩn vẫn được nhiều trình dịch nhận. Lựa chọn "10 3 3" đòi chuỗi định dạng phải có ba đặc tả. Lựa chọn "10 3 somegarbage value" hiểu sai cơ chế: đối số thừa không bị in ra dưới dạng rác, nó chỉ nằm lại trong vùng tham số và không ai đọc tới.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    int quantity;
        double cost;
        printf("Enter the number of apples desired: ");
        scanf("%d", &quantity);
        printf("Now enter the cost of one apple (in $): ");
        scanf("%lf", &cost);
        printf("That will cost $%.2lf\n", quantity * cost);
    return 0;
}
AThat will cost $2.00
BThat will cost $2.000000
CThat will cost $2.0000
DThat will cost $2
Lời giải
Đáp án đúng: "That will cost $2.00". Lệnh scanf với %d nạp 4 vào quantity, rồi %lf nạp 0.5 vào cost. Biểu thức quantity * cost nâng số nguyên 4 lên double trước khi nhân, cho 2.0. Chuỗi định dạng viết %.2lf, nghĩa là in dạng thập phân với đúng hai chữ số sau dấu chấm, nên giá trị 2.0 hiện ra là 2.00. Thụt lề lệch trong thân main không ảnh hưởng gì vì C chỉ đọc dấu chấm phẩy và ngoặc nhọn. Dòng "That will cost $2.000000" là thứ printf in khi dùng %f trần, tức độ chính xác mặc định sáu chữ số, nhưng ở đây độ chính xác đã bị chỉ định là hai. Dòng "That will cost $2.0000" đòi bốn chữ số, ứng với %.4lf. Dòng "That will cost $2" đòi không chữ số nào sau dấu chấm, ứng với %.0lf, và cũng không phải cách printf in số thực mặc định.
Mở trang câu hỏi này →
AThe getchar() function is defined in the <stdio.h> header file.
Bgetchar() gets a string from stdin.
Cgetchar() retrieves a single character from the standard input stream buffer without translating the input.
Dgetchar() gets a character (an unsigned char) from stdin.
Lời giải

Đáp án đúng: "getchar() gets a string from stdin." Câu hỏi tìm phát biểu sai, và đây đúng là phát biểu sai: getchar không đọc chuỗi, nó lấy đúng một ký tự rồi trả về dưới dạng int để còn chỗ cho giá trị báo hết tệp; muốn đọc cả dòng phải dùng fgets. Câu "The getchar() function is defined in the <stdio.h> header file." là phát biểu đúng, hàm thuộc thư viện vào ra chuẩn. Câu "getchar() retrieves a single character from the standard input stream buffer without translating the input." cũng đúng: hàm lấy một ký tự từ vùng đệm của luồng vào chuẩn và không diễn dịch gì thêm. Câu "getchar() gets a character (an unsigned char) from stdin." đúng nốt, vì ký tự đọc được hiểu như unsigned char rồi nâng lên int. Ba phát biểu đúng ấy không thể là thứ câu hỏi đang tìm.

Mở trang câu hỏi này →
A-6 and 5.
B-5 and 5.
C-6 and 6.
D-5 and 6.
Lời giải
Đáp án đúng: "-6 and 5." Hàm floor của thư viện toán lấy số nguyên lớn nhất không vượt quá đối số, tức luôn làm tròn xuống phía âm vô cực, chứ không cắt phần thập phân và cũng không làm tròn về số gần nhất. Với -5.9, các số nguyên không vượt quá nó là -6, -7 và nhỏ hơn, lớn nhất trong đó là -6. Với 5.9, số nguyên lớn nhất không vượt quá là 5. Cặp "-5 and 5." là kết quả của phép cắt phần thập phân, tức hành vi của ép kiểu sang int, và với số âm nó cho giá trị lớn hơn floor. Cặp "-6 and 6." trộn floor cho số âm với ceil cho số dương. Cặp "-5 and 6." chính là làm tròn ra xa số không, không phải floor. Cần nhớ floor trả về double, nên in bằng %f sẽ thấy -6.000000 và 5.000000.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main(){
    int n =12, re;float x, y;
    printf("input =");
    re = scanf("%d%f%f",&n,&x,&y);
    printf("%d, %d, %f",n, re, x);
}
A2, 2, 2.5
B2, 3, 2.5
C2, 2, 0.5
D2, 3, 0.5
Lời giải
Đáp án đúng: "2, 3, 0.5". Dãy ký tự nhập là 2.5 rồi dấu cách rồi 3.6, nhưng scanf đọc theo đặc tả chứ không theo cách con người đọc. Đặc tả %d chỉ nhận chữ số nên nó lấy 2 rồi dừng ngay trước dấu chấm, n thành 2. Đặc tả %f tiếp tục từ dấu chấm, đọc .5 thành số thực 0.5 cho x. Đặc tả %f thứ hai bỏ qua dấu cách rồi đọc 3.6 cho y. Cả ba chuyển đổi đều thành công nên scanf trả về 3, giá trị gán cho re. Dãy "2, 2, 2.5" đếm thiếu một chuyển đổi và coi như %f đã lấy trọn 2.5. Dãy "2, 3, 2.5" đúng số chuyển đổi nhưng vẫn gán 2.5 cho x, điều không thể vì phần nguyên đã bị %d lấy mất. Dãy "2, 2, 0.5" đúng x nhưng báo chỉ hai chuyển đổi, trong khi y cũng được nạp từ 3.6.
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 →
Đề 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 →