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

64/266 câuCòn 202
A"w+" truncates existing files, "a+" preserves them.
B"a+" can only append data, while "w+" can only write from the beginning.
C"a+" opens binary files, while "w+" opens text files.
D"a+" allows reading only, while "w+" allows both reading and writing.
Lời giải
Đáp án đúng: "w+" truncates existing files, "a+" preserves them. Khác biệt gốc nằm ở lúc mở một tệp đã có: chế độ w+ cắt tệp về rỗng ngay khi mở nên dữ liệu cũ mất sạch, còn a+ giữ nguyên nội dung cũ và mọi phép ghi luôn được đẩy xuống cuối tệp bất kể con trỏ đọc đang ở đâu; cả hai đều tạo tệp mới nếu tệp chưa tồn tại và cả hai đều cho cả đọc lẫn ghi nhờ dấu cộng. Câu "a+" can only append data, while "w+" can only write from the beginning. sai vì dấu cộng ở cả hai chế độ đều mở thêm quyền đọc. Câu "a+" opens binary files, while "w+" opens text files. sai vì chế độ nhị phân do chữ b quyết định, hai chuỗi này đều là chế độ văn bản. Câu "a+" allows reading only, while "w+" allows both reading and writing. sai vì a+ cho ghi, chỉ khác là ghi luôn vào cuối tệp.
Mở trang câu hỏi này →
Afprintf
Bfwritef
Cfsendf
Dfputs
Lời giải
Đáp án đúng: "fprintf". Hàm fprintf dùng y như printf nhưng thêm tham số đầu là con trỏ tệp, nên nó nhận chuỗi định dạng cùng các đối số rồi ghi kết quả đã định dạng vào tệp thay vì ra màn hình; thực chất printf chỉ là fprintf gắn sẵn với dòng xuất chuẩn. "fwritef" không tồn tại trong thư viện chuẩn, người học thường nhầm nó với fwrite dùng cho dữ liệu nhị phân. "fsendf" cũng không có trong thư viện chuẩn C, gọi tới sẽ lỗi ở khâu liên kết. "fputs" có thật nhưng chỉ ghi một chuỗi đã có sẵn, nó không nhận chuỗi định dạng nên không chèn được giá trị số hay ký tự vào văn bản.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    FILE *file_ptr;
    file_ptr = fopen("output.txt", "w");
    if (file_ptr == NULL) {
        printf("Unable to open the file.\n");
        return 1;
    }
    fprintf(file_ptr, "Hello, World!\nThis is a test.");
    fclose(file_ptr);
    return 0;
}

Assuming the code is executed successfully, what will be the content of the "output.txt" file?

