。。。
二維數組
類型名 數組名[常量表達式] [常量表達式];
如:
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("\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]);
}
}