当前位置:网站首页>C语言-7月18日-二维数组的学习

C语言-7月18日-二维数组的学习

2022-08-11 05:30:00 曾铎000811

今天学习了二维数组,先进行知识点的回顾:

二维数组与一位数组一样,也可以使用下标来进行元素的表示 ,数组的下标是从0开始的,例如我在这里给出一个两行三列的二维数组:

int ar[2][3] = {
   {1,2,3},{4,5,6}};

先来看看如何定义并输出二维数组:

数组的行和列都可以通过下标来进行表示(行和列都是从0开始):例如数字1利用下标来表示就是(0,0),数字6就是(1,2)

数组各个元素的表示:

这里注意一点,在数组中数组名代表的就是数据首元素的地址。

在一维数组中,例如我在这里给出一个一维数组br数组的长度可以通过这样来表示:

int len = sizeof(br) / sizeof(br[0]);

在二维数组中,已经不能用数组长度来对数组进行表示,而转化为行和列,也就是坐标,那么如何进行行和列的表示呢?和上面一位数组的表示方法类似:

int row = sizeof(ar) / sizeof(ar[0]);//求二维数组的行
int column = sizeof(ar[0]) / sizeof(ar[0][0]);//求二维数组的列

ar代表数据首元素的地址,sizeof(ar)就是数组的总大小,这里直接看运行结果:

可以看到,结果是24字节。

当表示ar+ 1的地址时 :

可以看到,两个地址相差12,用12 / 4 = 3,单位是元素,所以给数组加1直接就是加一行,因为一行里面有三个元素,所以求二维数组的行就变的十分直观了,例如二维数组ar,数组的总大小除以三个元素的大小(12)也就是行数,我们可以认为,一行也就是一种元素类型,所以ar数组就有两种元素类型,分别是它每一行的首元素地址,故二维数组行可以用数组的总大小除以元素类型,如图:

int row = sizeof(ar) / sizeof(ar[0]);//求二维数组的行

 刚刚好,是两行。

那么列呢?

前面提到ar[0]表示为二维数组中的一行的大小,那么只需要拿到一行中一个单元格的大小然后用一行的大小除以一个的大小即可求出列的个数,如图:

刚好是三列。

作业1: 把一个二维数组的行和列的元素进行互换,存入另一个二维数组中:

我自己写的代码: 

#include<stdio.h>
int main()
{
    int m = 0,n =0;
    printf("请您分别输入几行几列?\n");//让用户决定二维数组的大小、行和列的个数
    scanf("%d%d",&m,&n);
    int ar[m][n];
    int br[n][m];
    printf("请您填充该二维数组的元素:\n");//让用户自己填充二维数组中的大小
    for(int i = 0;i < m;++i){
        for(int j = 0;j < n;++j){
            scanf("%d",&ar[i][j]);
        }
    }
    printf("原始二维数组表示为:\n");//将原始的二维数组进行输出
    for(int i = 0;i < m;++i){
        for(int j = 0;j < n;++j){
            printf("%d ",ar[i][j]);
            br[j][i] = ar[i][j];//在执行这一步的时候,需要特别注意执行的过程,是数组下标的替换,例如在ar中(1,2)代表的是6,赋值给数组br的时候进行下标的替换,这是(1,2)变成了(2,1),所以将数据填充在三行两列中的最右下角的方位。
        }
        printf("\n");
    }
    printf("经过调换后的二维数组表示为:\n");//将调换后的二维数组进行输出
     for(int i = 0;i < n;++i){
        for(int j = 0;j < m;++j){
            printf("%d ",br[i][j]);
        }
        printf("\n");
    }
    return 0;
}

运行结果为:

输出完成  

老师讲的代码:

#define COLUMN 3
#define ROW 2//宏定义行和列分别为2和3
#include<stdio.h>
void SwapArr(int ar[][COLUMN],int (*br)[ROW])
{
    for(int i = 0;i < ROW;++i){
        for(int j = 0;j < COLUMN;++j){
            br[j][i] = ar[i][j];//下标赋值替换
        }
        printf("\n");
    }
}
int main()
{
    int ar[ROW][COLUMN] = {1,2,3,4,5,6};
    int br[COLUMN][ROW];
    SwapArr(ar,br);
    for(int i = 0;i < COLUMN;++i){
        for(int j = 0;j < ROW;++j){
            printf("%d ",br[i][j]);
        }
        printf("\n");
    }
}

运行结果为:

输出完成

打印出如下图形:

这个图形的规律很简单,第一行和每一行的起始和末尾都是1,其余的每个数字都是前一行列不变的元素加1:

#include<stdio.h>
#include<assert.h>
const int size = 6;
void Print_Trangle(int(*ar)[size],int row,int column)
{
    for(int i = 0;i < row;++i){
        for(int j = 0;j <= i;++j){
            if(j == 0 || j ==i){
                ar[i][j] = 1;
            }
            else{
                ar[i][j] = ar[i - 1][j] + 1;
            }
        }
    }
}
int main()
{
    int ar[size][size];
    Print_Trangle(ar,size,size);
    for(int i = 0;i < size;++i){
        for(int j = 0;j <= i;++j){
            printf("%d ",ar[i][j]);
        }
        printf("\n");
    }
    return 0;
}

运行结果为:

输出完成

 作业2:打印杨辉三角:

#include<stdio.h>
#include<assert.h>
const int size = 11;
void Print_Trangle(int(*ar)[size],int row,int column)
{
    for(int i = 0;i < row;++i){
        for(int j = 0;j <= i;++j){
            if(j == 0 || j ==i){
                ar[i][j] = 1;
            }
            else{
                ar[i][j] = ar[i - 1][j] + ar[i - 1][j - 1];
            }//杨辉三角的核心语句,每一个元素等于这个元素相同位置的前一行元素,加上前一行前一列元素。
        }
    }
}
int main()
{
    int ar[size][size];
    Print_Trangle(ar,size,size);
    for(int i = 0;i < size;++i){
        for(int j = 0;j <= i;++j){
            printf("%d ",ar[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 运行结果为:

输出完成

以上两种图形均为二维数组类型,只需要理解二维数组内元素与元素之间的关系,再将其转化为编程语言即可完成打印。 

原网站

版权声明
本文为[曾铎000811]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45571585/article/details/125856633