- 分享
一维数组教程
- @ 2025-9-25 13:40:07
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 条评论
目前还没有评论...