C++ 数组教程

一、一维数组

1.1 数组的定义

数组的定义方式和变量类似。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[10], b[10];     // 定义两个包含10个整数的数组
    float f[33];           // 定义包含33个浮点数的数组
    double d[123];         // 定义包含123个双精度数的数组
    char c[21];            // 定义包含21个字符的数组

    return 0;
}

1.2 数组的初始化

在main函数内部,未初始化的数组中的元素是随机的。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[3] = {0, 1, 2};           // 含有3个元素的数组,元素分别是0, 1, 2
    int b[] = {0, 1, 1};              // 维度是3的数组,自动推断大小
    int c[5] = {0, 1, 2};             // 等价于c[] = {0, 1, 2, 0, 0},未指定元素默认为0
    char d[3] = {'a', 'b', 'c'};      // 字符数组的初始化

    return 0;
}

1.3 访问数组元素

通过下标访问数组,数组下标从0开始

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[3] = {0, 1, 2};  // 数组下标从0开始

    cout << a[0] << ' ' << a[1] << ' ' << a[2] << endl;  // 输出: 0 1 2

    a[0] = 5;  // 修改数组元素

    cout << a[0] << endl;  // 输出: 5

    return 0;
}

二、数组练习题

练习题1:使用数组实现求斐波那契数列的第N项

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    int f[100];  // 存储斐波那契数列

    cin >> n;

    f[0] = 0, f[1] = 1;  // 初始化前两项
    for (int i = 2; i <= n; i ++ ) 
        f[i] = f[i - 1] + f[i - 2];  // 递推公式

    cout << f[n] << endl;

    return 0;
}

练习题2:输入一个n,再输入n个整数,将这n个整数逆序输出

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    int a[100];  // 存储输入的整数

    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> a[i];      // 输入n个整数
    for (int i = n - 1; i >= 0; i -- ) cout << a[i] << ' ';  // 逆序输出
    cout << endl;

    return 0;
}

练习题3:数组旋转

输入n和k,将数组前k个元素旋转到数组末尾。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n, k;
    int a[100];

    cin >> n >> k;
    for (int i = 0; i < n; i ++ ) cin >> a[i];  // 输入数组元素

    // 使用三次反转实现数组旋转
    reverse(a, a + k);        // 反转前k个元素
    reverse(a + k, a + n);    // 反转剩余元素
    reverse(a, a + n);        // 反转整个数组

    for (int i = 0; i < n; i ++ ) cout << a[i] << ' ';
    cout << endl;

    return 0;
}

练习题4:数组排序(冒泡排序)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    int a[n];
    
    for (int i = 0; i < n; i++) cin >> a[i];
    
    // 冒泡排序
    for (int i = 0; i < n - 1; i++) {
        bool swapped = false;
        // 每轮将未排序部分的最大元素"冒泡"到末尾
        for (int j = 0; j < n - i - 1; j++) {
            if (a[j] > a[j + 1]) {
                swap(a[j], a[j + 1]);
                swapped = true;
            }
        }
        // 如果某轮没有交换,说明数组已有序,可以提前退出
        if (!swapped) break;
    }
    
    for (int i = 0; i < n; i++) cout << a[i] << ' ';
    cout << endl;
    
    return 0;
}

练习题5:高精度乘法(2的n次方)

使用数组实现大数运算,计算2的n次方。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int a[10000], size = 1, n;  // a数组存储大数,size表示当前位数
    a[0] = 1;  // 初始值为1

    cin >> n;
    while (n -- )  // 循环n次,每次乘以2
    {
        int t = 0;  // 进位
        for (int i = 0; i < size; i ++ )
        {
            t += a[i] * 2;  // 当前位乘以2加上进位
            a[i] = t % 10;  // 存储当前位
            t /= 10;        // 计算进位
        }
        if (t) a[size ++ ] = t;  // 处理最高位进位
    }

    // 逆序输出结果
    for (int i = size - 1; i >= 0; i -- ) cout << a[i];
    cout << endl;

    return 0;
}

