二维阵法(数组)的学习与应用

目录

一、二维数组的初始化

1.指定行数和列数、完全初始化

2.指定部分行数和列数、部分初始化

3.根据初始化列表自动确定行数

二、二维数组的遍历

1.嵌套for循环——实现二维数组的遍历

三、二维数组的计算、判断

1.计算——二维数组元素的总和

2.判断——某个元素是否存在

四、二维数组的应用——重新摆弄柜子

1.分析

2.设计

变量设计

算法设计

3.编码

4.测试运行


一、二维数组的初始化

在C语言中,二维数组本质上是由多个一维数组组合而成的。

对二维数组进行初始化时,有多种方式。

1.指定行数和列数、完全初始化

需要明确指定二维数组的行数和列数,并且要为数组中的每个元素都提供初始值。

其语法格式为:

数据类型 数组名[行数][列数] = { 
    {元素1行1列, 元素1行2列, ...},
    {元素2行1列, 元素2行2列, ...},
    ...

};

如:定义一个2行3列的二维数组,每个元素都被赋予了初始值。

#include <stdio.h>

int main() {
    
    int arr[2][3] = { 
        {1, 2, 3}, 
        {4, 5, 6} 
    };
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

⬇️

2.指定部分行数和列数、部分初始化

和上述描述的方法一样,只需要为部分元素提供初始值,未指定初始值的元素会被自动初始化为0

其语法格式为:

数据类型 数组名[行数][列数] = {

{元素1行部分列},

{元素2行部分列},

...

};

如,定义一个3行4列的二维数组,部分初始化;其中arr数组部分元素被初始化,未初始化元素为0。

#include <stdio.h>

int main() {

    int arr[3][4] = { 
        {1, 2}, 
        {3}, 
        {4, 5, 6}
    };
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

⬇️

3.根据初始化列表自动确定行数

当省略行数时,编译器会依据初始化列表的内容自动确定行数,但列数必须明确指定。

其语法格式为:

数据类型 数组名[][列数] = {

{元素1行},

{元素2行},

...

};

如,定义一个二维数组,省略行数,由编译器自动确定

#include <stdio.h>

int main() {
    
    int arr[][3] = { 
        {1, 2, 3}, 
        {4, 5, 6}, 
        {7, 8, 9} 
    };
    int rows = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

⬇️

二、二维数组的遍历

对二维数组进行遍历,常用的方法是使用嵌套的for循环。

1.嵌套for循环——实现二维数组的遍历

外层的for循环用于控制行数,内层的for循环用于控制列数。

#include <stdio.h>

int main() {
    int arr[3][4] = { 
        {1, 2, 3, 4}, 
        {5, 6, 7, 8}, 
        {9, 10, 11, 12} 
    };
    // 行数
    for (int i = 0; i < 3; i++) {
        // 列数
        for (int j = 0; j < 4; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

⬇️

 

三、二维数组的计算、判断

1.计算——二维数组元素的总和

计算二维数组元素的总和,可以使用嵌套的for循环遍历数组,将每个元素累加到一个变量中。

#include <stdio.h>

int main() {
    int arr[3][4] = { 
        {1, 2, 3, 4}, 
        {5, 6, 7, 8}, 
        {9, 10, 11, 12} 
    };
    int sum = 0;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            sum += arr[i][j];
        }
    }
    printf("元素的总和为 %d\n", sum);
    return 0;
}

⬇️

 

  • sum变量用于存储数组元素的总和,通过嵌套的for循环遍历数组并累加元素值 

2.判断——某个元素是否存在

判断某个元素是否存在于二维数组中,同样使用嵌套的for循环遍历数组,若找到目标元素则返回相应信息。

#include <stdio.h>

int main() {
    int arr[3][4] = { 
        {1, 2, 3, 4}, 
        {5, 6, 7, 8}, 
        {9, 10, 11, 12} 
    };

    int target;
    printf("查找的值为: ");
    scanf("%d", &target);

    int found = 0;
    //这里的found作为一个布尔值,来判断是否在该二维数组中
    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 4; j++){
            if(arr[i][j] == target){
                found = 1;
                break;
            }
        }
        if(found){
            break;
        }
    }
    if(found){
        printf("%d在二维数组中\n", target);
    }else{
        printf("%d不在二维数组中\n", target);
    }
    return 0;
}

case1

case2

四、二维数组的应用——重新摆弄柜子

Q12:想当初好歹是个大宗门外门弟子的你现在已经沦落到这个地步,你叹了口气,不经感叹真是虎落平阳被犬欺啊。

掌柜的看出了你的心不在焉,让你重新收拾下柜子里的东西。

原先如果是这样排列的柜子:

1 2 3

4 5 6

你需要把它排成这样

1 4

2 5

3 6 

如果将柜子和柜子里的物体看成二维数组的话, 你需要做的就是将行和列互换。

这种苦力你怎么可能老老实实的干呢,你再次悄咪咪的打开了C语言编译器...

1.分析

如果说输入的是 n*m 矩阵的话,需要将它转换为 m*n 矩阵,原来矩阵的行变成列,原矩阵的列变成转置后的行。

2.设计

变量设计

  • rows 矩阵的行数
  • cols 矩阵的列数
  • before[max_rows][max_cols] 二维数组,用于存储原来的矩阵
  • after[max_cols][max_rows] 二维数组,用于存储转换后的矩阵

算法设计

  1. 用户输入矩阵的行和列
  2. 依次输入矩阵的元素
  3. 将原矩阵的值赋给后矩阵
  4. 输出转换后的矩阵

3.编码

#include <stdio.h>
int main() {
    int max_rows = 100,max_cols = 100;
    int before[max_rows][max_cols];
    int after[max_cols][max_rows];

    int rows, cols;
    // 输入矩阵的行数和列数
    printf("输入行数和列数:");
    scanf("%d %d", &rows, &cols);

    // 输入矩阵元素
    printf("依次输入矩阵元素:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            scanf("%d", &before[i][j]);
        }
    }

    // 进行转置操作
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            after[j][i] = before[i][j];
        }
    }

    // 输出转置后的矩阵
    printf("转置后的矩阵为:\n");
    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {
            printf("%d ", after[i][j]);
        }
        printf("\n");
    }

    return 0;
}    

4.测试运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值