# 陣列 今天當你要宣告a,b,c的變數。沒有甚麼問題。 但今天如果要叫你宣告a,b,c,d,...z的變數或至少高達100個變數。 這樣不就會要花很多時間宣告變數? 所以我們就需要陣列來幫我們儲存資料。 ## 陣列介紹: ### 如何宣告? ``` 資料型態 陣列名稱[陣列大小] ``` 舉例: ```c int a[3]; float b[3]; long long int c[3]; char d[3]; ``` 也可以 ```c const int SIZE=100; int a[SIZE]; float b[SIZE]; long long int c[SIZE]; char d[SIZE]; ``` 宣告變數和宣告陣列 ![](https://i.imgur.com/JQv2YGp.jpg) :::warning 注意: 從上面的例子舉例: 陣列的索引值是從$0$開始到$2$,並不是從$1$開始到$3$,而且索引值絕對不能是負的,如果用到不存在的記憶體空間,就會出現不可預期的錯誤。 ::: 代表說如果你要使用$a[100]$的值,你就需要宣告$a[101]$的陣列大小。 ## 初始化 1.我想讓長度為五的a陣列裡面依序放1、2、3、4、5 ```c int a[5]={1,2,3,4,5}; ``` | a[0] | a[1] | a[2] | a[3] | a[4] | | ---- | ---- | ---- | ---- |:---- | | 1 | 2 | 3 | 4 | 5 | --- 2.我想讓長度為五的b陣列裡面的數值全部為0 ```c int b[5]={0}; ``` 或 ```c int b[5]={}; ``` | b[0] | b[1] | b[2] | b[3] | b[4] | | ---- | ---- | ---- | ---- |:---- | | 0 | 0 | 0 | 0 | 0 | --- 3.我想要初始化c陣列但我沒宣告陣列大小 ```c int c[]={1,2,3,4,5}; ``` 這樣宣告c陣列的大小就是五 | c[0] | c[1] | c[2] | c[3] | c[4] | | ---- | ---- | ---- | ---- |:---- | | 1 | 2 | 3 | 4 | 5 | --- 4.若要初始的數量比d陣列大小還小 ```c int d[5]={1,2,3} ``` 後面就會自動補0 | d[0] | d[1] | d[2] | d[3] | d[4] | | ---- | ---- | ---- | ---- |:---- | | 1 | 2 | 3 | 0 | 0 | --- 5.如果都沒有初始化... ```c int e[5]; ``` | e[0] | e[1] | e[2] | e[3] | e[4] | |:-------:|:-------:|:-------:|:---- |:-------:| | 6422352 | 4200891 | 4200800 | 0 | 3362816 | 會跑出不可預期的數值,但如果宣告在main函式外就會幫你初始化為0。 --- ## 賦值 1.我想要將a陣列中索引值為1的數值改成10 ```c int a[5]={0} a[1]=10 ``` | a[0] | a[1] | a[2] | a[3] | a[4] | | ---- | ---- | ---- | ---- |:---- | | 0 | 10 | 0 | 0 | 0 | --- 2.我想將a陣列中全部位置的值都改成2 ```c int b[5]; for(int i=0;i<5;i++){ b[i]=2; } ``` | b[0] | b[1] | b[2] | b[3] | b[4] | | ---- | ---- | ---- | ---- |:---- | | 2 | 2 | 2 | 2 | 2 | --- 3.我想將多個輸入的值依序放進陣列中 ```c const int SIZE=5; int c[SIZE]; for(int i=0;i<SIZE;i++){ scanf("%d",c[i]); } ``` 如果依序輸入2,1,3,5,4。 | c[0] | c[1] | c[2] | c[3] | c[4] | | ---- | ---- | ---- | ---- |:---- | | 2 | 1 | 3 | 5 | 4 | 補充: 這裡的陣列前不用加&,因為陣列名稱有指標的概念。 --- ## 輸出 1.我想知道a陣列索引值1的值是甚麼? ```c int a[5]={1,2,3,4,5}; printf("%d",a[1]); ``` 輸出: ``` 2 ``` --- 2.我想知道b陣列裡面所有的索引值依序有什麼值。 ```c int b[5]={6,7,8,9,10}; for(int i=0;i<5;i++){ printf("%d ",b[i]); } ``` | b[0] | b[1] | b[2] | b[3] | b[4] | | ---- | ---- | ---- | ---- |:---- | | 6 | 7 | 8 | 9 | 10 | 輸出: ``` 6 7 8 9 10 ``` --- ## 常犯問題 1.在main函式裡,陣列不能開太大,要在main外面宣告才能開比較大(極限大概1百萬左右),而且會幫你的陣列全部初始化為0。 舉例: ```c= #include<stdio.h> const int SIZE=100000000; int a[SIZE]; int main(){ } ``` --- 2.請記得在使用陣列前就先宣告,不要用動態宣告 舉例: ```c int n; scanf("%d",&n); int a[n]; ``` :-1: ```c const int SIZE=1000000; int a[SIZE]; ``` :+1: --- 3.當想要將a陣列全部的值都轉到b陣列上 ```c= int a[3]={1,2,3}; int b[3]; b = a; ``` 注意不能這樣寫,要一個一個用迴圈複製過去 ```c= int a[3]={1,2,3}; int b[3]; for(int i=0; i<3;i++){ b[i] = a[i]; } ``` ## 二維陣列 ### 如何宣告 ``` 資料型態 陣列名稱[陣列大小][陣列大小] ``` 舉例: ```c int a[10][10]; float b[10][10]; long long int c[10][10]; char d[10][10]; ``` 或 ```c const int SIZE=100; int a[SIZE][SIZE]; float b[SIZE][SIZE]; long long int c[SIZE][SIZE]; char d[SIZE][SIZE]; ``` ### 看一下圖片 ![](https://i.imgur.com/AebvgU4.jpg) --- ### 初始化 跟一維差不多。 1.當我想放我想要的值 ```c int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; ``` 就會變成: ![](https://i.imgur.com/ae1Avyd.jpg) 初始化的狀況都跟一維差不多,自己可以試試看。 --- ### 賦值 1.當我想讓a[2][1]的值變成10 ```c int a[3][3]={0}; a[2][1]=10; ``` ![](https://i.imgur.com/xIDhbMK.jpg) --- 2.當我想要輸入9,6,7,4,5,3,2,8,1進去 一維陣列是用單層迴圈 那二維理所當然要用雙層迴圈(巢狀) ```c int a[3][3]; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ scanf("%d",a[i][j]); } } ``` ![](https://i.imgur.com/aE1LF06.jpg) --- ## 輸出 一樣用雙層迴圈 舉例: ```c #include<stdio.h> int main(){ int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ printf("%d ",a[i][j]); } printf("\n"); } } ``` 輸出: ``` 1 2 3 4 5 6 7 8 9 ``` --- 再高維的陣列都是一樣的東西,可以自己試試看。 ## 排序 以前教過兩個數字和三個數字的。 那如果很多個數字怎麼辦? 那就需要陣列的幫忙。 ### 泡沫排序法 先看一下動畫 ![](https://i.imgur.com/jnluLUY.gif) 網路上有很多寫法,都可以去參考看看。 我的程式碼: ```c #include<stdio.h> int main(){ int a[10]={3,4,2,1,6,5,8,7,10,9}; int t; for(int i=10;i>=0;i--){ for(int j=0;j<i-1;j++){ if(a[j]>a[j+1]){ t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(int i=0;i<10;i++){ printf("%d ",a[i]); } } ``` 將她的過程輸出出來(交換的時候) ``` 3 2 4 1 6 5 8 7 10 9 3 2 1 4 6 5 8 7 10 9 3 2 1 4 5 6 8 7 10 9 3 2 1 4 5 6 7 8 10 9 3 2 1 4 5 6 7 8 9 10 2 3 1 4 5 6 7 8 9 10 2 1 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 ``` 結果輸出: ``` 1 2 3 4 5 6 7 8 9 10 ``` ###### tags: `中和高中`