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

164/266 câuCòn 102
ACreate a file named employee.dat. The address of the newly created file is assigned to the file pointer fp.
BOpen a file named employee.dat to read data. If the file exists, the address of the file is assigned to the file pointer fp.
COpen a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.
DOpen a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp and all existing data will be overwritten. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.
Lời giải
Đáp án đúng: "Open a file named employee.dat to append data to the end of the file. If the file exists, the address of the file is assigned to the file pointer fp. If the file does not exist, a new file named employee.dat will be created and its address will be assigned to fp.". Chế độ nối của fopen giữ nguyên nội dung cũ và đặt mọi lần ghi xuống cuối tệp, còn tệp chưa có thì thư viện tạo mới; giá trị trả về là con trỏ tới cấu trúc mô tả dòng tệp, hoặc con trỏ rỗng khi mở thất bại. Mô tả "Create a file named employee.dat." nói như thể luôn tạo tệp mới, bỏ mất trường hợp tệp đã tồn tại và bỏ luôn ý nghĩa ghi nối. Mô tả "Open a file named employee.dat to read data." ứng với chế độ đọc, và chế độ đó còn trả về con trỏ rỗng khi tệp không tồn tại chứ không tạo tệp. Mô tả "all existing data will be overwritten" tự mâu thuẫn với việc nối thêm: xoá sạch nội dung cũ là hành vi của chế độ ghi mới.
Mở trang câu hỏi này →
146What happens in this do/while loop?4 lựa chọncó code
Đề bài
int n;
do {
    printf("Enter a number:");
    scanf("%d", &n);
} while (n < 1 || n > 5);
ANever runs
BRuns only when n = 1
CInfinite loop
DRuns at least once
Lời giải
Đáp án đúng: "Runs at least once". Vòng do-while đặt phép kiểm điều kiện ở cuối, nên thân luôn chạy trọn một lượt trước khi điều kiện được tính lần đầu; ở đây lượt đầu in lời mời rồi đọc n, sau đó mới xét n có nằm ngoài khoảng từ 1 tới 5 hay không để quyết định lặp lại. Đó chính là khuôn mẫu quen dùng để buộc người nhập phải nhập lại cho tới khi hợp lệ. Mô tả "Never runs" trái hẳn với vị trí của phép kiểm, không có đường nào để thân bị bỏ qua. Mô tả "Runs only when n = 1" lẫn chiều điều kiện: n bằng 1 làm điều kiện sai nên vòng lặp dừng, hơn nữa n chỉ có giá trị sau khi thân đã chạy một lượt. Mô tả "Infinite loop" chỉ xảy ra khi người nhập cứ đưa số ngoài khoảng, hoặc nhập chữ làm scanf thất bại và n giữ nguyên giá trị cũ, chứ không phải hành vi mặc định của đoạn mã.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    int a=12, b=5;
    a=a^b;
    b=a^b;
    a=a^b;
    printf("%d %d",a,b);
    return 0;
}
A5 12
B12 5
C9 5
D12 9
Lời giải
Đáp án đúng: "5 12". Phép hoặc loại trừ theo bit tự nghịch đảo, nên ba lệnh liên tiếp đổi chỗ được hai giá trị mà không cần biến tạm. Theo từng bước: a bằng 12 là dãy bit 1100, b bằng 5 là 0101; lệnh thứ nhất cho a thành 1001 tức 9; lệnh thứ hai lấy 1001 với 0101 cho b thành 1100 tức 12, đúng giá trị ban đầu của a; lệnh thứ ba lấy 1001 với 1100 cho a thành 0101 tức 5, đúng giá trị ban đầu của b. Lệnh in xuất a là 5 rồi b là 12. Dãy "12 5" là hai giá trị ban đầu, tức giả định ba lệnh không làm gì. Dãy "9 5" dừng ở trạng thái ngay sau lệnh thứ nhất, lúc a đã thành 9 nhưng b chưa đổi. Dãy "12 9" ghép giá trị ban đầu của a với con số trung gian 9, không ứng với trạng thái nào sau khi cả ba lệnh chạy xong.
Mở trang câu hỏi này →
A120
B121
C122
D123
Lời giải
Đáp án đúng: "123". Mỗi vị trí trong hệ hai mang trọng số là một luỹ thừa của 2, tính từ phải sang trái lần lượt là 1, 2, 4, 8, 16, 32, 64, 128. Dãy 0111 1011 bật các bit trọng số 64, 32, 16, 8, 2 và 1, còn bit trọng số 4 và bit trọng số 128 đều tắt, nên cộng lại được 64 cộng 32 cộng 16 cộng 8 cộng 2 cộng 1 là 123. Giá trị "120" ứng với dãy 0111 1000, tức bỏ sót hai bit thấp nhất đang bật. Giá trị "121" ứng với 0111 1001, chỉ nhận một trong hai bit thấp đó. Giá trị "122" ứng với 0111 1010, nhận bit trọng số 2 mà bỏ bit trọng số 1. Có một cách loại nhanh: bit cuối cùng của dãy đang bật nên số cần tìm phải là số lẻ, vì thế mọi đáp số chẵn đều bị gạt ngay từ đầu.
Mở trang câu hỏi này →
149What does the line scanf("%d", &n); do?4 lựa chọn
AAssign value to n
BPrint n
CRead an integer input
DDeclare n
Lời giải
Đáp án đúng: "Read an integer input". Lời gọi này đọc một số nguyên từ dòng nhập chuẩn: đặc tả %d bỏ qua khoảng trắng dẫn đầu, gom các chữ số thành một số nguyên, rồi ghi số đó vào ô nhớ mà toán tử lấy địa chỉ đã chỉ ra, bởi scanf phải có địa chỉ mới ghi được ra ngoài phạm vi của chính nó. Mô tả "Assign value to n" bỏ mất phần quan trọng nhất là nguồn dữ liệu: giá trị không do chương trình ấn định mà do người dùng nhập, và việc ghi xảy ra qua con trỏ chứ không bằng toán tử gán. Mô tả "Print n" nói ngược chiều dữ liệu, đưa nội dung ra màn hình là việc của printf hoặc puts. Mô tả "Declare n" sai loại câu lệnh: khai báo là dòng nêu tên và kiểu của biến, phải có trước lời gọi này, còn scanf chỉ dùng biến đã tồn tại.
Mở trang câu hỏi này →
A13
B14
C15
D16
Lời giải
Đáp án đúng: "15". Chuỗi trong C không mang theo độ dài, thư viện nhận ra chỗ hết chuỗi nhờ một ký tự có mã 0 đặt ngay sau ký tự cuối, và ký tự đó cũng chiếm trọn một ô của mảng. Mảng khai 16 ô nên nhiều nhất 15 ô dành cho nội dung, ô còn lại để dành cho dấu kết thúc. Giá trị "16" là tổng số ô; dùng hết cho nội dung thì không còn chỗ cho dấu kết thúc, và các hàm như strlen hay printf sẽ đọc tràn sang bộ nhớ bên cạnh. Giá trị "14" trừ đi hai ô, tức đếm thừa một dấu kết thúc, trong khi chuẩn chỉ đòi đúng một ô cho dấu đó. Giá trị "13" trừ ba ô, không khớp với cách tính nào của ngôn ngữ. Chính quy ước này là lý do các hàm như strncpy hay snprintf luôn phải tính thêm một byte cho dấu kết thúc.
Mở trang câu hỏi này →
A1
B0
C-1
D32
Lời giải
Đáp án đúng: "0". Ký tự kết thúc chuỗi, viết trong mã nguồn bằng một dấu thoát đi kèm chữ số 0, có mã số đúng bằng 0 trong bảng mã; nhờ giá trị này mà vòng lặp duyệt chuỗi viết được theo kiểu chạy cho tới khi gặp giá trị sai, vì 0 là giá trị sai duy nhất của một byte. Giá trị "1" là mã của một ký tự điều khiển khác, không mang vai trò kết thúc chuỗi. Giá trị "-1" không phải mã ký tự hợp lệ của bảng mã bảy bit, con số âm này hay bị nhớ lẫn với hằng báo hết tệp mà các hàm đọc trả về. Giá trị "32" là mã của dấu cách, một ký tự hiển thị được và hoàn toàn hợp lệ giữa chuỗi, coi nó là dấu kết thúc thì mọi câu có khoảng trắng đều bị cắt ngắn. Cũng cần phân biệt ký tự mã 0 với chữ số 0, vì chữ số 0 có mã 48.
Mở trang câu hỏi này →
152Given the following code snippet:4 lựa chọncó code
Đề bài
#include <stdio.h>
int main() {
    int a = 5;
    {
        int b = 10;
        printf("%d ", a);
    }
    // Uncommenting the line of code below will be a compilation error.
    // printf("%d", b);
    return 0;
}

