1.1维数组
2.数组元素的移动
3.字符数组,字符串
3.2维数组(数组嵌套)
登录以参加训练计划
C++ 数组详解 - CSP-J 核心知识点
面向10-14岁学生,结合CSP-J考纲整理的数组知识点
目录
- 一维数组
- 数组元素的移动
- 字符数组与字符串
- 二维数组(数组嵌套)
1. 一维数组
数组概念
数组是相同类型数据的有序集合,可以存储多个值
// 数组声明语法
数据类型 数组名[数组大小];
数组基本操作
#include <iostream>
using namespace std;
int main() {
// 1. 声明数组
int scores[5]; // 存储5个学生成绩
// 2. 初始化数组
int primes[5] = {2, 3, 5, 7, 11};
// 3. 访问数组元素(下标从0开始)
scores[0] = 95; // 第一个学生成绩
scores[1] = 88; // 第二个学生成绩
// 4. 遍历数组
cout << "前5个质数: ";
for(int i = 0; i < 5; i++) {
cout << primes[i] << " ";
}
// 输出: 2 3 5 7 11
return 0;
}
数组特点总结表
特点 | 说明 | 注意事项 |
---|---|---|
连续存储 | 内存中连续存放 | 访问速度快 |
固定大小 | 声明时确定大小 | 不能动态改变 |
下标访问 | 从0开始到size-1 | 越界访问危险 |
类型一致 | 所有元素类型相同 | 不能混合类型 |
2. 数组元素的移动
三种常见移动操作
- 左移
- 右移
- 反转
数组左移示例
#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
// 保存第一个元素
int temp = arr[0];
// 左移操作
for(int i = 0; i < 4; i++) {
arr[i] = arr[i+1];
}
// 将第一个元素放到最后
arr[4] = temp;
cout << "左移后: ";
for(int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
// 输出: 2 3 4 5 1
return 0;
}
数组反转示例
#include <iostream>
using namespace std;
int main() {
int arr[6] = {10, 20, 30, 40, 50, 60};
// 反转算法
int start = 0;
int end = 5; // 最后一个元素下标
while(start < end) {
// 交换元素
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
// 移动指针
start++;
end--;
}
cout << "反转后: ";
for(int i = 0; i < 6; i++) {
cout << arr[i] << " ";
}
// 输出: 60 50 40 30 20 10
return 0;
}
移动操作应用场景
操作 | 应用场景 | 时间复杂度 |
---|---|---|
左移/右移 | 循环队列 | O(n) |
反转 | 回文判断 | |
删除元素 | 数组压缩 | |
插入元素 | 有序数组插入 |
3. 字符数组与字符串
字符数组 vs 字符串
// 字符数组
char name1[6] = {'J', 'o', 'h', 'n', '\0'};
// 字符串
char name2[] = "Alice"; // 自动添加'\0'
字符串常用函数
#include <iostream>
#include <cstring> // 字符串函数库
using namespace std;
int main() {
char str1[20] = "Hello";
char str2[20] = "World";
// 1. 字符串长度
cout << "str1长度: " << strlen(str1) << endl; // 5
// 2. 字符串复制
strcpy(str1, str2); // str1变为"World"
// 3. 字符串连接
strcat(str1, "!"); // str1变为"World!"
// 4. 字符串比较
int result = strcmp("apple", "banana");
if(result < 0) {
cout << "apple在banana前面";
}
return 0;
}
字符串输入输出
#include <iostream>
using namespace std;
int main() {
char name[20];
// 安全输入(避免溢出)
cout << "请输入姓名: ";
cin.getline(name, 20); // 最多读取19个字符
cout << "你好, " << name << "!" << endl;
// 遍历字符串
cout << "字母分解: ";
for(int i = 0; name[i] != '\0'; i++) {
cout << name[i] << " ";
}
return 0;
}
字符串处理技巧
- 大小写转换
for(int i = 0; str[i]; i++) { if(islower(str[i])) str[i] = toupper(str[i]); }
- 统计字符出现次数
int count = 0; for(int i = 0; str[i]; i++) { if(str[i] == 'a') count++; }
- 字符串反转
int len = strlen(str); for(int i = 0; i < len/2; i++) { swap(str[i], str[len-1-i]); }
4. 二维数组(数组嵌套)
二维数组概念
二维数组是"数组的数组",常用于表示表格、矩阵
// 二维数组声明
数据类型 数组名[行数][列数];
二维数组基本操作
#include <iostream>
using namespace std;
int main() {
// 1. 声明并初始化二维数组
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 2. 访问元素
cout << "第二行第三列: " << matrix[1][2] << endl; // 7
// 3. 遍历二维数组
cout << "矩阵内容:\n";
for(int i = 0; i < 3; i++) { // 行循环
for(int j = 0; j < 4; j++) { // 列循环
cout << matrix[i][j] << "\t";
}
cout << endl; // 每行结束换行
}
// 4. 计算行和
for(int i = 0; i < 3; i++) {
int rowSum = 0;
for(int j = 0; j < 4; j++) {
rowSum += matrix[i][j];
}
cout << "第" << i+1 << "行和: " << rowSum << endl;
}
return 0;
}
二维数组应用
矩阵乘法
#include <iostream>
using namespace std;
int main() {
int A[2][3] = {{1,2,3}, {4,5,6}};
int B[3][2] = {{7,8}, {9,10}, {11,12}};
int C[2][2] = {0}; // 结果矩阵初始化为0
// 矩阵乘法
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int k = 0; k < 3; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
// 输出结果
cout << "矩阵乘法结果:\n";
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
cout << C[i][j] << "\t";
}
cout << endl;
}
/* 输出:
58 64
139 154
*/
return 0;
}
迷宫寻路(简化版)
#include <iostream>
using namespace std;
int main() {
// 0表示可通行,1表示障碍
int maze[5][5] = {
{0, 1, 0, 0, 0},
{0, 1, 0, 1, 0},
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 0},
{0, 0, 0, 1, 0}
};
// 起点(0,0)到终点(4,4)
int x = 0, y = 0;
while(x != 4 || y != 4) {
maze[x][y] = 2; // 标记路径
// 优先向右走
if(y < 4 && maze[x][y+1] == 0) {
y++;
}
// 其次向下走
else if(x < 4 && maze[x+1][y] == 0) {
x++;
}
}
maze[4][4] = 2; // 标记终点
// 输出迷宫路径
cout << "迷宫路径(2表示路径):\n";
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
cout << maze[i][j] << " ";
}
cout << endl;
}
return 0;
}
数组知识点总结表
数组类型 | 特点 | 应用场景 |
---|---|---|
一维数组 | 线性存储 | 成绩管理、数列存储 |
数组移动 | 元素位置变换 | 数据轮转、队列操作 |
字符数组 | 存储字符序列 | 姓名、单词处理 |
字符串 | 以'\0'结尾 | 文本处理、信息存储 |
二维数组 | 行列结构 | 矩阵运算、表格数据、地图 |
学习建议:
- 理解数组下标从0开始
- 掌握数组遍历的标准模式
- 注意数组边界避免越界
- 二维数组先行后列的访问顺序
- 字符串操作注意'\0'结束符
"数组是数据的集装箱,学会使用数组就掌握了批量处理数据的钥匙!"
数组常见错误
// 错误1:数组越界
int arr[5];
arr[5] = 10; // 有效下标是0-4
// 错误2:未初始化直接使用
int scores[10];
cout << scores[0]; // 值不确定
// 错误3:字符串未预留结束符空间
char name[5] = "David"; // 需要6个空间(D,a,v,i,d,\0)
// 错误4:二维数组行列颠倒
int matrix[3][4];
matrix[2][3] = 5; // 正确
matrix[3][2] = 5; // 行越界
数组与循环关系图
一维数组 → 单层循环遍历
二维数组 → 双层嵌套循环遍历
字符串 → 循环直到'\0'
数组移动 → 循环+临时变量
章节 6. 连续性元素
开放
题目 | 尝试 | AC | 难度 |
---|---|---|---|
P679 【基础】统计每个数出现的次数 | 0 | 0 | (无) |
P812 【基础】连胜统计 | 0 | 0 | (无) |
P813 【基础】连胜王 | 0 | 0 | (无) |
921 【基础】温度统计员 | 0 | 0 | (无) |
P531 【基础】分数计数 | 0 | 0 | (无) |
P516 【基础】小X数字母 | 0 | 0 | (无) |
P926 【入门】投篮 | 0 | 0 | (无) |
章节 7. 数组综合
开放
题目 | 尝试 | AC | 难度 |
---|---|---|---|
590 【基础】相加之和最大,并给出它们的起始位置 | 0 | 0 | (无) |
928 【基础】等比数 | 0 | 0 | (无) |
549 【基础】既生瑜,何生亮! | 0 | 0 | (无) |
593 【基础】下载电影 | 0 | 0 | (无) |
P147 【入门】数字交换 | 0 | 0 | (无) |
P149 【基础】求子序列的个数 | 0 | 0 | (无) |
664 【入门】Fish学数学 | 0 | 0 | (无) |
697 【基础】邮票组合 | 0 | 0 | (无) |
709 【基础】合唱队形 | 0 | 0 | (无) |
763 【入门】立定跳远成绩求解 | 0 | 0 | (无) |
772 【入门】需要安排几位师傅加工零件? | 0 | 0 | (无) |
774 【入门】柱状图 | 0 | 0 | (无) |
779 【入门】兴趣班的排班 | 0 | 0 | (无) |
853 【基础】补发礼物 | 0 | 0 | (无) |
916 【入门】淘淘捡西瓜 | 0 | 0 | (无) |
919 【入门】小鱼比可爱 | 0 | 0 | (无) |
931 【入门】校门外的树 | 0 | 0 | (无) |
932 【基础】并集与交集 | 0 | 0 | (无) |
P511 【基础】小 X 与数字(ten) | 0 | 0 | (无) |
P527 【基础】洗牌 | 0 | 0 | (无) |
P533 【提高】买木头 | 0 | 0 | (无) |
P535 【基础】植树 | 0 | 0 | (无) |
P536 【提高】洗牌2 | 0 | 0 | (无) |
P731 【基础】珠子计算 | 0 | 0 | (无) |
P734 【入门】数数游戏 | 0 | 0 | (无) |
P778 【基础】集合运算 | 0 | 0 | (无) |
P784 【入门】数组查找及替换 | 0 | 0 | (无) |
P890 【入门】标准零件 | 0 | 0 | (无) |
P891 【基础】奖学金 | 0 | 0 | (无) |
- 参加人数
- 13
- 创建人