Câu hỏi: PRF192 - Phần 3: Cấu trúc điều khiển - rẽ nhánh và vòng lặp
40 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.
Danh sách câu hỏi
#include <stdio.h>
void main()
{
int x = 0;
if (x == 0)
printf("Hi");
else
printf("How are you");
printf("Hello");
}#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;
}#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;
}Đá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.
#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;
}int i = 10;
while (i > 0) {
printf("%d ", i);
i -= 3;
}#include<stdio.h>
int main()
{
int a=10,b=20,c=30;
while(a>1)
{
if(b%2!=0)
a/=10;
b--;
c*=2;
}
printf("%d ; %d ; %d",a,b,c);
return 0;
}#define SIZE 5
int nums[SIZE] = {5, 10, 2, -45, 6};
for (int i = SIZE - 1; i >= 0; i--)
printf("%d ", nums[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;
}ifswitchwhilefor #include <stdio.h>
int main()
{
int a = 1;
switch (a)
case 1:
printf("%d", a);
case 2:
printf("%d", a);
case 3:
printf("%d", a);
return 0;
}Đáp án đúng: "
while (condition) {
...
}". Lệnh while trong C chỉ nhận duy nhất một biểu thức trong cặp ngoặc tròn; biểu thức đó được tính trước mỗi lần chạy thân và vòng lặp còn tiếp khi giá trị khác 0, nên mọi việc khởi tạo phải làm trước vòng lặp còn việc cập nhật phải nằm trong thân. Khuôn "
while (initialization; condition) {
...
}" đưa phần khởi tạo vào trong ngoặc, đó là thành phần riêng của for, hơn nữa dấu chấm phẩy không được phép xuất hiện trong ngoặc điều kiện. Khuôn "
while (condition; increment) {
...
}" mắc đúng lỗi ấy: phần tăng giảm phải là một lệnh trong thân chứ không phải vế thứ hai của điều kiện. Khuôn "
while (initialization; increment; condition) {
...
}" là khuôn ba phần của for và còn xếp sai trật tự, vì trong for thì điều kiện đứng giữa còn phần cập nhật đứng cuối.
Đáp án đúng: "do{ statements; } while(condition) ; ". Vòng do-while chạy thân trước rồi mới kiểm điều kiện, và cả cấu trúc đó được ngôn ngữ coi là một lệnh duy nhất, nên bắt buộc phải kết thúc bằng dấu chấm phẩy ngay sau ngoặc điều kiện; thân có nhiều lệnh thì gom trong cặp ngoặc nhọn. Khuôn "do
while(condition) {
statements;
}" đặt điều kiện trước thân, thành ra do không có thân nào đi kèm còn khối phía sau trở thành một khối rời, sai hẳn trật tự của cấu trúc. Khuôn "do{ statements; } while (condition)" đúng mọi thứ trừ dấu chấm phẩy kết thúc, mà thiếu nó thì trình biên dịch coi lệnh chưa viết xong và báo lỗi cú pháp. Khuôn "do( statements;) while (condition) ; " dùng ngoặc tròn để gom lệnh, nhưng trong C chỉ cặp ngoặc nhọn mới tạo được khối lệnh, ngoặc tròn chỉ dành cho biểu thức và danh sách tham số.
Đáp án đúng: "for ( Init1, Init2; Condition ; Task1, Task2); ". Cặp ngoặc của for luôn chia thành đúng ba phần bởi hai dấu chấm phẩy: phần khởi tạo chạy một lần khi vào vòng, phần điều kiện kiểm trước mỗi lần chạy thân, phần cập nhật chạy sau mỗi lần chạy thân. Muốn nhồi nhiều việc vào một phần thì dùng toán tử phẩy, nên hai khởi tạo và hai việc cập nhật viết cách nhau bằng dấu phẩy là hợp lệ; dấu chấm phẩy ngay sau ngoặc đóng chỉ làm thân rỗng, vẫn dịch được. Khuôn "for ( Init1, Condition ,Task1); " chỉ dùng dấu phẩy nên cả ngoặc trở thành một biểu thức duy nhất, trình biên dịch không tìm ra điều kiện lặp. Khuôn "for (Condition ; Init1, Init2; Task1); " đảo chỗ: vế đầu bị tính một lần rồi bỏ, còn phần khởi tạo lại bị dùng làm điều kiện. Khuôn "for ( Init1; Init2; Condition ; Task2)"có tới ba dấu chấm phẩy, tức bốn phần, vượt khuôn mà ngôn ngữ cho phép.
#include <stdio.h>
int main() {
int i = 10;
do {
printf("%d ", i);
i -= 2;
} while (i >= 1);
return 0;
}