Which of the following best describes the scope of a variable declared inside a block in C?

AThe variable b can be accessed only inside the inner block where it's declared.
BThe variable b can be accessed anywhere within main() after its declaration.
CBoth variables a and b can be accessed inside the inner block.
DThe variable b can be accessed globally throughout the program.
Lời giải
Đáp án đúng: "The variable b can be accessed only inside the inner block where it's declared.". Biến khai trong một cặp ngoặc nhọn có phạm vi khối: tên của nó chỉ nhìn thấy được từ chỗ khai báo cho tới dấu ngoặc đóng của khối ấy, và vùng nhớ cũng chỉ sống trong khoảng đó nếu biến không có lớp lưu trữ static. Vì vậy b dùng được bên trong khối nhỏ, còn dòng in nằm sau khối thì không còn tên b nào để tham chiếu nên không dịch được. Mô tả "The variable b can be accessed anywhere within main() after its declaration." nhầm phạm vi khối với phạm vi hàm, trong khi biên thật là dấu ngoặc đóng của khối nhỏ. Mô tả "Both variables a and b can be accessed inside the inner block." nêu một điều đúng về chiều nhìn ra ngoài, nhưng câu hỏi đòi mô tả phạm vi của biến khai trong khối nên nó không trả lời đúng chỗ. Mô tả "The variable b can be accessed globally throughout the program." chỉ đúng với biến khai ở mức tệp, nằm ngoài mọi hàm.
Mở trang câu hỏi này →
A1 byte
B2 bytes
C4 bytes
DIt depends on the system
Lời giải
Đáp án đúng: "1 byte". Chuẩn C định nghĩa byte là đơn vị nhớ nhỏ nhất đánh địa chỉ được, rồi quy định kích thước của kiểu char luôn bằng 1 theo đúng nghĩa đó; mọi kích thước khác trong ngôn ngữ đều đo bằng số lần kích thước của char, nên con số 1 không phụ thuộc máy. Giá trị "2 bytes" ứng với kiểu ký tự rộng dùng cho bảng mã nhiều byte trên một số nền tảng, không phải char. Giá trị "4 bytes" là kích thước quen thuộc của int trên máy hiện nay, không liên quan tới ký tự. Mô tả "It depends on the system" nghe có lý vì int hay long thật sự đổi kích thước theo nền tảng, nhưng với char thì không: thứ đổi theo máy là số bit trong một byte, tối thiểu là 8 và có thể hơn trên phần cứng đặc biệt, còn kích thước tính theo byte của char vẫn luôn bằng 1.
Mở trang câu hỏi này →
154What does the following program display?4 lựa chọncó code
Đề bài
#include <stdio.h>
int main()
{
    int x[] = {1, 2, 3, 4, 5};
    int y = 1;
    printf("%d", x[y]);

    return 0;
}
A2
B3
C4
DAn error will be raised.
Lời giải
Đáp án đúng: "2". Mảng x được khởi tạo với năm giá trị và chỉ số đếm từ 0, nên x[0] là 1, x[1] là 2, x[2] là 3 rồi tiếp tục như thế; biến y bằng 1 nên x[y] chính là x[1], tức giá trị 2, và đặc tả %d in ra số nguyên đó. Bản chất của phép truy cập mảng là cộng địa chỉ: tên mảng cho địa chỉ ô đầu, chỉ số được nhân với kích thước một phần tử rồi cộng vào, vì vậy chỉ số 1 trỏ tới ô thứ hai. Giá trị "3" là x[2], tức cách đọc theo kiểu đếm từ 1 mà C không dùng. Giá trị "4" là x[3], lệch hai ô so với chỉ số đang dùng. Kết luận "An error will be raised." không đúng: mảng có năm ô nên chỉ số 1 nằm gọn trong dải hợp lệ; mà ngay cả khi chỉ số vượt biên thật, C cũng không báo lỗi mà lặng lẽ đọc vùng nhớ bên cạnh.
Mở trang câu hỏi này →
155What does this code do?4 lựa chọncó code
Đề bài
char names[10][31];
gets(names[0]);
ATakes a line of input into names[0]
BTakes input into all 10 strings
CFails to compile
DOnly stores 1 character
Lời giải
Đáp án đúng: "Takes a line of input into names[0]". Khai báo names là mảng hai chiều gồm 10 hàng, mỗi hàng 31 ô ký tự, nên names[0] là hàng đầu tiên và khi dùng trong biểu thức nó suy biến thành con trỏ tới ký tự đầu của hàng ấy. Hàm gets đọc một dòng từ dòng nhập chuẩn, bỏ ký tự xuống dòng rồi đặt dấu kết thúc chuỗi, nên nội dung người dùng nhập nằm trong hàng đầu. Mô tả "Takes input into all 10 strings" cần một vòng lặp gọi mười lần, còn một lời gọi chỉ ghi vào đúng hàng được truyền. Mô tả "Fails to compile" không đúng về cú pháp: dòng mã hợp lệ và kiểu đối số khớp, dù phải biết rằng gets đã bị loại khỏi chuẩn từ bản năm 2011 vì không chặn được tràn khi dòng nhập dài hơn 30 ký tự. Mô tả "Only stores 1 character" lẫn chỉ số hàng với số ký tự: số 0 là chỉ số hàng, còn mỗi hàng chứa được tới 30 ký tự cùng dấu kết thúc.
Mở trang câu hỏi này →
AThe null terminator in C strings
BA whitespace character
CA printable character
DA NULL pointer value
Lời giải
Đáp án đúng: "The null terminator in C strings". Chuỗi trong C là dãy ký tự nằm liền nhau và kết thúc bằng một byte giá trị 0; chính byte đó cho mọi hàm chuỗi biết chỗ dừng, thiếu nó thì strlen hay printf cứ đọc tiếp sang vùng nhớ bên cạnh. Mô tả "A whitespace character" sai: nhóm ký tự trắng gồm dấu cách, dấu tab, ký tự xuống dòng và vài ký tự nữa, còn hàm isspace trả về 0 cho byte giá trị 0. Mô tả "A printable character" cũng sai, byte này không in ra hình gì và không nằm trong dải ký tự hiển thị bắt đầu từ mã 32. Mô tả "A NULL pointer value" lẫn hai khái niệm khác hẳn nhau: đây là một ký tự giá trị 0 nằm trong mảng, còn con trỏ rỗng là giá trị của một biến con trỏ không trỏ vào đâu; hai thứ khác kiểu, khác kích thước và dùng ở hai chỗ khác nhau.
Mở trang câu hỏi này →
A(x < 10 || x > 20)
B(x > 10 && x < 20)
C(x < 10 && x > 20)
D!(x >= 10 || x <= 20)
Lời giải
Đáp án đúng: "(x < 10 || x > 20)". Luật De Morgan nói phủ định của một phép và chuyển thành phép hoặc của hai phủ định, nên phủ định của mệnh đề x lớn hơn hoặc bằng 10 và x nhỏ hơn hoặc bằng 20 là x nhỏ hơn 10 hoặc x lớn hơn 20; từng phép so sánh cũng phải đảo cho đúng, vì phủ định của lớn hơn hoặc bằng là nhỏ hơn hẳn. Biểu thức "(x > 10 && x < 20)" vẫn giữ phép và, nó chỉ thu hẹp khoảng cũ chứ không phủ định: với x bằng 15 thì cả nó lẫn mệnh đề gốc đều đúng, trong khi phủ định phải cho giá trị ngược nhau. Biểu thức "(x < 10 && x > 20)" cũng giữ phép và nên không bao giờ đúng, không số nào vừa nhỏ hơn 10 vừa lớn hơn 20. Biểu thức "!(x >= 10 || x <= 20)" đổi phép và thành phép hoặc rồi mới phủ định cả khối, làm sai cả hai bước; phần trong ngoặc đúng với mọi x nên cả biểu thức luôn sai.
Mở trang câu hỏi này →
Afor (initialization, condition, increment) { statements; }
Bfor { initialization; condition; increment; } (statements;)
Cfor (initialization; condition; increment) { statements; }
Dfor: (initialization; condition; increment) { statements; }
Lời giải

