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ủ đề
Thử sức tại chỗ

Trả lời ngay tại đây

Chưa trả lời câu nào
1PRF192 - Phần 1: Máy tính, phần mềm và chương trình C đầu tiên
What is the incorrect definition?
2PRF192 - Phần 1: Máy tính, phần mềm và chương trình C đầu tiên
Which is not a type of bus in a computer?
3PRF192 - Phần 1: Máy tính, phần mềm và chương trình C đầu tiên
During the compilation process, what will be done with comments?
Còn 3 câu nữa ở trên

Trả lời hết các câu trên để xem tổng kết, hoặc vào phiên học ngay.

Học từ ngân hàng câu hỏi

Bắt đầu một phiên học theo môn

Tiến độ của bạn luôn được tính và đồng bộ trực tiếp theo tổng số lượng câu hỏi mới nhất của môn học này.

266Ngân hàng hiện tại--Tiến độ môn

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

24/266 câuCòn 242
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
Đá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.
Mở trang câu hỏi này →
Aconst
Bdefine
Cconstant
Dnamed
Lời giải
Đá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ì.
Mở trang câu hỏi này →
A0b01100010
B0b10100010
C0b10010010
D0b10110010
Lời giải
Đá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.
Mở trang câu hỏi này →
8What does the following program display?4 lựa chọncó code
Đề bài
#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
Đá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.
Mở trang câu hỏi này →
AUses array indexing
BUses pointer arithmetic
CRequires memory allocation
DWorks without checking for buffer overflow
Lời giải
Đá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ớ.
Mở trang câu hỏi này →
Đề bài
#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
Đá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.
Mở trang câu hỏi này →
Ax < z && y < z
Bx < z || y < z
Cy > x || y > z
Dy < z && z < x
Lời giải
Đá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.
Mở trang câu hỏi này →
12What will be the output of the following C code?4 lựa chọncó code
Đề bài
#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
Đá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 đó.
Mở trang câu hỏi này →
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
Đá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.
Mở trang câu hỏi này →
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
Đá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.
Mở trang câu hỏi này →
AIdentification
BName
CDeclaration
DDefinition
Lời giải
Đá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.
Mở trang câu hỏi này →
AIt improves code portability
BIt makes the code shorter
CIt prevents the use of symbolic names
DIt increases code complexity
Lời giải
Đá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.
Mở trang câu hỏi này →
A16
B28
C37
D32
E-28
Lời giải
Đá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ừ.
Mở trang câu hỏi này →
18What is the output?4 lựa chọncó code
Đề bài
int a = 8;
int b = 3;
int result = a % b * 2;
printf("%d", result);
A2
B4
C1
D5
Lời giải
Đá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.
Mở trang câu hỏi này →
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
Đá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.
Mở trang câu hỏi này →
20What will the following program output?4 lựa chọncó code
Đề bài
#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
Đá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ệ.
Mở trang câu hỏi này →
ACheck the day of the week.
BSort an array ascending.
CSort an array descending.
DFind the average value of a sequence.
Lời giải
Đáp án đúng: "Check the day of the week." Lệnh switch so khớp một giá trị nguyên hoặc ký tự với từng nhãn hằng, nên nó hợp đúng với bài toán phân loại theo một tập giá trị rời rạc biết trước; thứ trong tuần chỉ có bảy giá trị nên mỗi case ứng một thứ, đọc rõ hơn chuỗi if else dài. "Sort an array ascending." sai vì sắp xếp cần so sánh và đổi chỗ từng cặp phần tử trong vòng lặp, không có tập nhãn hằng nào để so khớp. "Sort an array descending." sai vì lý do y hệt, chỉ khác chiều so sánh; switch không so sánh lớn nhỏ, nó chỉ xét bằng. "Find the average value of a sequence." sai vì tính trung bình là cộng dồn rồi chia, việc của vòng lặp và biểu thức số học, hơn nữa số phần tử không giới hạn nên không thể liệt kê thành case.
Mở trang câu hỏi này →
Đề bài
#include <stdio.h>
int main()
{
    int i,j,result=0;
    for(i=3;i<=5;i++){
            for(j=5;j>i;j--)
            result+=j;
        }
    printf("%d",result);
            return 0;
}
A14
B15
C16
D20
Lời giải