AHello, World! This is a test.
BHello, World! This is a test.
CHello, World!
DThis is a test.
Lời giải
Đáp án đúng: "Hello, World! This is a test." Chuỗi định dạng truyền cho fprintf chứa dãy thoát xuống dòng ở giữa, nên khi ghi ra tệp nó trở thành một ký tự xuống dòng thật, chia nội dung thành hai dòng; fprintf ghi đúng những gì chuỗi định dạng mô tả, không tự thêm hay bớt ký tự nào, và chế độ w tạo tệp mới hoặc xoá trắng tệp cũ trước khi ghi, còn fclose đẩy hết bộ đệm xuống đĩa nên nội dung chắc chắn được lưu đủ. "Hello, World! This is a test." sai vì nó thay ký tự xuống dòng bằng một khoảng trắng, chuyện đó không xảy ra. "Hello, World!" sai vì nó chỉ lấy phần trước dấu xuống dòng, trong khi một lần gọi fprintf ghi trọn chuỗi. "This is a test." sai vì nó bỏ phần đầu của chuỗi, mà không có lệnh nào ghi đè phần đó.
Mở trang câu hỏi này →
Afprintf()
Bfwrite()
Cfputc()
Dfprintb()
Lời giải
Đáp án đúng: "fwrite()". Hàm fwrite nhận địa chỉ vùng dữ liệu, kích thước một phần tử, số phần tử và con trỏ tệp, rồi sao nguyên từng byte trong bộ nhớ ra tệp, nên nó ghi được cả cấu trúc hay mảng số mà không đổi sang dạng chữ; hàm đi cặp với nó khi đọc lại là fread. "fprintf()" ghi văn bản đã định dạng, số 1000 sẽ thành bốn ký tự chữ số chứ không phải các byte nguyên của một int. "fputc()" chỉ ghi đúng một ký tự mỗi lần gọi, không mô tả được kích thước phần tử nên không phù hợp để đổ cả khối dữ liệu. "fprintb()" không tồn tại trong thư viện chuẩn C, gọi tới sẽ lỗi ở khâu liên kết.
Mở trang câu hỏi này →
ATo reset the file pointer to the beginning of the file.
BTo read the entire file into memory.
CTo close the file.
DTo move the file pointer to the end of the file.
Lời giải
Đáp án đúng: "To reset the file pointer to the beginning of the file." Hàm rewind đặt vị trí đọc ghi của dòng tệp về byte đầu tiên, đồng thời xoá cờ lỗi và cờ kết thúc tệp, nên sau khi đã đọc hết tệp vẫn có thể đọc lại từ đầu; nó tương đương fseek về mốc 0 kèm việc dọn cờ. "To read the entire file into memory." sai vì hàm không chuyển một byte nội dung nào, nó chỉ dịch con trỏ vị trí trong cấu trúc dòng tệp. "To close the file." sai vì đóng tệp là việc của fclose, sau rewind thì tệp vẫn đang mở và dùng tiếp được. "To move the file pointer to the end of the file." sai vì đó là việc của fseek với mốc cuối tệp, ngược hẳn chiều với rewind.
Mở trang câu hỏi này →
50What is the purpose of this function?4 lựa chọncó code
Đề bài
void get_a_line(char line[], int max) {
    int n = 0;
    char c;
    while ('\n' != (c = getchar()))
        if (n < max)
            line[n++] = c;
    line[n] = '\0';
}
AReads a line of input safely
BWrites a string to file
CCompares strings
DReverses string
Lời giải
Đáp án đúng: "Reads a line of input safely". Hàm đọc từng ký tự bằng getchar cho tới khi gặp ký tự xuống dòng, chỉ ghi vào mảng khi n còn nhỏ hơn max nên không bao giờ viết quá chỗ đã có, rồi đặt ký tự rỗng kết thúc chuỗi; chính phép kiểm tra n < max là thứ làm nó an toàn hơn cách đọc không giới hạn. Hàm vẫn còn điểm yếu đáng biết: phần dư của dòng nhập dài hơn max bị bỏ, và nếu luồng nhập kết thúc mà chưa có ký tự xuống dòng thì vòng lặp không gặp mốc dừng. "Writes a string to file" sai vì không có con trỏ tệp nào và cũng không gọi hàm ghi tệp. "Compares strings" sai vì hàm chỉ có một mảng và không có phép so sánh nào giữa hai chuỗi. "Reverses string" sai vì chỉ số n luôn tăng, các ký tự được đặt theo đúng thứ tự nhập.
Mở trang câu hỏi này →
51What is the output of the following code snippet?4 lựa chọncó code
Đề bài
#include <stdio.h>
int x = 9;
void someFunction() {
    int x = 8;
    printf("%d ", x);
}
int main() {
    someFunction();
    printf("%d", x);
    return 0;
}
A8 9
B9 8
C8 8
D9 9
Lời giải
Đáp án đúng: "8 9". Hàm someFunction khai báo một biến cục bộ tên x bằng 8; tên cục bộ che tên toàn cục trong suốt thân hàm nên lệnh in trong hàm cho ra 8. Khi hàm trả về, biến cục bộ hết phạm vi, tên x trong main lại chỉ về biến toàn cục bằng 9 nên lệnh in sau cho ra 9; thứ tự thực thi là gọi hàm trước rồi mới in, vì vậy màn hình hiện 8 9. Cần công bố khuyết điểm: bản khoá in kèm ghi 9 8, thứ tự đó chỉ đúng nếu hai lệnh in đổi chỗ cho nhau, nên "9 8" sai. "8 8" sai vì sau khi ra khỏi hàm không còn biến cục bộ nào, không ai gán 8 cho biến toàn cục. "9 9" sai vì trong thân hàm biến cục bộ đã che biến toàn cục nên lệnh in ở đó không thể thấy giá trị 9.
Mở trang câu hỏi này →
AC has object-oriented features.
BC is English-like
CC is faster and more powerful than other high-level languages.
DC supports basic ways to understand the memory of a program
Lời giải
Đáp án đúng: "C has object-oriented features." Ngôn ngữ C không có lớp, đối tượng, kế thừa hay đa hình, nên đặc tính hướng đối tượng không thể là lý do chọn C làm ngôn ngữ đầu tiên; muốn những thứ đó phải sang ngôn ngữ khác. "C is English-like" là lý do có thật được nêu, các từ khoá if, else, while, return đọc gần như tiếng Anh nên người mới dễ đoán ý. "C is faster and more powerful than other high-level languages." cũng là lý do được nêu, mã C dịch ra mã máy gọn và cho phép làm việc sát phần cứng. "C supports basic ways to understand the memory of a program" là lý do quan trọng nhất về mặt học thuật: con trỏ, địa chỉ và cấp phát động buộc người học hình dung bộ nhớ thật thay vì coi nó là chuyện trừu tượng.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main() {
    int a[] = {1,2,3,4,5,6};
    int* p = a;
    p += 3;
    printf("%d, %d",*(a+3), *(p++));
    return 0;
}
A3 3
B4 5
C4 4
D3 4
Lời giải
Đáp án đúng: "4 4". Mảng a chứa 1,2,3,4,5,6 nên a[3] bằng 4; biểu thức *(a+3) đúng là a[3], in ra 4. Con trỏ p ban đầu trỏ a[0], lệnh p += 3 đưa p tới a[3]; trong *(p++), phép tăng hậu tố trả về giá trị con trỏ trước khi tăng nên phép lấy nội dung đọc đúng a[3], cũng ra 4, chỉ sau đó p mới nhích sang a[4] và không còn được dùng nữa. Vì vậy chương trình in 4 4. "3 3" nhầm chỉ số với giá trị: cộng 3 vào con trỏ cho địa chỉ của phần tử thứ tư, không cho số 3. "4 5" là kết quả nếu phép tăng trả về giá trị sau khi tăng, tức viết *(++p); dạng hậu tố thì không như vậy. "3 4" đọc sai vế đầu thành a[2], mà hai vế đều trỏ vào cùng một phần tử nên hai số in ra phải giống nhau.
Mở trang câu hỏi này →
54What will be the output of the following code?4 lựa chọncó code
Đề bài
int i = 10;
while (i > 0) {
    printf("%d ", i);
    i -= 3;
}
A10 7 4 1
B10 9 8 7 6 5 4 3 2 1
C10 7 4 1 -2
D10 7 4 1 -2 -5
Lời giải
Đáp án đúng: "10 7 4 1". i khởi tạo bằng 10; mỗi lượt thân vòng in i rồi trừ đi 3, nên lần lượt in 10, 7, 4, 1; sau lượt in 1 thì i thành -2, điều kiện i > 0 sai nên vòng lặp dừng trước khi in thêm. Bản chất của while là kiểm tra điều kiện trước mỗi lượt, vì vậy giá trị âm không bao giờ tới được lệnh in. "10 9 8 7 6 5 4 3 2 1" là kết quả nếu bước giảm là 1, trong khi i -= 3 trừ ba đơn vị mỗi lượt. "10 7 4 1 -2" sai vì khi i bằng -2 thì điều kiện đã sai, mà lệnh in nằm trong thân vòng nên không chạy nữa. "10 7 4 1 -2 -5" sai nặng hơn, nó cho vòng lặp chạy thêm hai lượt dù điều kiện i > 0 đã không còn đúng.
Mở trang câu hỏi này →
AReturn type, function name, parameters, and function body.
BReturn type, function name, return value, and function body
CReturn type, function name, parameters, and return value
DReturn value, function name, parameters, and function body
Lời giải
Đáp án đúng: "Return type, function name, parameters, and function body.". Một định nghĩa hàm trong C được viết theo đúng trật tự mà trình biên dịch cần để biết cách gọi và cách nhận kết quả: trước hết là kiểu trả về, rồi tên hàm, rồi danh sách tham số trong cặp ngoặc đơn, cuối cùng là thân hàm trong cặp ngoặc nhọn. Ba thành phần đầu hợp thành tiêu đề hàm, cũng chính là phần được lặp lại khi khai báo nguyên mẫu, còn thân hàm mới chứa các lệnh thực thi. Ý "Return type, function name, return value, and function body" sai vì giá trị trả về không phải một thành phần cú pháp nằm trong tiêu đề, nó do lệnh return bên trong thân hàm sinh ra lúc chạy. Ý "Return type, function name, parameters, and return value" sai vì bỏ mất thân hàm, mà thiếu thân thì chỉ còn là một nguyên mẫu, không phải định nghĩa. Ý "Return value, function name, parameters, and function body" sai vì chỗ mở đầu buộc phải là một kiểu dữ liệu, không phải một giá trị cụ thể.
Mở trang câu hỏi này →
Agetchar() and putchar()
Bgets() and puts()
Cscanf() and printf()
Dfgets() and fputs()
Lời giải
Đáp án đúng: "getchar() and putchar()". Hai hàm này thuộc nhóm vào ra một ký tự: getchar đọc đúng một ký tự từ dòng vào chuẩn và trả về mã của nó dưới dạng int để còn chỗ biểu diễn giá trị EOF, còn putchar ghi đúng một ký tự ra dòng ra chuẩn. Vì mỗi lần gọi chỉ xử lý một ký tự nên chúng là lựa chọn cho bài toán đọc hoặc ghi từng ký tự một. Ý "gets() and puts()" sai vì cặp này làm việc với cả một chuỗi, gets đọc trọn một dòng cho tới khi gặp ký tự xuống dòng và puts in cả chuỗi kèm dấu xuống dòng. Ý "scanf() and printf()" sai vì đó là vào ra có định dạng, đọc và ghi theo chuỗi định dạng với nhiều đối số thuộc nhiều kiểu khác nhau. Ý "fgets() and fputs()" sai vì chúng cũng thao tác trên chuỗi và còn nhận thêm đối số dòng tệp, dùng cho tệp hoặc cho dòng chuẩn chứ không phải cho một ký tự riêng lẻ.
Mở trang câu hỏi này →
Aint _a3;
Bint a_3;
Cint 3_a;
Dint _3a
Lời giải
Đáp án đúng: "int 3_a;". Quy tắc đặt tên trong C bắt buộc định danh phải bắt đầu bằng chữ cái hoặc dấu gạch dưới, các ký tự sau đó mới được phép là chữ số. Lý do nằm ở bộ phân tích từ vựng: gặp ký tự số đứng đầu, nó cố đọc một hằng số, nên 3_a bị nhận là số 3 dính thêm phần rác phía sau và trình biên dịch báo lỗi cú pháp. Ý "int _a3;" hợp lệ vì mở đầu bằng dấu gạch dưới, sau đó là chữ và số. Ý "int a_3;" hợp lệ vì mở đầu bằng chữ cái, còn dấu gạch dưới và chữ số đều được phép đứng ở giữa tên. Ý "int _3a" cũng là một tên hợp lệ, dấu gạch dưới đứng đầu khiến chữ số theo sau không còn gây nhập nhằng; chỗ thiếu dấu chấm phẩy ở ý này chỉ là sai sót lúc chép đề, bản thân cái tên không vi phạm quy tắc nào.
Mở trang câu hỏi này →
Atime.h
Bconio.h
Cmath.h
Dstdlib.h
Lời giải
Đáp án đúng: "stdlib.h". Chuẩn C xếp hàm abs vào nhóm tiện ích số nguyên của stdlib.h cùng với labs, llabs và div, bởi abs làm việc trên int chứ không trên số thực, trong khi math.h được dành riêng cho các hàm toán học trên số thực. Ý "time.h" sai vì tệp tiêu đề đó khai báo những thứ liên quan tới thời gian như time, clock, difftime. Ý "conio.h" sai vì nó không phải tệp tiêu đề chuẩn, chỉ tồn tại trên một số trình biên dịch để làm các thao tác màn hình và bàn phím kiểu getch hay clrscr. Ý "math.h" sai vì nơi đó khai báo fabs cho double chứ không phải abs cho int; nhiều trình biên dịch có kèm thêm khai báo abs trong math.h như phần mở rộng riêng, nhưng chỗ được chuẩn hoá chính thức vẫn là stdlib.h.
Mở trang câu hỏi này →
59What will be the output of the following program?4 lựa chọncó code
Đề bài
int main()
{
    int i = 1;
    int *p = &i;
    int **k = &p;
    i+=2;
    printf("%d%d%d", *p, **k, *(*k));
    getchar();
    return 0;
}
A333
B111
C222
DCompile error
Lời giải
Đáp án đúng: "333". Biến i ban đầu bằng 1, p giữ địa chỉ của i, còn k giữ địa chỉ của p nên k là con trỏ hai cấp. Lệnh i+=2 nâng i lên 3 ngay trong ô nhớ của i. Vì p và k không sao chép giá trị mà chỉ ghi lại đường đi tới ô nhớ đó, mọi lần truy xuất về sau đều đọc ra giá trị mới nhất: *p lấy nội dung ô của i là 3, **k đi hai chặng từ k sang p rồi sang i cũng ra 3, và *(*k) chỉ là cách viết tường minh của **k nên cũng ra 3. Chuỗi định dạng có ba đặc tả %d liền nhau không chen dấu cách nên ba số in sát nhau thành 333. Ý "111" sai vì nó ứng với việc bỏ qua lệnh i+=2, hoặc tưởng con trỏ chụp lại giá trị ngay lúc được gán. Ý "222" sai vì không có phép tính nào trong chương trình sinh ra giá trị 2. Ý "Compile error" sai vì khai báo con trỏ hai cấp và phép lấy nội dung hai lần đều hợp lệ.
Mở trang câu hỏi này →
Đề bài
#include<stdio.h>

