# 2022工科系計算機概論作業簡述
**授課教授:賴槿峰**
## Lab01 所有環境建置
### 基礎題內容:
1. 安裝好樹莓派作業系統,並以SSH的方式連線登入 (20分)
2. 顯示樹莓派CPU系統架構 (20分)
3. 顯示樹莓派CPU當前溫度 (20分)
4. 顯示樹莓派Python版本 (20分)
5. 在`/home/使用者名稱/`下建立一個資料夾,並命名為".ssh"
輸入指令` ls -al | grep .ssh `確認資料夾是否存在 (20分)
### 加分題內容:
1. 設定SSH公私鑰免密碼登入,並以**CMD/Terminal**來用SSH登入,截圖如下:

2. 連進樹梅派後,輸入指令:`cat ~/.ssh/authorized_keys`,顯示公鑰內容並截圖:

### 成績:
1. 基礎題:100/100
2. 加分題:0.5/1
## Lab02 Linux、Git/GitHub
### 基礎題內容:
1. 回報github repositary的網址
2. 將此儲存庫共用給助教
3. 更新助教課建立的GitHub repository,推送(git push)到github網站上,並且有兩項要求:
- 建立一個名為lab02的資料夾
- 資料夾內有一個檔案名稱為學號的檔案,內容隨意但不可空白
### 成績:
基礎題:100/100
## Lab03 變數、運算式、判斷式
### 基礎題內容:
1. 利用input() 函數與if else 完成以下程式
- 判斷奇數偶數
- 輸出自己的學號
2. 範例程式輸出如下:

3. 上傳程式碼以及程式輸出截圖到GitHub
### 成績
基礎題:100/100
## Lab04 迴圈、串列、元組
### 基礎題內容:
1. 計算3個學生 A,B,C及5個科目(國英數自社)的平均成績
2. 請依照以下範例輸出完成作業,圖中紅框為手動輸入input()的部分:

3. 上傳程式碼以及程式輸出截圖到GitHub
- **作業規定:請利用for, input()輸入學生的成績,並且利用list儲存**
### 加分題內容:
1. 請依據 Lab04的內容作延伸:
- 做出防呆: 如果沒有輸入範圍內的數值,跳出警告訊息並且程式繼續執行!
2. 請依照以下範例輸出完成作業:
### 成績:
1. 基礎題:100/100
2. 加分題:1/1
## Lab05 字典(dictionary)、集合(set)
### 基礎題內容:
1. 請建立一個名稱為「dict0」的字典,其資料內容如下。
| 鍵(key) | 值(value)|
| ------- | ---------------------------- |
|index|國文, 英文, 數學, 自然, 社會|
|StuA| 50, 60, 70, 80, 90|
|StuB|57, 86, 73, 82, 43|
|StuC|97, 96, 86, 97, 83|
2. 請輸出整個dict0字典
3. 請計算出每個學生的平均成績(StuA, StuB, StuC)
4. 請計算出每個科目的平均成績(國文, 英文, 數學, 自然, 社會)

5. 上傳程式碼以及程式輸出截圖到GitHub
### 加分題內容:
1. 請把基礎題宣告字典的部分改為從電腦輸入,並輸出此字典
2. 上傳程式碼以及程式輸出截圖到GitHub
3. 截圖需要包含:輸入區域及dict0的輸出。(黃色螢光筆為輸入)

### 成績:
1. 基礎題:100/100
2. 加分題:1/1
## Lab06 函式、模組
### 基礎題內容:
1. 請使用輾轉相除法,為兩個數字求出最大公因數
2. 若兩個數字互質,則輸出:「num1和num2互質。」
3. 若有最大公因數,則輸出:「num1和num2的最大公因數=num3」
4. 請依照以下範例輸出:

2. 上傳程式碼以及程式輸出截圖到GitHub
### 加分題內容:
1. 請使用random module,投擲1000000次骰子(骰子點數為1~6),列出每個點數被骰到的機率(Prob)。(精準至小數點後第2位)。
2. 請依照以下範例輸出:

