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,然后输出这个新矩阵。


  1. 由于是一个二维矩阵,因此可以使用二维数组进行存储
  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];
     }
  }

  1. 对角线的元素进行求和操作
  //计算主对角线,主对角线的元素下标都是一致的
  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;
  }

  1. 进行结果输出
  //输出
  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$的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非元素的值。


  1. 由于是一个结果是一个二维矩阵,因此可以创建一个二维数组进行存储,数组的行可以尽量大
int n,m,temp;
cin >> n >> m;
int b[1000][3] = {0};

  1. 进行数组输入,由于只需要其中不为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用于记录存储在第几行
      }
     }
  }

  1. 进行内容输出
  //进行内容输出
  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

  1. 建立一个存储杨辉三角的容器,最多20行,因此$20 \times20$即可
  int n;
  cin >> n;
  int a[20][20];

  1. 第一行数据为固定,因此可以直接赋值
a[0][0] = 1;
  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,且以“.”结束。 判断它们是否构成回文。


  1. 对于cpp中的字符串,需要以以下方式进行定义
char a[200] = "";
  • 该字符串写法来自于C语言当中,称之为C风格字符串
  • 该字符串的本质是一个字符数组,一个由字符所组成的一维数组
  • 规定了该字符数组的长度为200,但最多存放199个字符,C风格字符数组中,在所有字符后面会有一个0作为字符串结果

  1. 字符数组可以使用$cin$进行输入
//cin还自动在末尾添加\0,形成一个字符串
cin >> a;

  1. 找到.符号的下标,知道字符串的结束位置
  //找到.的下标
  for(i=0;i<200;i++){
    if (a[i] == '.') break;
  }

  1. 用开头和末尾进行比较,确定是否是回文字符串
  int left = 0,right = i-1;
  bool is = true;
  while(left <= right){
    if (a[left] != a[right]){
      is = false;
      break;
    }
    left++;right--;  
  }
  1. 输出最后结果
  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

最后修改:2024 年 06 月 01 日
如果觉得我的文章对你有用,请随意赞赏