分支语句
分支语句
if 语句、switch 语句、多层条件语句。
概念
分支语句根据条件选择执行路径:if/else if/else 处理一般逻辑;switch 适合对单个整型表达式的多路分支;多层嵌套则是外层条件再套内层条件。与 cspj.cpp.loop 的区别:分支每轮最多走一条路,循环会重复执行同一块。与 cspj.cpp.operator 的区别:分支考控制结构,运算符考条件表达式本身怎么求值(短路、优先级)。CSP-J 初赛里,阅读程序常给嵌套 if 或 switch 缺 break 的程序,问某输入下走哪条分支;完善程序则在 if (...) 的空位填比较表达式或布尔常量。
CSP-J 常考
cspj-r1-2024第 36–37 题:完善程序连续空位,在if条件处选==比较还是赋布尔值true/false。cspj-r1-2025第 39–40 题:完善程序分支条件,区分关系判断与赋值写法。cspj-r1-2019第 25 题:阅读程序判断嵌套if-else在某输入下输出是否成立。cspj-r1-2021第 35 题:完善程序if空位,补与数组相邻元素比较相关的条件。
int score;
cin >> score;
if (score >= 90)
cout << "A";
else if (score >= 60)
cout << "Pass";
else
cout << "Fail";
易错点
switch某case后忘记break会贯穿到下一分支,阅读题必须按「落入 case 后顺序执行」模拟。- 完善程序空位选项里
num = 2*i与num == 2*i并存时,空位在if (...)内几乎一定是要条件而非赋值。 - 多层
ifelse 配对靠缩进不可靠,要用else绑定规则:每个else只与最近未配对的if相连。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <cstdio>2using namespace std;3int n, m;4int a[100], b[100];56int main() {7 scanf("%d%d", &n, &m);8 for (int i = 1; i <= n; ++i)9 a[i] = b[i] = 0;10 for (int i = 1; i <= m; ++i) {11 int x, y;12 scanf("%d%d", &x, &y);13 if (a[x] < y && b[y] < x) {14 if (a[x] > 0)15 b[a[x]] = 0;16 if (b[y] > 0)17 a[b[y]] = 0;18 a[x] = y;19 b[y] = x;20 }21 }22 int ans = 0;23 for (int i = 1; i <= n; ++i) {24 if (a[i] == 0)25 ++ans;26 if (b[i] == 0)27 ++ans;28 }29 printf("%d\n", ans);30 return 0;31}原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写其它程序 · 第 29 行
原卷作
printf("%d\n", ans);,常规写法应为printf("%d\n", ans);洛谷抓取件为 printf("%d", ans);;pages/pg-04.png 第 29 行含换行,已恢复。
已按官方原件恢复:现为原卷原文
- 25判断1.5 分
若程序执行到第 13 行时,x 总是小于 y,那么第 15 行不会被执行。()
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写错字题干
原卷作
若程序执行,常规写法应为若程序执行洛谷抓取件为「右程序执行」;pages/pg-05.png 为「若程序执行」,已恢复。
已按官方原件恢复:现为原卷原文
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(1)(Josephus 问题) 有 n 个人围成一个圈,依次标号 0 至 n−1。从 0 号开始,依次 0,1,0,1,… 交替报数,报到 1 的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。
试补全模拟程序。
#include <iostream>23using namespace std;45const int MAXN = 1000000;6int F[MAXN];78int main() {9 int n;10 cin >> n;11 int i = 0, p = 0, c = 0;12 while (①) {13 if (F[i] == 0) {14 if (②) {15 F[i] = 1;16 ③;17 }18 ④;19 }20 ⑤;21 }22 int ans = -1;23 for (i = 0; i < n; i++)24 if (F[i] == 0)25 ans = i;26 cout << ans << endl;27 return 0;28}- 35(②)单选空位 ②3 分
②处应填( )
A.i % 2 == 0
B.i % 2 == 1
C.p
D.!p
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
第 1 题
(判断平方数) 问题:给定一个正整数 n,希望判断这个数是否为完全平方数,即存在一个正整数 x,使得 x 的平方为 n。
试补全程序。
#include<iostream>
#include<vector>
using namespace std;
bool isSquare(int num) {
int i = ___①___;
int bound = ___②___;
for (; i <= bound; ++i) {
if (___③___) {
return ___④___;
}
}
return___⑤___;
}
int main() {
int n;
cin >> n;
if (isSquare(n)) {
cout << n << " is a square number" << endl;
} else {
cout << n << " is not a square number" << endl;
}
return 0;
}
#include<iostream>2#include<vector>3using namespace std;45bool isSquare(int num) {6 int i = ___①___;7 int bound = ___②___;8 for (; i <= bound; ++i) {9 if (___③___) {10 return ___④___;11 }12 }13 return___⑤___;14}1516int main() {17 int n;18 cin >> n;19 if (isSquare(n)) {20 cout << n << " is a square number" << endl;21 } else {22 cout << n << " is not a square number" << endl;23 }24 return 0;25}- 36(④)多选空位 ④3 分
④ 处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
第 1 题
(判断平方数) 问题:给定一个正整数 n,希望判断这个数是否为完全平方数,即存在一个正整数 x,使得 x 的平方为 n。
试补全程序。
#include<iostream>
#include<vector>
using namespace std;
bool isSquare(int num) {
int i = ___①___;
int bound = ___②___;
for (; i <= bound; ++i) {
if (___③___) {
return ___④___;
}
}
return___⑤___;
}
int main() {
int n;
cin >> n;
if (isSquare(n)) {
cout << n << " is a square number" << endl;
} else {
cout << n << " is not a square number" << endl;
}
return 0;
}
#include<iostream>2#include<vector>3using namespace std;45bool isSquare(int num) {6 int i = ___①___;7 int bound = ___②___;8 for (; i <= bound; ++i) {9 if (___③___) {10 return ___④___;11 }12 }13 return___⑤___;14}1516int main() {17 int n;18 cin >> n;19 if (isSquare(n)) {20 cout << n << " is a square number" << endl;21 } else {22 cout << n << " is not a square number" << endl;23 }24 return 0;25}- 37(⑤)单选空位 ⑤3 分
⑤ 处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(2)(精明与糊涂)有 N 个人,分为两类:
i) 精明人:永远能正确判断其他人是精明还是糊涂;
ii)糊涂人:判断不可靠,会给出随机的判断。
已知精明人严格占据多数,即如果精明人有 k 个,则满足 k>N/2。
你只能通过函数 query(i,j) 让第 i 个人判断第 j 个人:返回 true 表示判断结果为“精明人”;返回 false 表示判断结果为“糊涂人”。你的目标是,通过这些互相判断,找出至少一个百分之百确定的精明人。同时,你无需关心 query(i,j) 的内部实现。
以下程序利用“精明人占多数”的优势。设想一个“消除”的过程,让人们互相判断并进行抵消。经过若干轮抵消后,最终留下的候选人必然属于多数派,即精明人。
例如,假设有三人 0,1,2。如果 0 说 1 是糊涂人,而 1 也说 0 是糊涂人,则 0 和 1 至少有一个是糊涂人。程序将同时淘汰 0 和 1。由于三人里至少有两个精明人,我们确定 2 是精明人。
试补全程序。
#include <iostream>2#include <vector>3using namespace std;45int N;6bool query(int i, int j);78int main() {9 cin >> N;1011 int candidate = 0;12 int count = __①__;13 for (int i = 1; i < N; ++i) {14 if (__②__) {15 candidate = i;16 count = 1;17 } else {18 if (__③__) {19 __④__;20 } else {21 count++;22 }23 }24 }25 cout << __⑤__ << endl;26 return 0;27}- 39(②)单选空位 ②3 分
②处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(2)(精明与糊涂)有 N 个人,分为两类:
i) 精明人:永远能正确判断其他人是精明还是糊涂;
ii)糊涂人:判断不可靠,会给出随机的判断。
已知精明人严格占据多数,即如果精明人有 k 个,则满足 k>N/2。
你只能通过函数 query(i,j) 让第 i 个人判断第 j 个人:返回 true 表示判断结果为“精明人”;返回 false 表示判断结果为“糊涂人”。你的目标是,通过这些互相判断,找出至少一个百分之百确定的精明人。同时,你无需关心 query(i,j) 的内部实现。
以下程序利用“精明人占多数”的优势。设想一个“消除”的过程,让人们互相判断并进行抵消。经过若干轮抵消后,最终留下的候选人必然属于多数派,即精明人。
例如,假设有三人 0,1,2。如果 0 说 1 是糊涂人,而 1 也说 0 是糊涂人,则 0 和 1 至少有一个是糊涂人。程序将同时淘汰 0 和 1。由于三人里至少有两个精明人,我们确定 2 是精明人。
试补全程序。
#include <iostream>2#include <vector>3using namespace std;45int N;6bool query(int i, int j);78int main() {9 cin >> N;1011 int candidate = 0;12 int count = __①__;13 for (int i = 1; i < N; ++i) {14 if (__②__) {15 candidate = i;16 count = 1;17 } else {18 if (__③__) {19 __④__;20 } else {21 count++;22 }23 }24 }25 cout << __⑤__ << endl;26 return 0;27}- 40(③)单选空位 ③3 分
③处应填( )