---
###### tags: `課程`
---
陣列-array
===
---
## 座位表
| | 講桌 | 講桌 | |
| ------ |:------:|:------:| ------ |
| 408_32 | 403_22 | 505_38 | 406_04 |
| 504_17 | 401_35 | 404_29 | 404_22 |
| 505_27 | 506_29 | 505_35 | 505_30 |
| | | | |
| 508_37 | 503_21 | 407_24 | 507_12 |
| 408_33 | 506_27 | 408_30 | 505_29 |
| 505_16 | 405_12 | 403_15 | 508_42 |
---
https://reurl.cc/Q6Ood0

----

----

---
## 一維陣列
----
## 格式
```cpp=
資料型態 陣列名稱[陣列大小];
int arr[5]; //亂碼
int arr[5] = {}; //[0,0,0,0,0]
int arr[5] = {0, 1, 2, 3, 4}; //[0,1,2,3,4]
int arr[5] = {0, 1, 2} //[0,1,2,0,0]
int arr[5] = {1} //[1,0,0,0,0]
float arr[5] //跟int arr[5]一樣但變成float型態
```
**陣列的區間是arr[0] ~ arr[n-1]**
<font color="red">**不包括arr[n]**</font>
----
## 輸入輸出
```cpp=
for(int i = 0; i < 5 ; i++)
cin >> arr[i];
for(int i = 0; i < 5 ; i++)
cout << arr[i] << ' ';
```
----
#define rep(i,n) for(int i=0; i<n; i++)
```cpp=
rep(i,n) cin >> arr[i];
rep(i,n) cout << arr[i] << endl;
```
----
## 練習時間!
給定$n$接下來會有$n$個數字
請倒過來輸出
```
input:
5
1 2 3 4 5
output:
5 4 3 2 1
```
----
## CODE
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int arr[n];
for(int i=0; i<n; i++) cin >> arr[i];
for(int i=n-1; i>=0; i--) cout << arr[i] << ' ';
return 0;
}
```
----
## 進階版
並且輸出有多少大於零的數
----
input :
2 -5 12 55 0
output :
0 55 12 -5 2
3
----
## CODE
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, cnt = 0;
cin >> n;
int arr[n];
for(int i = 0 ; i< n ; i++){
cin >> arr[i];
if(arr[i] > 0) cnt++;
}
for(int i = n-1 ; i >= 0 ; i--) cout << arr[i] << ' ';
cout << endl << cnt << endl;
return 0;
}
```
---
## 二維陣列
----
廣義的陣列
| arr[i][j] | 0 | 1 | 2 |
| -- | -- | -- | --|
| 0 | arr[0][0] | arr[0][1]|arr[0][2]|
| 1 | arr[1][0] | arr[1][1]|arr[1][2]|
| 2 | arr[2][0] | arr[2][1]|arr[2][2]|
| 3 | arr[3][0] | arr[3][1]|arr[3][2]|
----
二維陣列輸入輸出
```cpp=
int arr[5][5];
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
cin>>arr[i][j];
}
}
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
cout << arr[i][j] << ' ';
}
cout << endl;
}
```
----
## 練習時間
輸出三九乘法表(要用陣列先存起來)
| 3\9 | 1 | 2 | 3 |4|5|...9|
| -- | -- | -- | --|--|--|--|
| 1 | 1 | 2|3|4|5|...9|
| 2 | 2 | 4|6|8|10|...18|
| 3 | 3 | 6|9|12|15|...27|
----
```cpp=
int arr[3][9];
for(int i = 1; i <= 3; i++){
for(int j = 1; j <= 9;j++){
arr[i-1][j-1] = i*j;
}
}
for(int i = 0; i < 3; i++){
for(int j = 0; j < 9; j++){
cout << arr[i][j] << ' ';
}
cout<<endl;
}
```
---
## 注意事項
----
- 陣列大小是 0 ~ n-1
- 不要呼叫 arr[-1] 或 arr[n]
- 陣列大小最多通常是$10^8$這麼大
- 不要被二維陣列的行列固定想法 (行列可交換)
- 大小不可之後改變
- 初始值未固定
---
## string
字串是 C++STL 的一種工具
用於處理一串文字 用法則類似一維陣列
----
## 輸入輸出
```cpp=
#include<string>
#include<iostream>
using namespace std;
int main(){
string str; //宣告字串
cin >> str; //輸入字串 ex. hello
cout << str << endl; //輸出整個字串 ex. hello
cout << str[0] << endl; //輸出第一個字 ex. h
}
```
---
## 進階
----
## [ ]運算子
會把 arr[10] 括號內跟括號前的位置合併
-> arr(記憶體位置) + 10
10[arr]也是合法的!
```cpp=
試試看: cout << arr <<endl;
```
----
## 行尾換行
```cpp=
for(int i = 0; i < n;i ++)
cout<<arr[i]<<" \n"[i == n-1];
```
----
```cpp=
#include <bits/stdc++.h>
using namespace std;
int main(){
int arr[10];
for(int i=0; i<10; i++) arr[i] = i;
for(int i=0; i<10; i++) cout << arr[i] << " \n"[i == 9];
cout << "hello world";
return 0;
}
```
---
## 題目們
---
## 區間合
給定 $n$ 代表接下來會有一個 n 個數字的數列
給定 $l, r$
問數列第 $l$ 項到第 $r$ 項的總和
input:
5
3 1 2 5 4
0 3
output:
11
----
## CODE
```cpp=
int n;
cin >> n;
int arr[n];
for(int i = 0; i < n; i++)
cin >> arr[i];
int l, r, ans = 0;
cin >> l >> r;
for (int i = l; i <= r; i++)
ans += arr[i];
cout << ans << endl;
```
---
## 排序數列
給出 n 接下來會有一個 n 個數字的數列
請由小到大排序後輸出
input:
5
3 9 1 2 5
output:
1 2 3 5 9
----
## CODE
```cpp=
int main() {
int n;
cin >> n;
int arr[n];
for (int i = 0; i < n; i++) cin >> arr[i];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j+1]) {
int tmp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
}
for(int i=0; i<n; i++) cout<<arr[i]<<' ';
return 0;
}
```
----
Bubble Sort
https://reurl.cc/n5RbW1
----
## 進階作法
```cpp=
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;.
int arr[n];
for(int i=0; i<n; i++) cin >> arr[i];
sort(arr, arr + n);
for(int i=0; i<n; i++) cout << arr[i] << " \n"[i == n - 1];
return 0;
}
```
---
## 大數
給定兩個大約$10^{40}$的數字
請輸出他們相加
----

