数组与多维数组
数组与多维数组
数组与数组下标;数组的读入与输出;二维数组与多维数组。
概念
数组把相同类型的元素连续存放,用下标 0 … n-1 访问。一维数组适合序列;二维 a[i][j] 可表示矩阵或「行×列」表格,多维类推。读入输出常配合循环:for 遍历下标再 cin/cout。与 cspj.cpp.string 的区别:字符数组/string 专管文本,通用数组元素类型任意。与 cspj.cpp.pointer 的区别:数组名在多数表达式中会 decay 为指针,但本叶子侧重下标与维度,不展开指针算术。阅读程序爱考边界 a[n] 是否越界、二维第二维长度;完善程序爱考循环上界与数组定义长度是否一致。
CSP-J 常考
cspj-r1-2019第 17、24 题:阅读程序判断数组下标访问、二维遍历是否越界或结果正确。cspj-r1-2020第 16 题:阅读程序,跟踪数组元素在循环中的更新。cspj-r1-2021第 16 题:阅读程序,考查数组读入与下标范围。cspj-r1-2023第 24 题:阅读程序选择题,涉及数组元素关系或下标表达式。
const int N = 3;
int a[N][N] = {{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
cout << a[i][j] << " ";
cout << endl;
易错点
- 定义
int a[10]合法下标是 0–9,循环写i <= 10或访问a[10]越界,阅读题「输入不超过定义范围」仍可能在逻辑上访问非法下标。 - 二维数组
a[i][j]中行列下标对调是常见笔误,完善程序空位要对照题意「第 i 行第 j 列」。 - 数组作函数参数时会退化为指针,若阅读程序把数组
sizeof与指针sizeof混问,要分开算。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <cstdio>2#include <cstring>3using namespace std;4char st[100];5int main() {6 scanf("%s", st);7 int n = strlen(st);8 for (int i = 1; i <= n; ++i) {9 if (n % i == 0) {10 char c = st[i - 1];11 if (c >= 'a')12 st[i - 1] = c - 'a' + 'A';13 }14 }15 printf("%s", st);16 return 0;17}- 17判断1.5 分
若将第 8 行的
i = 1改为i = 0,程序运行时会发生错误。()
整组作答后提交批改,成绩计入掌握度 · 已答 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 行含换行,已恢复。
已按官方原件恢复:现为原卷原文
- 24判断1.5 分
a[i]和b[i]不可能同时大于 0。()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <cstdlib>2#include <iostream>3using namespace std;45char encoder[26] = {'C', 'S', 'P', 0};6char decoder[26];78string st;910int main() {11 int k = 0;12 for (int i = 0; i < 26; ++i)13 if (encoder[i] != 0) ++k;14 for (char x = 'A'; x <= 'Z'; ++x) {15 bool flag = true;16 for (int i = 0; i < 26; ++i)17 if (encoder[i] == x) {18 flag = false;19 break;20 }21 if (flag) {22 encoder[k] = x;23 ++k;24 }25 }26 for (int i = 0; i < 26; ++i)27 decoder[encoder[i] - 'A'] = i + 'A';28 cin >> st;29 for (int i = 0; i < st.length(); ++i)30 st[i] = decoder[st[i] - 'A'];31 cout << st;32 return 0;33}- 16判断1.5 分
输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2using namespace std;34int n;5int a[1000];67int f(int x)8{9 int ret = 0;10 for (; x; x &= x - 1) ret++;11 return ret;12}1314int g(int x)15{16 return x & -x;17}1819int main()20{21 cin >> n;22 for (int i = 0; i < n; i++) cin >> a[i];23 for (int i = 0; i < n; i++)24 cout << f(a[i]) + g(a[i]) << ' ';25 cout << endl;26 return 0;27}- 16判断1.5 分
输入的 n 等于 1001 时,程序不会发生下标越界。( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include<iostream>2#include<vector>3#include<algorithm>4using namespace std;56int f(string x,string y){7 int m=x.size();8 int n=y.size();9 vector<vector<int>>v(m+1,vector<int>(n+1,0));10 for(int i=1;i<=m;i++){11 for(int j=1;j<=n;j++){12 if(x[i-1]==y[j-1]){13 v[i][j]=v[i-1][j-1]+1;14 }else{15 v[i][j]=max(v[i-1][j],v[i][j-1]);16 }17 }18 }19 return v[m][n];20}21bool g(string x,string y){22 if(x.size() != y.size()){23 return false;24 }25 return f(x+x,y)==y.size();26}27int main(){28 string x,y;29 cin>>x>>y;30 cout<<g(x,y)<<endl;31 return 0;32}- 24单选3 分
单选题
- 将第19行中的
v[m][n]替换为v[n][m],那么该程序()。
- 将第19行中的