C语言----多维数组(进阶篇二十二)

。。。

  二维数组

    类型名 数组名[常量表达式] [常量表达式];

    如:

      int a[3][3];

    它定义了一个有9个元素的二维数组(3*3),两个维数的下标都是0-2

    初始化:int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};

      或

      int a[3][3]={{0,1},{5},{6,7,8}};

      它相当于

      int a[3][3]={{0,1,0},{5,0,0},{6,7,8}};

    

      int a[2][4]={{0,1},{0}};

      两个数组,每个数组里面有四个元素。

  多维数组的规律

    ※数组其实也是一种嵌套结构,二维数组也叫数组的数组,那么三维数组呢?n维呢?

    ※像Photoshop这样的平面图像处理软件中,经常用到二维数组,处理二维数组通常要用到双重循环。

    ※像3D Max这样的三维图像处理软件中,经常用到三维数组,处理三维数组通常会用到三重循环。

    ※类似Windows资源管理器中的“树状菜单”,经常会用到多维数组。

    程序1

      将一张矩阵笑脸上下翻转成哭脸

 

    也就是说把矩阵a中第0行的数据放到矩阵b中的第3行,第1行放到第2行,第2行放到第1行,第3行放到第0行。经过4次重置,任务完成。

    第一个规律:在4次放置中,b的第一位下标刚好是递减的,a的第一位下标刚好是递增的。无论在哪一排,b的第一位下标数字刚好是3减去a的第一位下标数字。

// 22-1笑脸翻转数组.c

#include <stdio.h>

void fun( int a[4][4] )
{
    //打印数组
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("
");
    }
}


main()
{
    //定义整型数组
    int a[4][4] =       
    { 
        {1,0,0,1},
        {0,1,1,0},
        {0,0,0,1},
        {0,0,0,1}
    };

    fun(a);   //打印数组a

    //翻转将其改变为
    int b[4][4];
    //int b[4][4] =
    //{
    //    {0,0,0,1},
    //    {0,0,0,1},
    //    {0,1,1,0},
    //    {1,0,0,1}
    //};

    printf("翻转后的b数组
 " );
    //翻转数组
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            b[4 - i -1][j] = a[i][j];   //将a的数组值赋值给b
        }
    }

    //打印出翻转的

    fun(b);   //打印出数组b
}

  排序

     程序2   

      将任意5个数按由大到小的顺序排序

      (1)将第1个数与后面所有数比较,如果有比它大的,就与它交换

      (2)将第2个数与后面所有数比较,如果有比它大的,就与它交换

      (3)以此类推,将第n(n=1~5)个数组元素与n+1到n+5个数比较,较大的数字会被选择到第n个元素中

      (4)全部比较完成后,数组已经按从大到小的顺序排好,用循环输出数组

      用5个数来描述以上过程:

        1)57428:5和7比较得:

        2)75428:7和42比,还是原来顺序,与8比较得:

        3)85427:第一轮比较完毕,老大已经出现在第1位。第二轮开始:5跟42比较,还是原来顺序,与7比较得:

        4)87425:第二轮比较完毕,老2已经出现在第2位。第三轮开始:4跟2比较,还是原来顺序,与5比较得:

        5)87524:第三轮比较完毕,老3已经出现在第3位。第四轮开始:2跟4比较得:

        6)87542:第四轮比较完毕,老4已出现在第4位。最后一位不用比,排序结果已经出来。

// 22-2数组排序.c
//57428

#include <stdio.h>

//排序函数
int fun(int a[],int length)
{
    int max;    //中间变量
    for (int i = 0; i < length ; i++)
    {
        for (int j = 0; j < length-1; j++)
        {
            if (a[j] < a[j + 1])
            {
                max = a[j + 1];    //最大值数据交换
                a[j + 1] = a[j];        
                a[j] = max;
            }
        }
    }
}

main()
{
    int a[5] = { 5,7,4,2,8 };
    int length = sizeof(a) / sizeof(a[0]);  //检查数组长度
    fun(a,length);        //调用排序
    for (int i = 0; i < length; i++)
    {
        printf("%d ", a[i]);  //输出数组
    }
    printf("
");
}

  数组与函数

    数组元素可直接做函数实参传递,下面的代码是一维数组和二维数组元素传递给普通函数:

      int a[10]={5,10},b[10][10]={{2,3},{5,6}};

      int c;

      c= max (a[1],b[0][0] );

      有时候要将整个数组传进函数,这时函数的形式参数要改变。

    程序3

      ※函数的形参可以省略元素个数,如:

      double sum(double array[])

      也合法

// 22-3数组当做形参实参函数定义.c
//求五个学生的总分
#include <stdio.h>

double sum(double array[])
{
    double total = 0;
    for (int i = 0; i < 5; i++)
    {
        total += array[i];
    }
    return total;
}

main()
{
    double a[5];
    for (int i = 0; i < 5; i++) scanf_s("%lf", &a[i]);
    printf("总分为:%g
", sum(a));
}

    程序4

      将两个矩阵相加

// 22-4矩阵数组相加.c

#include <stdio.h>
void add(int a[][4], int b[4][4])
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            a[i][j] += b[i][j];
        }
    }
}


main()
{
    int a[4][4] = {
    {1,2,3,4},
    {1,2,3,4},
    {1,2,3,4},
    {1,2,3,4}
    };

    int b[4][4] = {
        {1,2,3,4},
    {1,2,3,4},
    {1,2,3,4},
    {1,2,3,4}
    };


    add(a,b);
    
    printf("输出和是:
");
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("
");
    }
}

     ※数组元素做函数参数时,如果子函数改变了数组元素的值,父函数里的数组元素不会变。但是用数组名做函数参数时,父函数里的的数组也会随之改变。

     ※函数定义时,二维和多维数组的第一维元素可以省略。

    已有一个按从小到大排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。比如数组a元素为2,5,7,12,20,0(多出个0是为了方便插入数据用),用户输入10后,数组变成了2,5,7,10,12,20。

// 数组添加元素并排序.c

#include <stdio.h>
//已有一个按从小到大排好序的数组,
//今输入一个数,要求按原来排序的规律将它插入数组中。
//比如数组a元素为2, 5, 7, 12, 20, 0(多出个0是为了方便插入数据用),
//用户输入10后,数组变成了2, 5, 7, 10, 12, 20。

void sort(int a[],int length)     //排序函数
{
    int min;
    for (int i = 0; i < length; i++)
    {
        for (int j = 0; j < length-1; j++)
        {
            if (a[j] > a[j+1])
            {
                min = a[j+1];
                a[j+1] = a[j];
                a[j] = min;
            }
        }
    }
}


main()
{
    int a[] = { 2, 5, 7, 12, 20, 0 };
    int length = sizeof(a) / sizeof(a[0]);   //数组长度
    scanf_s("%d", &a[length - 1]);

    sort(a,length); //数组  长度

    for (int i = 0; i < 6; i++)
    {
        printf("%d ",a[i]);
    }

}
原文地址:https://www.cnblogs.com/httpcc/p/15471841.html