Đáp án đúng: "

Lời giải
for (initialization; condition; increment) {
  statements;
}

". Vòng for trong C có ba phần đặt trong một cặp ngoặc tròn và phân cách bằng đúng hai dấu chấm phẩy: khởi tạo chạy một lần, điều kiện kiểm trước mỗi lượt, phần cập nhật chạy sau mỗi lượt; thân vốn là một lệnh, muốn nhiều lệnh thì gom trong cặp ngoặc nhọn. Khuôn "

Lời giải
for (initialization, condition, increment) {
  statements;
}

" dùng dấu phẩy nên cả ngoặc thành một biểu thức duy nhất và vòng lặp mất chỗ kiểm điều kiện. Khuôn "

Lời giải
for {
  initialization;
  condition;
  increment;
}

(statements;)" đảo vai hai loại ngoặc: phần điều khiển phải nằm trong ngoặc tròn còn thân phải nằm trong ngoặc nhọn. Khuôn "

Lời giải
for: (initialization; condition; increment) {
  statements;
}

" thêm dấu hai chấm sau từ khoá, mà dấu hai chấm trong C chỉ dùng cho nhãn, và nhãn thì không được trùng từ khoá.

Mở trang câu hỏi này →
AAll variables must be declared before we use them in C program.
BTo declare a variable you specify its name and data type it can store.
CAll variable are always stored on the stack.
DReading a value from keyboard or other device with a OUT statement
EThe scope of a variable is the range of program statements that can't access that variable.
Lời giải
Đáp án đúng: "To declare a variable you specify its name and data type it can store.". Câu hỏi đòi mô tả cách khai báo, và một khai báo trong C đúng là gồm tên kiểu rồi tên biến, nhờ đó trình biên dịch biết dành bao nhiêu byte cùng cách diễn giải byte ấy. Câu "All variables must be declared before we use them in C program." nói một điều đúng về ngôn ngữ, nhưng nó nêu nghĩa vụ phải khai trước khi dùng chứ không nói cách khai, nên không trả lời câu hỏi. Câu "All variable are always stored on the stack." sai: biến toàn cục và biến static nằm ở vùng dữ liệu tĩnh suốt đời chương trình, chỉ biến cục bộ tự động mới nằm trên ngăn xếp. Câu "Reading a value from keyboard or other device with a OUT statement" mô tả việc nhập dữ liệu và còn nhắc một lệnh không tồn tại trong C. Câu "The scope of a variable is the range of program statements that can't access that variable." định nghĩa ngược, vì phạm vi là vùng mã nhìn thấy được biến.
Mở trang câu hỏi này →
A#define is a preprocessor command often used to introduce named constants
Bdouble and goto are keyword for declaring data type.
Creturn 0; is normally the last statement in main()
DThe file stdio.h is the library where the compiler finds scanf().
Lời giải

