• 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]);
        }
    
    }
  • 相关阅读:
    java 单链表 练习
    大问题-简明哲学导论
    git的常见错误
    python在Ubuntu添加模块搜索路径
    前端
    TCP/IP图解
    调试
    Design program
    算法
    面向对象-聚集,程序比较发现
  • 原文地址:https://www.cnblogs.com/httpcc/p/15471841.html
Copyright © 2020-2023  润新知