---
# System prepended metadata

title: 第四章、陣列
tags: [C++, APCS]

---

陣列的出現解決了一次需要宣告過多變數的問題，他將同種型態的東西組合在一起，並利用標準函式庫中的函式對其作為處理。
# 一維陣列
宣告通式:
:::success
(型態) 名字[陣列大小];
:::
以宣告一個裝整數，且大小為3，名為a的陣列為例
```cpp=
int a[3];
```
如果我希望他一開始就裝上 $1,1,2$ 可以這樣寫
```cpp=
int a[3]={1,1,2};
```
但如果大小為10000，不可能一個一個填吧，所以我們會用memset，他可以指定一個數值並且填充進去(當然，你想用迴圈解決也是可以)。

公式：
```cpp=
memset(陣列名稱,你想填入的數值,sizeof(陣列名稱));
```
實際應用(以填入0為例)：
```cpp=
int b[10000];
memset(b,0,sizeof(b)));
```
在電腦的世界上，都是 ~~(RE)~~ 從零開始，陣列也是，所以我們認為的第1格其實是第0格，每一格的編號我們稱為「索引值」，就像是櫃子的專屬稱號，也可以是畫表格的座標。
:::info
例題
[g275. 1. 七言對聯](https://zerojudge.tw/ShowProblem?problemid=g275)
:::
:::info
例題
[a147. Print it all](https://zerojudge.tw/ShowProblem?problemid=a147)
:::
:::warning
習題[偏難]
[e346. 區間和練習](https://zerojudge.tw/ShowProblem?problemid=e346)
[a693. 吞食天地](https://zerojudge.tw/ShowProblem?problemid=a693)[修改輸入版本]
這題因為範圍的關係，所以需要使用long long，可以利用define簡化

原本是這樣
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main()
{

}
```
修改成這樣
```cpp=
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{

}
```
當這樣時可以用ll代表long long

也可以是這樣
```cpp=
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{

}
```
但是這個方式需要將$main$旁的int改成signed，不過這樣就可以使int等於long long int 
:::
:::warning
習題
[e339. 前綴和練習](https://zerojudge.tw/ShowProblem?problemid=e339)[難題]
這題需要「前綴和」(prefix sum)
所謂前綴和就是用另一個陣列的第$i$項表示某個陣列前$i-1$項的和
$p[0]=0$
$p[1]=a[0]$
$p[2]=a[1]+a[0]$
$p[3]=a[2]+a[1]+a[0]$
$p[4]=a[3]+a[2]+a[1]+a[0]$
$.$
$.$
$.$
$p[n]=a[n-1]+a[n-2]......+a[0]$
$p[n+1]=a[n]+a[n-1]......+a[0]$
也可以改成
$p[0]=0$
$p[1]=a[0]$
$p[2]=a[1]+p[1]$
$.$
$.$
$.$
$p[n]=a[n-1]+p[n-1]$
$p[n+1]=a[n]+p[n]$
這樣便可以快速查找指定範圍的總和，例如我需要索引值為0\~3的總和，我只需要輸出$p[4]-p[0]$，我需要1~5，我只需要輸出$p[6]-p[1]$即可。
:::
# 二維陣列
二維陣列簡單來說就是常見的excel表格，描述時是先列(橫)後行(直)，實際上除了索引值從0開始以外，與數學上的矩陣是完全相通的。

|  a   | 0    | 1    | 2   | 3   |
| ---- | ---- | ---- | --- | --- |
| **0**     |  3    |   4   | 10    |  2   |
| **1**    |   5   |    8  |   7 |    6 |

以上面表格來說，a~01~是4，a~13~是6……以此類推。
宣告通式:
:::success
(型態) 名字[幾列][幾行];
:::
以上面那個表格舉例，宣告時會寫
*你會發現，其實就是一維陣列裡面塞陣列而已。*
```cpp=
int a[2][4]={{3,4,10,2},{5,8,7,6}};
```
如果我要呼叫a~01~，就呼叫a[0][1]就可以了。
*APCS差不多到這裡就有機會實作3了*
## 歷遍












:::warning
習題
[a015. 矩陣的翻轉](https://zerojudge.tw/ShowProblem?problemid=a015)
:::
:::warning
習題
[a694. 吞食天地二](https://zerojudge.tw/ShowProblem?problemid=a694)
:::








