1.1维数组 2.数组元素的移动 3.字符数组,字符串 3.2维数组(数组嵌套)

登录以参加训练计划

C++ 数组详解 - CSP-J 核心知识点

面向10-14岁学生,结合CSP-J考纲整理的数组知识点

目录

  1. 一维数组
  2. 数组元素的移动
  3. 字符数组与字符串
  4. 二维数组(数组嵌套)

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. 数组元素的移动

三种常见移动操作

  1. 左移
  2. 右移
  3. 反转

数组左移示例

#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;
}

字符串处理技巧

  1. 大小写转换
    for(int i = 0; str[i]; i++) {
        if(islower(str[i])) 
            str[i] = toupper(str[i]);
    }
    
  2. 统计字符出现次数
    int count = 0;
    for(int i = 0; str[i]; i++) {
        if(str[i] == 'a') count++;
    }
    
  3. 字符串反转
    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'结尾 文本处理、信息存储
二维数组 行列结构 矩阵运算、表格数据、地图

学习建议

  1. 理解数组下标从0开始
  2. 掌握数组遍历的标准模式
  3. 注意数组边界避免越界
  4. 二维数组先行后列的访问顺序
  5. 字符串操作注意'\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'
数组移动 → 循环+临时变量

章节 1. 数组基础

开放

题目 尝试 AC 难度
878   【入门】考试成绩的简单统计 20 9 7
581   【入门】查找“支撑数” 16 9 7
582   【入门】找找谁的身高超过全家的平均身高 12 8 8
583   【入门】排除异形基因 13 8 8
585   【入门】输出奇数和偶数 7 6 9
587   【入门】打折优惠 10 6 9
597   【入门】编程输入10个正整数,然后自动按从大到小的顺序输出 4 2 10
603   【入门】求和 9 5 9
725   【入门】摘苹果 5 4 10
760   【入门】橘子称重 3 3 10
803   【入门】拿到某个数的概率是多少? 4 2 10
806   【入门】哪个厂家的零件更标准? 3 1 10
840   【入门】陶陶摘苹果 2 2 10
850   【入门】完美的偶数 4 3 10
854   【入门】浪尖数 4 3 10
1002   【入门】数组逆序 3 3 10
882   【入门】查找含有x的数 0 0 (无)
883   【入门】年龄与疾病 1 1 10
886   【入门】奖学金评级 0 0 (无)
909   【入门】数字之和为x的整数 0 0 (无)
P551   【入门】马里奥的银币2 0 0 (无)
P703   【入门】胜负对决 0 0 (无)
P735   【入门】统计直角、锐角、钝角的个数? 0 0 (无)
P737   【入门】象棋比赛 0 0 (无)
P744   【入门】输入的这些数是否对称 0 0 (无)
P745   【入门】算面积2 0 0 (无)

章节 2. 数组找数

开放

题目 尝试 AC 难度
645   【入门】数组元素的查找 13 5 9
579   【入门】求n个数的最大值和最小值 8 5 10
596   【入门】歌唱比赛评分 13 5 9
598   【入门】最大数 9 4 9
661   【入门】移动数组元素 4 3 10
884   【入门】有趣的折扣 9 4 9
885   【入门】找同学的位置 7 4 10
P550   【入门】马里奥的银币1 7 5 9
P552   【入门】马里奥的银币3 8 5 10
P553   【入门】马里奥花银币 11 4 9
P554   【入门】马里奥找中等的银币 9 3 10
P717   【入门】奇偶数选大王 15 2 9
P718   【入门】采摘活动 5 1 10
P740   【入门】最贵商品和最便宜商品之差 4 2 10
P739   【入门】最贵商品和最便宜商品分别有几个 1 1 10
P732   【入门】买不买 15 8 7
P738   【入门】找出最大的圆 2 1 10
P741   【入门】最后一次出现该数的位置 0 0 (无)
P736   【入门】温度统计 0 0 (无)

章节 3. 元素的移动

开放

题目 尝试 AC 难度
584   【入门】最小数 5 3 10
586   【入门】数组元素的移动 3 3 10
717   【入门】数组元素的插入 3 3 10
588   【入门】元素插入有序数组 3 3 10
589   【入门】数组元素的删除 3 3 10
662   【入门】删除数组的最小数 6 3 10
663   【入门】在最大数后面插入一个数 3 3 10
665   【入门】小明排队做操迟到 4 3 10
678   【入门】换位置 4 3 10

章节 4. 数组排序

开放

题目 尝试 AC 难度
1013   【入门】数组元素的排序 19 8 7
594   【基础】数的排序 22 7 7
P148   【入门】寻找第K大数 22 7 7
604   【入门】语文成绩 17 8 7
668   【入门】优秀成绩的平均分 16 9 7
679   【入门】求中位数 29 8 7
686   【基础】第K大与第K小数 8 4 10
852   【入门】学员的名次 14 6 8
910   【入门】n个一位数能够组成的最大数 8 6 9
911   【入门】n个一位数能够组成的最小数 11 4 9
912   【入门】橘子排队 8 3 10
914   【入门】允许并列的排名 10 5 9
915   【入门】允许并列的排名2 5 3 10
918   【入门】粉碎数字 0 0 (无)
934   【入门】去掉x个最高最低分后的平均分 0 0 (无)
962   【入门】宇宙总统 0 0 (无)
P743   【入门】排名第二高的成绩 0 0 (无)

章节 5. 数组计数法

开放

题目 尝试 AC 难度
P810   【入门】求n个数中每个数出现的次数 2 1 10
P809   【入门】求n个数中出现次数最多的数 2 1 10
P719   【入门】声音识别 3 1 10
P154   【入门】COUNT 2 2 10
P156   【入门】数字出现次数 13 2 9
612   【基础】去除重复数字 2 1 10
781   【基础】扑克牌组合 0 0 (无)
933   【入门】找筷子 2 1 10
P529   【基础】夏令营小旗手 3 1 10
608   【入门】求N个整数的平均数、众数和中位数 1 1 10
P929   【入门】选班委 10 0 10
P953   【入门】缺失的数字 7 1 10