2. 上傳程式碼以及程式輸出截圖到GitHub
### 成績:
1. 基礎題:90/100
2. 加分題:1/1
## Lab07:物件導向程式開發:
### 基礎題內容:
#### **題目敘述:**
>請建立一個名為Animals的class,以及兩個名為Dogs跟Cats的子類別,已知Dogs跟Cats都屬於Animals的一種,請依以下敘述建立最適合的class。
>- 已知Animals具有以下attribute:
1. weight:體重
3. mood:心情
>- 已知Animals具有以下method:
1. feed():吃飯
2. walk():散步
3. bath():洗澡
>- 分別建立一個dog和cat的物件,初始值如下:
> | **object** | **Animals** |** weight**|**mood**|
> | ------ | ------- | --- | ------ |
> |dog|Dogs|4.8kg|65|
> |cat|Cats|8.2kg|60|
>```python=
>dog = Dogs(4.8, 65)
>cat = Cats(8.2, 60)
>```
>當我們帶Animals去吃飯(feed) 時,會影響到Animals的weight和mood,如下表所示:
>| **Animals** | **weight**|**mood**|
>| ------- | --- | ------ |
>|Dogs|+0.2kg|+1|
>|Cats|+0.1kg|+1|
>
>當我們帶Animals去散步(walk) 時,會影響到Animals的weight和mood,如下表所示:
>| **Animals** | **weight**|**mood**|
>| ------- | --- | ------ |
>|Dogs|-0.2kg|+2|
>|Cats|-0.1kg|-1|
>
>當我們帶Animals去洗澡(bath) 時,會影響到Animals的mood,如下表所示:
>| **Animals** | **weight**|**mood**|
>| ------- | --- | ------ |
>|Dogs|不影響|-2|
>|Cats|不影響|-2|
#### **Question:**
假設這一個月,Animals吃飯、散步、洗澡的次數如下表所示, 請輸出dog和cat現在的體重和心情分別為何。
| object | n_feed |n_walk|n_bath|
| ------ | ------ | --- | ------ |
|dog|18|10|4|
|cat|40|7|1|
請依照以下範例輸出:
```python=
狗狗現在的體重= 6.4 kg, 心情 95
貓貓現在的體重= 11.5 kg, 心情 91
```

### 加分題內容:
#### **題目敘述:**
接續基礎題,請建立一個Shiba類別,Shiba也是是Dogs的一種,但是<font color="#f00">當Shiba吃飯時,他會比其他狗狗更容易變胖,心情也會變得更好。</font>
>| | weight | mood |
>| -------- | -------- | -------- |
>| feed |+0.3kg |+5kg|
>
>建立一個shiba物件,初始值如下:
>
>| object | class | weight3 |mood|
>| -------- | -------- | -------- | --- |
>| shiba|Shiba|5kg|70|
#### **Question:**
假設這一個月,shiba吃飯、散步、洗澡的次數如下表所示:
| object | n_feed |n_walk|n_bath|
| ------ | ------ | --- | ------ |
|shiba|20|10|3|
1. (50%)請輸出shiba現在的體重和心情分別為何?請照以下範例輸出:
2. (30%)請問shiba現在的心情是不是超過90?如果是,請照以下範例輸出:

3. (20%)請問shiba現在的心情是不是超過300?如果否,請照以下範例輸出:
!
### 成績:
1. 基礎題:100/100
2. 加分題:1/1
## Lab08 檔案系統的使用
### 基礎題內容:
1. 讀取當前工作目錄並存成list,print在終端機裡,然後將裡面的元素一行一行寫入文字檔
2. 讀取 ‘/home/學號’ 目錄下所有檔案和資料夾,print在終端機裡,然後將裡面的元素一行一行寫入文字檔
3. 上傳程式碼到GitHub
4. 注意事項:
- 兩題寫入同一個文字檔
- 兩題之間用一行空白隔開
- 請使用linesep跟sep
- 截圖一張,截圖需先執行’ls’一次列出’/home/學號’路徑的所有檔案,再執行程式碼
### 成績:
基礎題:100/100
## Lab09 網路管理、Socket
### 基礎題內容:
#### 1. Linux Networking Commands (15%)
##### Network Topology (Original)