Đáp án đúng: "14". Vòng trong for(j=5;j>i;j--) không có ngoặc nhọn nên thân nó chỉ gồm đúng một lệnh result+=j; phạm vi khối trong C do ngoặc nhọn quyết định, không do thụt lề. Lần theo từng lượt: i bằng 3 thì j nhận 5 rồi 4, cộng được 9; i bằng 4 thì j chỉ nhận 5, result thành 14; i bằng 5 thì j khởi tạo bằng 5 không thoả j>i nên vòng trong không chạy lần nào. Chương trình in 14. Cần công bố khuyết điểm: bản khoá in kèm ghi 16, con số đó không khớp với bất kỳ lần lần theo trung thực nào của hai vòng lặp. "15" là tổng 5+4+3+2+1, chỉ ra được nếu bỏ ràng buộc j>i và cho j chạy tới 1. "16" lớn hơn tổng thật 2 đơn vị mà không lượt lặp nào cộng thêm 2. "20" đòi cộng cả những giá trị j mà điều kiện j>i đã chặn.

Mở trang câu hỏi này →
Đề bài
#include<stdio.h>

int main()
{
    char i, j;
    for (i = 'A'; i <= 'E'; i++)
    {
        for (j = 'A'; j <= i; j++)
        {
            printf("%c", i);
        }
        printf("\n");
    }
    return 0;
}
AA BB CCC DDDD EEEEE
BAAAAA BBBB CCC DD E
CA AB ABC ABCD ABCDE
DA AA AAA AAAA AAAAA
Lời giải
Đáp án đúng: "A BB CCC DDDD EEEEE". Vòng ngoài cho i chạy từ ký tự A tới E; với mỗi i, vòng trong cho j chạy từ A tới i nên số lượt đúng bằng thứ tự của i trong bảng mã, và thân vòng trong luôn in i chứ không in j. Vì thế dòng đầu có một ký tự A, dòng sau hai ký tự B, rồi ba ký tự C, bốn ký tự D, năm ký tự E; lệnh xuống dòng nằm trong vòng ngoài nên mỗi giá trị của i xuống dòng một lần. «AAAAA BBBB CCC DD E» sai vì số ký tự mỗi dòng phải tăng dần theo i, lại thêm khoảng trắng thụt đầu dòng mà mã không hề in. "A AB ABC ABCD ABCDE" là kết quả nếu thân vòng trong in j; ở đây in i nên các ký tự trên cùng một dòng giống nhau. "A AA AAA AAAA AAAAA" là kết quả nếu luôn in một ký tự cố định, nhưng ký tự in ra đổi theo i.
Mở trang câu hỏi này →
AThe loop exits immediately.
BThe loop continues with the next iteration and skips the remaining statements.
CThe program terminates completely, and all variables are destroyed.
DNothing happens; the break statement is completely ignored in for loops
Lời giải
Đáp án đúng: "The loop exits immediately." Lệnh break chuyển điều khiển ra ngay lệnh đầu tiên sau thân vòng lặp, bỏ luôn phần còn lại của lượt hiện tại và không chạy bước cập nhật biến đếm nữa; đó là cách thoát sớm khi đã tìm được thứ cần tìm, chỉ thoát một cấp vòng lặp gần nhất. "The loop continues with the next iteration and skips the remaining statements." là mô tả của continue, một lệnh khác: continue bỏ phần còn lại của lượt rồi quay về bước cập nhật và kiểm tra điều kiện. "The program terminates completely, and all variables are destroyed." sai vì kết thúc chương trình là việc của return trong main hoặc hàm exit. "Nothing happens; the break statement is completely ignored in for loops" sai vì break có hiệu lực giống nhau trong for, while, do while và switch.
Mở trang câu hỏi này →