输入输出与赋值语句
输入输出与赋值语句
cin 语句、scanf 语句、cout 语句、printf 语句;赋值语句;复合语句。
概念
输入输出与赋值是程序与外部世界交换数据、更新状态的基本手段。C++ 风格用 cin/cout 与流操纵符;C 风格用 scanf/printf 与格式串。赋值 = 把右值算完后写入左值单元;复合赋值 +=、-=、*=… 是「先算再赋」的简写。复合语句 { … } 把多条语句合成一条,常配合分支与循环。本叶子聚焦「怎么读入写出、怎么改变量」,与 cspj.cpp.branch/loop(控制流向哪里走、重复多少次)不同;与 cspj.cpp.file-io(磁盘文件而非标准流)也不同。初赛阅读/完善程序里,cin >> 与 scanf 混用、格式串 %lld 是否匹配类型,是高频细节。
CSP-J 常考
cspj-r1-2025第 38、42 题:完善程序空位,补循环变量初值或累加器赋值(①/⑤处与读入后的状态更新相关)。cspj-r1-2021第 36 题:完善程序空位,选择与输入规模、数组下标配套的赋值或读入语句。cspj-r1-2023第 18 题:阅读程序判断scanf/printf格式与变量类型是否匹配、输出是否符合预期。
int n;
long long sum = 0;
cin >> n;
for (int i = 0; i < n; ++i) {
int x;
cin >> x;
sum += x; // 复合赋值
}
cout << sum << endl;
易错点
scanf("%d", x)漏写&是经典编译/运行坑;printf少写格式项或%lld与long long不对应会输出乱值。- 完善程序空位里
=与==:赋值出现在表达式位置(如if (x = 0))语义完全不同。 - 复合语句缺
{/}时,只有紧挨着的一条语句受分支/循环控制,阅读题要按作用域逐行追踪。
整组作答后提交批改,成绩计入掌握度 · 已答 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}- 36(③)单选空位 ③3 分
③处应填( )
A.i++
B.i = (i + 1) % n
C.c++
D.p ^= 1
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include<iostream>2#include<cmath>3using namespace std;45double f(double a,double b,double c){6 double s=(a+b+c)/2;7 return sqrt(s*(s-a)*(s-b)*(s-c));8}9int main(){10 cout.flags(ios::fixed);11 cout.precision(4);12 13 int a,b,c;14 cin>>a>>b>>c;15 cout<<f(a,b,c)<<endl;16 return 0;17}- 18判断2 分
(2分)程序总是输出四位小数( )
整组作答后提交批改,成绩计入掌握度 · 已答 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}- 38(①)单选空位 ①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}- 42(⑤)单选空位 ⑤3 分
⑤处应填( )