1. 測試是否可以上網(從樹莓派輸入指令)
2. 查看隨便一個網址(e.g. google.com, apple.com, etc.)的ip
3. 查看到那個網頁的路徑
#### 2. RaspAP (15%)
##### Network Topology (Raspberry Pi as Router/AP)

1. 更改Hotspot名稱&密碼(要Save settings, Restart hotspot),安全起見不要設定的太簡單,但自己要能記住。
2. 測試是否可以上網(從電腦輸入指令)
3. 將手機連上AP,測試是否可以連到手機
4. 給電腦設定一個固定IP:10.3.141.xx(與原本DHCP配發的IP相同即可)
5. 查看從此電腦(10.3.141.xx)到google.com的路徑為何
**繳交方式:將第1, 2題的指令與結果截圖(每個小題都要),並且標明題號貼到Word中,輸出成PDF(與Lab01形式相同),檔名為lab09.pdf,並放到lab09資料夾**
#### 3. Socket programming (70%, 要先完成第2題才會算分)
1. 請寫一個TCP Socket,功能:Server接收到Client傳來的訊息後,會回覆一模一樣的訊息給Client

2. Server:
- HOST = ‘10.3.141.1’ (可以先把HOST設為127.0.0.1,Server和Client都在電腦上做測試)
- PORT = 8000
- 檔案要放在樹莓派中

- 一開始要顯示"Server started at: 10.3.141.1:8000"
- 接著顯示"Waiting for connection…"

- 當有Client連上時要顯示"Connected by (‘10.3.141.xx’, xxxxx)"

- 每收到Client傳來的訊息,要顯示Client的ip:port與內容並且回覆"Echo: + 收到的訊息"(顯示於Client)

- 當Client結束連線時,要顯示" (‘10.3.141.xx’, xxxxx) closed connection.“,接著回到"Waiting for connection…”,此時若再執行client.py可以再度建立連線。

- server.py開始執行後要一直開著,只能最後手動把他結束 (`Crtl + C`)
- 檔名:server.py
3. Client:
- 檔案要放在電腦中
- 執行前請先執行Server
- 一開始要顯示"Connected to 10.3.141.1:8000"
- 接著要顯示"Send: ",此時可以一直傳訊息給Server,且會收到Server的回覆

- 當輸入訊息為"EXIT"時,結束連線,並顯示"Closed connection."

- 檔名:client.py
### 加分題內容:
1. 接續基礎題的TCP Socket,功能:讓Server可以同時服務多個Client(上述Server同時間只能服務一個Client)


2. 只需修改server的程式內容就好
3. 檔名:server_plus.py
### 成績:
1. 基礎題:70/100
2. 加分題:1/1
## Lab10 網頁架構、Flask建立Web API
### 基礎題內容:
1. 完成一個web server,並且具有以下API:
| api名稱 | method | 傳入資料 | 功能 |
| -------- | -------- | -------- | --- |
| / | GET | 無 |接收get request後 回傳ok (一定是’ok’!不能是OK, okay或是多任何空格) |
| /set | POST ||新增一個 key-value pair 並回傳’set success’,若key已存在 則回傳’key exist’|
| /key_list |GET |無|回傳所有存在的 key (記得要轉為str格式)|
|/get_value(key)|GET|無|回傳指定的 key 的資訊,若找不到就回傳’key not found’|
|/update_value |POST ||更新指定的 key 的資訊並回傳’update success’,若 key 不存在 則回傳’key does not exist’|
| /delete/(key)|GET | 無 |刪除指定的 key 的資訊並回傳’delete success’,若找不到就回傳’key not found’|
2. 繳交方式:上傳lab10.py的檔案到github上
### 加分題內容:
1. 將所有輸入的 key-value pair儲存在本地的資料庫,不可存在ram中(即不可使用任何資料型態的變數來儲存),方法隨意,可以用txt檔、資料庫等
2. 當web server重新啟動時,可以讀取到過去建立的 key-value pair,須處理掉多餘的換行、空格等多餘字元
3. 繳交方式:上傳lab10.py的檔案到github上
### 成績:
1. 基礎題:100/100
2. 加分題:0.5/1
## Lab11 演算法
### 基礎題內容:
1. 請使用暴力法 (Brute Force,產生所有排列組合,找 cost最小的那個組合)來完成 JAP(Job Assignment Problem)
- 工作指派問題是一種最佳化問題中的組合優化問題。
Q: 假設有 N件工作 (Job)要處理,手邊有 N個人 (Agent)可以指派,每個人必須處理任意一件工作,每個工作也必須被任意一個人處理,請問如何指派可使得總成本最低?
- 範例Input
```python=
input = [[10, 20, 23, 4],
[15, 13, 6, 25],
[ 2, 22, 35, 34],
[12, 3, 14, 17]]
```
此 input代表以下表格,紅色的數字代表此工作分配問題的最佳解
| | agent0 | agent1 |agent2 |agent3 |
| -------- | -------- | -------- | --- | --- |
| job0 | 10 | 20 | 23 | 4 |
| job1 | 15 | 13 | 6 | 25 |
| job2 | 2 | 22 | 35 | 34 |
| job3 | 12 | 3 | 14 | 17 |
代表若使用以下分法可以得到最小成本
job 0 → agent 3
job 1 → agent 2
job 2 → agent 0
job 3 → agent 1
- 範例Output