int isTriangle(float a, float b, float c)
{
    if ((a>0)&&(b>0)&&(c>0)&&(a<b+c)&&(b<c+a)&&(c<a+b))
        return 1;
    else
        return 0;
}

int main()
{
    float a = 1, b = 1, c = 1.25;
    if (isTriangle(a, b, c))
        printf("%.2f, %.2f, %.2f: a triangle.\n", a, b, c);
    else
        printf("%.2f, %.2f, %.2f: not a triangle.\n", a, b, c);
    return 0;
}
Aa, b, c: a triangle
B1.00, 1.00, 1.25: a triangle
C1, 1, 1.25: a triangle
D1.00, 1.00, 1.25: not a triangle
Lời giải
Đáp án đúng: "1.00, 1.00, 1.25: a triangle". Hàm isTriangle kiểm ba cạnh dương và ba bất đẳng thức tam giác: với a bằng 1, b bằng 1 và c bằng 1.25 thì 1 nhỏ hơn 2.25, 1 nhỏ hơn 2.25 và 1.25 nhỏ hơn 2, nên cả chuỗi phép và cho kết quả đúng và hàm trả về 1. Giá trị khác không được lệnh if trong main coi là điều kiện đúng nên nhánh in a triangle được chạy. Đặc tả %.2f buộc in số thực với đúng hai chữ số sau dấu chấm, vì thế 1 hiện ra thành 1.00 còn 1.25 giữ nguyên. Ý "a, b, c: a triangle" sai vì chuỗi định dạng dùng %.2f nên chỗ đó in giá trị, không in tên biến. Ý "1, 1, 1.25: a triangle" sai vì %.2f không bao giờ bỏ các chữ số thập phân thừa, muốn ra dạng gọn như vậy phải dùng đặc tả khác. Ý "1.00, 1.00, 1.25: not a triangle" sai vì điều kiện tam giác đã thoả nên nhánh else không được chạy.
Mở trang câu hỏi này →
Acompilation errors
Bruntime errors
Clogic or semantic errors
Dinterpreter errors
Lời giải
Đáp án đúng: "logic or semantic errors". Trình biên dịch chỉ kiểm được những gì thuộc hình thức: từ khoá, dấu câu, kiểu dữ liệu, khai báo. Nó không biết chương trình đáng lẽ phải làm gì, nên một công thức viết sai dấu, một vòng lặp chạy thiếu một lượt hay một điều kiện so sánh ngược đều dịch trơn tru rồi cho ra số liệu sai. Đó chính là lỗi tư duy, lỗi về ngữ nghĩa. Ý "compilation errors" sai vì mâu thuẫn với chính đề bài, đã dịch không lỗi thì không còn lỗi biên dịch nào sót lại. Ý "runtime errors" sai vì lỗi lúc chạy biểu hiện bằng việc chương trình dừng bất thường hoặc rơi vào hành vi không xác định như chia cho không, truy cập ngoài vùng nhớ, chứ không phải chạy xong êm ả rồi trả lời sai. Ý "interpreter errors" sai vì mã nguồn ở đây được biên dịch thành mã máy, không có bộ thông dịch nào tham gia.
Mở trang câu hỏi này →
A'c'
B'C'
C'c' or 'C' (depending on IDE)
DCompilation error
Lời giải
Đáp án đúng: "'c'". Hàm tolower chỉ đổi chữ hoa thành chữ thường tương ứng, còn với mọi ký tự khác nó trả về nguyên đối số. Ký tự truyền vào đã là chữ thường nên giá trị trả về vẫn là mã của chữ c, và đặc tả %c in ra đúng một ký tự c. Ý "'C'" sai vì biến chữ thường thành chữ hoa là việc của toupper, tolower không bao giờ làm ngược lại. Ý "'c' or 'C' (depending on IDE)" sai vì hành vi của tolower do chuẩn quy định dứt khoát theo miền ký tự đang dùng, nó không phụ thuộc môi trường soạn thảo hay trình biên dịch. Ý "Compilation error" sai vì lời gọi hoàn toàn hợp lệ, tolower nhận một int và trả về một int nên truyền hằng ký tự vào là chuyện bình thường; điều duy nhất cần nhớ là phải nạp tệp tiêu đề ctype.h để có khai báo của nó.
Mở trang câu hỏi này →
Atypedef struct { dataType1 field1; dataType2 field2; } structName;
Bstruct typedef { dataType1 field1; dataType2 field2; } structName;
Ctypedef { dataType1 field1; dataType2 field2; } struct structName;
DstructName typedef { dataType1 field1; dataType2 field2; };
Lời giải