Đáp án đúng: "double and goto are keyword for declaring data type.". Trong C, double đúng là từ khoá của một kiểu số thực, nhưng goto là lệnh nhảy tới một nhãn trong cùng hàm và không khai báo kiểu gì cả, nên câu này sai và chính nó là thứ đề bài cần tìm. Câu "#define is a preprocessor command often used to introduce named constants" đúng: chỉ thị này do bộ tiền xử lý xử lý và hay dùng để đặt tên cho hằng số. Câu "return 0; is normally the last statement in main()" đúng với lệ thường, giá trị 0 báo cho hệ điều hành biết chương trình kết thúc bình thường. Câu "The file stdio.h is the library where the compiler finds scanf()" đúng về chỗ khai báo: tệp tiêu đề này cung cấp nguyên mẫu của scanf cùng nhóm hàm vào ra, nhờ đó trình biên dịch kiểm được kiểu các đối số.

Mở trang câu hỏi này →
161What does this code print?4 lựa chọncó code
Đề bài
int n = 30, m = 5;
float x = 3.5F, y = 8.12F;
printf("%d, %d\n", (n < m || x >= y), !(x > y));
A1, 0
B0, 1
C1, 1
D0, 0
Lời giải
Đáp án đúng: "0, 1". Hai biểu thức trong printf đều là biểu thức luận lý, nên mỗi cái chỉ cho ra số nguyên 0 hoặc 1. Với n bằng 30 và m bằng 5 thì n nhỏ hơn m là sai; với x bằng 3.5 và y bằng 8.12 thì x lớn hơn hoặc bằng y cũng sai, nên phép hoặc của hai điều sai cho 0. Biểu thức thứ hai: x lớn hơn y là sai, tức giá trị 0, nên phủ định nó cho 1. Vậy chương trình in 0, 1. Lựa chọn "1, 0" đảo ngược hai kết quả, chỉ đúng nếu 30 nhỏ hơn 5 hoặc 3.5 lớn hơn 8.12. Lựa chọn "1, 1" đòi phép hoặc phải có ít nhất một vế đúng, điều không xảy ra ở đây vì cả hai vế đều sai. Lựa chọn "0, 0" đòi x lớn hơn y là đúng để phủ định cho ra 0, nhưng 3.5 nhỏ hơn 8.12 nên phủ định phải cho 1.
Mở trang câu hỏi này →
162What is the output of the following code?4 lựa chọncó code
Đề bài
int a = 10, b = 20;
printf("%d", (a > 5 && b < 25));
A0
B1
C10
D20
Lời giải
Đáp án đúng: "1". Phép và luận lý trong C trả về một giá trị int: 1 khi cả hai vế đúng, 0 khi có vế sai. Ở đây a bằng 10 nên a lớn hơn 5 là đúng, b bằng 20 nên b nhỏ hơn 25 cũng đúng, vì vậy cả biểu thức cho 1 và đặc tả số nguyên in ra 1. Cần nhớ C không có kiểu luận lý riêng: mọi phép so sánh đều cho ra số nguyên 0 hoặc 1, và ngược lại mọi giá trị khác 0 đều được coi là đúng khi xét điều kiện. Lựa chọn "0" chỉ xuất hiện khi ít nhất một vế sai, chẳng hạn nếu b bằng 30. Lựa chọn "10" là giá trị của a, nhưng phép và luận lý không trả lại toán hạng như một số ngôn ngữ khác, nó chuẩn hoá kết quả về 0 hoặc 1. Lựa chọn "20" tương tự là giá trị của b, cũng không phải kết quả của một phép so sánh.
Mở trang câu hỏi này →
163What will the following program print?4 lựa chọncó code
Đề bài
#include <stdio.h>