`assignment[i]` 的值代表第i個 job要分給的 agent是誰,可對照上述分配情形
`cost` 為此種分配方法的總成本為多少
注意:由於每個 job只能給一個 agent做,每個 agent也只能做一個 job,因此 `assignment` 中的數字不能重複,且要介於0和N−1之間
2. 測試資料:
- 請使用input.json作為測資,形式為 dictionary,key 為題號,value 為測試的 input,助教批改時會更換測資。
- cost 皆為正整數
- N 大小不一定,最小為1

3. 輸出結果如下:

4. 繳交方式:上傳bf.py的檔案到github上
### 加分題內容:
現在有 N個人排隊要來搭電梯上樓,他們的體重分別以一個 list來記錄 (依照排隊順序)
助教限制要分成 M批內讓所有人上樓,且要照排隊順序進電梯,不能超過電梯的承重
請問此電梯至少要承重多少才能完成呢?
1. Example
- Example1.
weights = [60, 60, 65, 47, 81, 92, 32]
limit = 4
ans = 124
[60, 60]
[65, 47]
[81]
[92, 32]
- Example2.
weights = [32, 40, 45, 35, 80, 31, 62, 72, 34, 32]
limit = 6
ans = 93
[32, 40]
[45, 35]
[80]
[31, 62]
[72]
[34, 32]
- Example 3.
weights = [35]
limit = 1
ans = 35
[35]
2. Input:
list weights
int limit
3. Output:
int ans(最大承重)
4. 測試資料:
請使用 input_plus.json作為測資

5. 輸出結果如下:

6. 繳交方式:上傳plus.py的檔案到github上
### 成績:
1. 基礎題:100/100
2. 加分題:0.6/1
## Lab12 數據資料的儲存與讀取:
### 基礎題內容
1. 請至政府資料開放平臺(https://data.gov.tw/)選擇一個資料集
- 選擇類別
- 選擇資料集
- 點選JSON
- 資料原始格式
2. 用phpMyAdmin在資料庫中建立新的資料表,並新增至少四個欄位,使用PyMySQL與資料庫做溝通,最後根據API新增10筆以上的資料
3. 請在程式碼前面註解附上你使用的資料集網址
4. 繳交方式:
- 程式碼:檔名Lab12.py的python檔
- 截圖一張須包含完整的phpMyAdmin畫面,並且頁面停在建立好的資料表上
- 上傳到github的檔案夾lab12
### 成績:
基礎題:100/100
## Lab13 數據資料視覺化
### 基礎題內容:
1. 將歷年的台南氣溫資料用plt.plot()繪製成如下圖,儲存圖片命名為`lab13_01.png`

2. 分別計算每個月份每年的氣溫平均值,把12個月份分別的的氣溫平均值繪製成一張表,計算每個月分氣溫的總平均值(全部的平均),在圖表上繪製一條水平虛線,並且標示總平均值的數字在須線上,儲存圖片命名`lab13_02.png`

3. 將前面兩張圖片使用subplot(1,2,x)畫在同一張圖片上,儲存圖片命名為`lab13_03.png`

4. 繳交方式:
- 程式碼:lab13.py
- 圖片:lab13_01.png、lab13_02.png、lab13_03.png
- 上傳到github的檔案夾lab13
5. 資料提供:
[Temperature.txt
](https://drive.google.com/file/d/1hhtRrYekBfjp-dNCeICUBqtMddV-Gr6q/view?usp=sharing)
```python=
# 資料建議整理成以下這樣
print(temp_list)
[ # [1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
[17.5, 20.4, 22.5, 23.9, 27.3, 29.5, 29.4, 28.9, 28.6, 25.7, 22.8, 18.0], #2013
[17.6, 18.4, 21.3, 25.0, 27.2, 29.0, 30.4, 29.0, 29.5, 26.4, 23.9, 17.9], #2014
[17.8, 18.9, 21.8, 24.9, 27.7, 30.4, 29.1, 28.4, 28.4, 26.8, 25.1, 20.5], #2015
[17.3, 17.4, 19.7, 26.3, 28.4, 29.4, 29.9, 29.3, 28.0, 27.8, 24.3, 20.9], #2016
[19.4, 18.6, 21.5, 24.6, 27.7, 29.3, 29.6, 29.9, 30.0, 27.1, 23.8, 19.1], #2017
[18.1, 17.5, 22.3, 25.6, 28.9, 29.0, 29.2, 27.8, 28.9, 25.8, 24.2, 21.6], #2018
[19.7, 22.0, 22.5, 26.0, 26.9, 29.3, 29.2, 28.7, 28.4, 27.1, 23.5, 19.8], #2019
[19.0, 20.0, 23.3, 23.4, 28.1, 30.1, 30.2, 28.8, 29.3, 26.8, 24.2, 20.1], #2020
[16.5, 19.7, 22.4, 24.6, 29.0, 28.3, 29.1, 28.4, 29.5, 27.3, 23.2, 19.3] #2021
]
```
### 加分題內容:
1. 將資料點利用plt.scatter繪製出來
2. 利用np.polyfit與np.poly1d 去找出最符合資料分布的一階多項式以及二階多項式,並且繪製出來
3. 計算資料點的與一階多項式以及二階多項式分別的**least square error (mean square error)**以及**R square error (R2)**,顯示在plt.legend()中
4. 儲存圖片命名為 lab13_plus.png

5. 繳交方式:
- 程式碼:lab13_plus.py
- 圖片:lab13_plus.png
- 上傳到github的檔案夾lab13
7. 資料提供:
[oddExperiment.txt](https://drive.google.com/file/d/173nbRv8VNZNVOI96Sk_iqLH8iEEL4wUk/view)
````python=
### 資料前處理
# 讀完的資料會長這樣
[301.8267195898913, 206.48068590297993, ...........139.43161572804308, 281.7900813768265, 229.67424006279856]
[-10, -9, ................. 9, 10]
### 成績:
1. 基礎題:100/100
2. 加分題:1/1
## Lab15 AI與手寫數字辨識
### 基礎題內容:
[助教提供程式碼](https://drive.google.com/file/d/1GCWl80c6CfeJxyY8DxvMqNU2KsKSBbDH/view)
1. 利用助教提供的程式碼去進行手寫數字辨識
2. 修改ipynb檔以改善你的accuracy
4. 截圖test data 計算的accuracy 如圖
5. accuracy*100+1-20 後無條件捨去就會是你這部分的成績(80%)
6. 用小畫家寫一個數字,並且用訓練後的模型預測他,呈現結果如圖,上傳的圖片可以截圖或用python存檔(20分 能預測就有分 不用一定要預測對)
7. 繳交方式:
- 程式碼:lab15.ipynb
- accuracy圖片:lab15_acc.png
- 數字圖片:lab15_predict.png
- 上傳到github的檔案夾lab15
### 加分題內容:
1. 資料改成使用cifar 10 
2. 輸入資料的shape為(32,32,3)

3. 準確率 > 0.85 就能拿到分數
4. 繳交方式:
- 程式碼:lab15_plus.ipynb
- accuracy圖片:lab15_plus_acc.png
- 上傳到github的檔案夾lab15
### 成績:
1. 基礎題:94/100
2. 加分題:0/1