2.二维数组
二维数组定义
当一维数组元素的类型也是一个维数组时,构成了一个“数组的数组”,即二维数组,二维数组定义的一般格式为:
数据类型 数组名[常量表达式1][常量表达式2]
示例
int a[100][3];
bool a[10][4];
二维数组元素引用
<数组名>[下标][下标]
输出数组内容
int a[10][10] = {};
cout << a[0][1];
cout << a[0][2];
数组内容输入
int a[10][10];
for (int i = 0;i <10;i++){
for(int j = 0;j < 10;j++){
cin >> a[i][j];
}
}
二维数组初始化
//单独进行元素设置
int direct[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
int direct[4][2] = {1,0,0,1,-1,0,0,-1};
//统一进行元素设置
int a[10][10] = {1};
二维数组应用
2041:【例5.9】新矩阵
已知一个$n×n(2≤n≤20)$的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵。
- 由于是一个二维矩阵,因此可以使用二维数组进行存储
int n;
cin >> n;
int a[n][n];
//进行内容输入
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin >> a[i][j];
}
}
- 对角线的元素进行求和操作
//计算主对角线,主对角线的元素下标都是一致的
for(int i=0;i<n;i++){
a[i][i] += 10;
}
//计算次对角线
for(int i=0;i<n;i++){
if (i == n - i - 1){
continue;
}
a[i][n-i-1] += 10;
}
- 进行结果输出
//输出
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout << a[i][j] << " ";
}
cout << endl;
}
练习:1119:矩阵交换行
练习:1121:计算矩阵边缘元素之和
2042:【例5.10】稀疏矩阵
$n×m$矩阵大部分元素是0的矩阵称为稀疏矩阵,假设有k个非0元素,则可把稀疏矩阵用$K×3$的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非元素的值。
- 由于是一个结果是一个二维矩阵,因此可以创建一个二维数组进行存储,数组的行可以尽量大
int n,m,temp;
cin >> n >> m;
int b[1000][3] = {0};
- 进行数组输入,由于只需要其中不为0的数据,因此可以一边读取一边进行行、列和值的存放
//进行内容输入
int number = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> temp;
if (temp!= 0){
b[number][0] = i + 1; //放置行号
b[number][1] = j + 1; //放置列号
b[number][2] = temp; //放置数值
number ++; //number用于记录存储在第几行
}
}
}
- 进行内容输出
//进行内容输出
for(int i=0;i < number;i++){
cout << b[i][0] << " " << b[i][1] << " " << b[i][2] << endl;
}
2043:【例5.11】杨辉三角形
例5.11 打印杨辉三角形的前$n(2≤n≤20)$行。杨辉三角形如下图
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
- 建立一个存储杨辉三角的容器,最多20行,因此$20 \times20$即可
int n;
cin >> n;
int a[20][20];
- 第一行数据为固定,因此可以直接赋值
a[0][0] = 1;
- 根据杨辉三角特点,元素=上一行当前列元素 + 上一行前一列元素,且每一行的第一个和最后一个元素都为1
//构建杨辉三角
for(int i=1;i<n;i++){
for(int j=0;j <= i;j++){
if (j == 0 or j == i){
a[i][j] = 1;
continue;
}
a[i][j] = a[i-1][j] + a[i-1][j-1];
}
}
练习:1124:矩阵加法
2044:【例5.12】回文字串
输入一串字符,字符个数不超过100100,且以“.
”结束。 判断它们是否构成回文。
- 对于cpp中的字符串,需要以以下方式进行定义
char a[200] = "";
- 该字符串写法来自于C语言当中,称之为C风格字符串
- 该字符串的本质是一个字符数组,一个由字符所组成的一维数组
- 规定了该字符数组的长度为200,但最多存放199个字符,C风格字符数组中,在所有字符后面会有一个0作为字符串结果
- 字符数组可以使用$cin$进行输入
//cin还自动在末尾添加\0,形成一个字符串
cin >> a;
- 找到.符号的下标,知道字符串的结束位置
//找到.的下标
for(i=0;i<200;i++){
if (a[i] == '.') break;
}
- 用开头和末尾进行比较,确定是否是回文字符串
int left = 0,right = i-1;
bool is = true;
while(left <= right){
if (a[left] != a[right]){
is = false;
break;
}
left++;right--;
}
- 输出最后结果
if (is){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
1129:统计数字字符个数
作业应用
1120:同行列对角线的格
- 代码
1125:矩阵乘法
计算两个矩阵的乘法。n×m阶的矩阵A乘以m×k阶的矩阵B得到的矩阵C 是n×k阶的,且C[i][j] = A[i][0]×B[0][j] + A[i][1]×B[1][j] + …… +A[i][m-1]×B[m-1]j。
- 代码
2044 1119 1124