--- ###### 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 ![](https://i.imgur.com/yshxaYi.png) ---- ![](https://i.imgur.com/ek70eu0.png) ---- ![](https://i.imgur.com/4NKCctk.png) --- ## 一維陣列 ---- ## 格式 ```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}$的數字 請輸出他們相加 ---- ![](https://i.imgur.com/re6ulp0.png) ---- ## 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; } ``` ---- 成果 ![](https://i.imgur.com/Fg3rEzH.png)
{"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}]"}
    509 views
   Owned this note