三、多维数组

多维数组就是数组的数组。

3.1 二维数组定义和初始化

int a[3][4]; // 大小为3的数组,每个元素是含有4个整数的数组

int b[3][4] = {         // 三个元素,每个元素都是大小为4的数组
    {0, 1, 2, 3},       // 第1行的初始值
    {4, 5, 6, 7},       // 第2行的初始值
    {8, 9, 10, 11}      // 第3行的初始值
};

3.2 三维数组初始化

int arr[10][20][30] = {0}; // 将所有元素初始化为0
// 大小为10的数组,它的每个元素是含有20个数组的数组
// 这些数组的元素是含有30个整数的数组

3.3 二维数组输入输出

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n, m;
    int arr[50][50];  // 定义二维数组

    cin >> n >> m;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ )
            cin >> arr[i][j];  // 输入二维数组元素

    // 输出二维数组
    for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < m; j ++ )
            cout << arr[i][j] << ' ';
        cout << endl;
    }

    return 0;
}

3.4 螺旋矩阵

输入n和m,创建一个n×m的矩阵,按螺旋顺序填充1到n×m的数字。

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n, m;
    int arr[50][50];

    cin >> n >> m;
    
    bool st[50][50] = {false};  // 标记数组,记录位置是否已访问
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};  // 四个方向:上右下左
    int d = 1, x = 0, y = 0;  // 初始方向向右,起始位置(0,0)
    
    for (int i = 0; i < n * m; i ++ )
    {
        int a = x + dx[d], b = y + dy[d];  // 计算下一个位置
        
        // 如果下一个位置越界或已访问,则改变方向
        if (a < 0 || a >= n || b < 0 || b >= m || st[a][b])
        {
            d = (d + 1) % 4;  // 顺时针旋转90度
            a = x + dx[d], b = y + dy[d];  // 重新计算下一个位置
        }
        
        arr[x][y] = i + 1;  // 填充当前位置
        st[x][y] = true;    // 标记当前位置已访问
        x = a, y = b;       // 移动到下一个位置
    }
    
    // 输出螺旋矩阵
    for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < m; j ++ )
            cout << arr[i][j] << ' ';
        cout << endl;
    }

    return 0;
}

四、数组使用技巧

4.1 数组越界问题

int a[10];
// a[10] = 5;  // 错误!数组下标范围是0-9
// a[-1] = 5;  // 错误!数组下标不能为负

4.2 数组作为函数参数

void printArray(int arr[], int size)  // 数组作为函数参数
{
    for (int i = 0; i < size; i ++ )
        cout << arr[i] << ' ';
    cout << endl;
}

4.3 常用数组算法

  • 排序sort(arr, arr + n) // 快速排序
  • 反转reverse(arr, arr + n) // 数组反转
  • 查找find(arr, arr + n, value) // 查找元素

五、总结要点

🔑 核心概念

  • 数组定义:连续内存空间,相同类型元素
  • 下标访问:从0开始,注意越界问题
  • 初始化:可以部分初始化,未初始化元素为随机值

🛠️ 实用技巧

  • 数组大小:定义时必须是常量或常量表达式
  • 多维数组:理解是"数组的数组"的概念
  • 算法应用:掌握排序、查找、反转等常用算法

🎯 常见应用

  • 数据存储:批量数据的存储和处理
  • 数学计算:高精度运算、矩阵运算
  • 算法实现:排序、查找、动态规划等

⚠️ 注意事项

  • 避免数组越界访问
  • 大数组不要在函数内部定义(栈空间有限)
  • 字符数组要考虑字符串结束符'\0'

数组是C++中最基础也是最重要的数据结构,掌握数组的使用对于后续学习指针、字符串、容器等内容至关重要。建议多加练习,熟悉各种数组操作技巧。

0 条评论

目前还没有评论...