Đáp án đúng: "typedef

Lời giải
struct {
  dataType1 field1;
  dataType2 field2;
}

structName;". Cách đọc một khai báo typedef luôn là từ khoá typedef, rồi kiểu đầy đủ, rồi tên mới đứng ngay trước dấu chấm phẩy. Ở đây kiểu đầy đủ là struct kèm danh sách thành viên trong cặp ngoặc nhọn, còn structName là tên mới, nhờ vậy về sau chỉ cần viết một từ thay cho cả cụm hai từ. Ý mở đầu bằng "struct typedef" sai vì typedef là bộ định rõ thuộc nhóm lớp lưu trữ, nó phải đứng trước phần mô tả kiểu chứ không được chen vào sau từ khoá struct. Ý viết "typedef {" rồi kết thúc bằng "} struct structName; " sai ở hai chỗ: thiếu từ khoá struct trước cặp ngoặc nhọn nên không có kiểu nào được định nghĩa, và struct đặt ở vị trí tên mới là vô nghĩa. Ý mở đầu bằng "structName typedef" sai vì tên mới bị đẩy lên trước typedef, trong khi chỗ dành cho nó là sau phần kiểu.

Mở trang câu hỏi này →
AIt is a bitwise operator OR
BIt is a logical operator AND
CIt is a bitwise operator AND
DIt is a logical operator OR
Lời giải
Đáp án đúng: "It is a bitwise operator OR". Dấu gạch dọc đơn làm việc ở mức từng bit: nó lấy hai toán hạng nguyên, so từng cặp bit cùng vị trí và cho bit kết quả bằng 1 nếu có ít nhất một bit bằng 1, nên kết quả là một số nguyên chứ không phải một giá trị đúng sai. Chính vì thế nó hay được dùng để bật cờ trong một mặt nạ bit. Ý "It is a logical operator AND" sai vì phép và luận lý phải viết bằng hai dấu và, nó chỉ cho 0 hoặc 1 và còn tính tắt, bỏ hẳn toán hạng bên phải khi bên trái đã sai. Ý "It is a bitwise operator AND" sai vì phép và trên bit viết bằng một dấu và đơn, cho bit 1 chỉ khi cả hai bit đều là 1. Ý "It is a logical operator OR" sai vì phép hoặc luận lý phải viết bằng hai dấu gạch dọc và cũng chỉ trả về 0 hoặc 1.
Mở trang câu hỏi này →