int main()
{
    int x = 5, y = 10;

    while(x++ < y--)
    {
        printf("%d %d\n", x, y);
    }

    return 0;
}
A2 5 3 4 4 3
B6 9 7 8 8 7
C5 10 7 8 8 7
D6 9 2 2 8 7
Lời giải
Đáp án đúng: "6 9 7 8 8 7". Then chốt nằm ở dạng hậu tố của x++ và y--: điều kiện được so trên giá trị cũ, nhưng ngay khi việc so sánh xong thì hai biến đã mang giá trị mới, nên printf trong thân vòng lặp luôn thấy giá trị đã tăng giảm. Lượt một so 5 với 10, x thành 6 và y thành 9, in 6 9. Lượt hai so 6 với 9, x thành 7 và y thành 8, in 7 8. Lượt ba so 7 với 8, x thành 8 và y thành 7, in 8 7. Lượt bốn so 8 với 7 nên điều kiện sai và vòng lặp dừng, dù x cùng y vẫn kịp đổi thành 9 và 6. Lựa chọn mở đầu bằng "5 10" coi như printf thấy giá trị trước khi tăng giảm, tức hiểu sai dạng hậu tố. Lựa chọn mở đầu bằng "2 5" không khớp bước nào vì x chỉ tăng còn y chỉ giảm. Lựa chọn chứa dòng "2 2" đòi hai biến gặp nhau ở 2, nhưng chúng gặp nhau quanh 8 và 7 rồi vòng lặp kết thúc.
Mở trang câu hỏi này →
ATo carry out a specific function and may be used alone or combined with other modules to create a program
BTo store data in a database
CTo handle user input exclusively
DTo perform arithmetic calculations only
Lời giải
Đáp án đúng: "To carry out a specific function and may be used alone or combined with other modules to create a program". Mô-đun là đơn vị chương trình được tách ra để lo một nhiệm vụ xác định, có đầu vào và đầu ra rõ ràng, nhờ vậy nó vừa chạy độc lập được vừa ghép với mô-đun khác thành chương trình lớn. Trong C, mô-đun thường hiện ra dưới dạng hàm hoặc cặp tệp nguồn kèm tệp tiêu đề, và lợi ích chính là chia nhỏ độ phức tạp, tái dùng, kiểm thử riêng từng phần. Lựa chọn "To store data in a database" tả vai trò của hệ quản trị cơ sở dữ liệu. Lựa chọn "To handle user input exclusively" bó mô-đun vào một việc duy nhất là đọc dữ liệu người dùng, trong khi mô-đun có thể lo tính toán hay xuất kết quả. Lựa chọn "To perform arithmetic calculations only" cũng thu hẹp sai như vậy, vì tính toán số học chỉ là một trong vô số nhiệm vụ mà mô-đun đảm nhận.
Mở trang câu hỏi này →