----
## CODE
```cpp=
#include <iostream>
#include <string>
using namespace std;
#define rep(i,n) for(int i=0; i<n; i++)
int main(){
int numa[105] = {}, numb[105] = {}, sum[105] = {};
string a, b;
cin >> a >> b;
rep(i, a.size()) numa[i] = a[a.size() - i - 1] - '0';
rep(i, b.size()) numb[i] = b[b.size() - i - 1] - '0';
rep(i, 104) sum[i] = numa[i] + numb[i];
cout<<endl;
rep(i, 104){
if(sum[i] >= 10){
sum[i+1] += sum[i]/10;
sum[i] %= 10;
}
}
int st;
for(int i=104; i>=0; i--){
if(sum[i] != 0){
st = i;
break;
}
}
for(int i=st; i>=0; i--) cout<<sum[i];
return 0;
}
```
---
## 陣列的生活應用
----
月考考完了
想要知道自己考的如何
學會陣列後
就不需要用計算機一個一個慢慢算了喔!
----
## CODE
```cpp=
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
int main() {
int arr[8], ok = 0, fail = 0, total = 0;
float avg;
printf("Please enter your Chinese, Math, English grades\n");
rep(i,3){
cin>>arr[i];
if(arr[i] >= 60) ok++;
else fail++;
}
printf("Please enter the rest of your grades\n");
for(int i=3; i<8; i++){
cin>>arr[i];
if(arr[i] >= 60) ok++;
else fail++;
}
rep(i,3) total += (arr[i] * 4);
for(int i=3; i<8; i++) total += (arr[i] * 2);
avg = total/22;
cout<<"Total : "<<total<<"\n"<<"Average : "<<avg<<endl;
cout<<"Pass : "<<ok<<"\n"<<"Fail : "<<fail;
return 0;
}
```
----
成果

{"metaMigratedAt":"2023-06-16T03:21:36.966Z","metaMigratedFrom":"Content","title":"陣列-array","breaks":true,"contributors":"[{\"id\":\"7d4f22ac-9934-417b-aa5e-c76934d4fc98\",\"add\":17,\"del\":0},{\"id\":\"71bdf46d-72d3-43b0-9f90-8e2b261abc6b\",\"add\":359,\"del\":2},{\"id\":\"ce4adf99-60a9-4bbb-b8ec-7c57faed2bd7\",\"add\":5913,\"del\":4365},{\"id\":\"82f46fc6-f9dd-4e98-8fe8-19fda0dc8ba3\",\"add\":4719,\"del\":0}]"}