天天看點

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

      将一張矩陣笑臉上下翻轉成哭臉

C語言----多元數組(進階篇二十二)
C語言----多元數組(進階篇二十二)
C語言----多元數組(進階篇二十二)

    也就是說把矩陣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("\n");
    }
}


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數組\n " );
    //翻轉數組
    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("\n");
}      

  數組與函數

    數組元素可直接做函數實參傳遞,下面的代碼是一維數組和二維數組元素傳遞給普通函數:

      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\n", 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("輸出和是:\n");
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");\
    }
}      

     ※數組元素做函數參數時,如果子函數改變了數組元素的值,父函數裡的數組元素不會變。但是用數組名做函數參數時,父函數裡的的數組也會随之改變。

     ※函數定義時,二維和多元數組的第一維元素可以省略。

    已有一個按從小到大排好序的數組,今輸入一個數,要求按原來排序的規律将它插入數組中。比如數組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]);
    }

}