---
# System prepended metadata

title: 陣列 (Array)
tags: [程式設計, 陣列]

---

# 陣列 (Array)
###### tags: `程式設計` `陣列`
如果你是一位老師，你想要用C++來計算班上每位同學分數的平均，你可能需要宣告很多變數。


| 成績編號 |  1   |  2   | 3 |4 |5 |6 |7 |
|:--------:|:----:|:----:|:----:|:----:|:----:|:----:|:----:|
|  王大明  | 82 | 65 | 99|88| 84| 76| ...|
|柳橙之 | 50 | 54 | 55|68| 55| 55|...|
|...|score1|score2|score3|score4|score5|..|

int score1, score2, score3, score4, score5, ... ;

這樣會沒完沒了
幸好程式設計師發明了能方便儲存多筆資料的 **陣列**，陣列能夠把很多筆資料都儲存在一個地方。
```cpp
int score1, score2, score3, score4, score5, ...;
```
:arrow_down:
```cpp
int score[100];
```
宣告陣列的方式，首先是資料型態，然後陣列名稱，再來是資料數量

---
如果資料的種類很多，也可以使用不同維度的陣列。

<font size = 5>**<一維陣列>**</font>


| 編號 |  0   |  1   |  2   |  3   |  4   |  5   | 6   |
| ---- |:----:|:----:|:----:|:----:|:----:|:----:|:----:|
| 資料 | 82 | 65 |99 |88 |84|76|...|

```cpp
int score[6] ={ 82, 65, 99, 88, 84, 76}
```
<font size = 5>**<二維陣列>**</font>

| 列/行  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |
|:----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| 0 | 82  | 65  | 99  | 88  | 84  | 76  | ... |
| 1 | 100  | 85  | 88  | 90  | 99  | 85  | ... |
| 2 | ...  | ...  | ...  | ...  |... | ... | ... |

```cpp
int score[2][6]={
                    {82,65,99,88,84,76},
                    {100,85,88,90,99,85}
                  }
```
score[2][6] 中 2稱為 **列數**，6稱為 **行數**，宣告的時候要先宣告列再來才是行

由於已經有宣告列數和行數，所以宣告時也可以直接去掉裡面的括號
```cpp
int score[2][6]={
                    82,65,99,88,84,76,
                   100,85,88,90,99,85
                  }
```
---
例題1
---
>[e973: 3. 滿意度調查 (Survey of Satisfaction)](https://zerojudge.tw/ShowProblem?problemid=e973 "點選看題目")
```cpp=
#include <iostream>
using namespace std;
main()
{
	long long int n;
	int i, j, x;
	int a[10];
	for(i=0 ; i<10 ; i++)
	{
		a[i] = 0;
	}
	cin>>n;
	while(n>0)
	{
		x = n%10;
		a[x] ++;
		n/=10;
	}
	for(i=18 ; i>0 ; i--)
	{
		for(j=0 ; j < 10 ; j++)
		{
			if(a[j] == i)    cout<<j<<" ";
		}
	}
} 
```
>>
#### 程式的重點:

用``long long int``來宣告輸入的變數 N
在第 8 行使用 **for** 迴圈來初始化所有陣列的變數為 **0**
接下來的 **while** 迴圈把遇到的數字次數儲存起來
最後的 **for** 迴圈判斷各個數字出現的次數，因為題目規定的數字大小最多有 18 位數

    2^63-1 的位數和 2^63 的位數一樣，因為個位數字是不為零的偶數
$$\begin{gather}
log(2^{63})=63log2 \\
\Rightarrow63log2\approx 18.9<19
    \end{gather}$$
>
，所以就從 18 開始往下數，如果對應到的出現次數一樣，就印出``cout``，也要注意題目要求如果有數字出現次數一樣，數字較小的就輸出在前面，因此在第 21 行的迴圈裡``j``從 0 往上執行。

