---
# System prepended metadata

title: ' '
tags: [2022計概, 工科系]

---

# 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登入，截圖如下：
![](https://hackmd.io/_uploads/BkjoM9AYn.jpg)
    2. 連進樹梅派後，輸入指令：`cat ~/.ssh/authorized_keys`，顯示公鑰內容並截圖:
![](https://hackmd.io/_uploads/BkzdXcCY2.jpg)

### 成績：
    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. 範例程式輸出如下:
![](https://hackmd.io/_uploads/ryt7g60K3.png)
3.  上傳程式碼以及程式輸出截圖到GitHub

### 成績
    基礎題：100/100

## Lab04 迴圈、串列、元組

### 基礎題內容：
1. 計算3個學生 A,B,C及5個科目(國英數自社)的平均成績
2. 請依照以下範例輸出完成作業，圖中紅框為手動輸入input()的部分：
![](https://hackmd.io/_uploads/S1y4WTCYh.png)
3.  上傳程式碼以及程式輸出截圖到GitHub
- **作業規定：請利用for, input()輸入學生的成績，並且利用list儲存**

### 加分題內容：
1. 請依據 Lab04的內容作延伸:
    - 做出防呆: 如果沒有輸入範圍內的數值，跳出警告訊息並且程式繼續執行!
2. 請依照以下範例輸出完成作業：![](https://hackmd.io/_uploads/rJJSM60F3.png)

### 成績：
    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. 請計算出每個科目的平均成績(國文, 英文, 數學, 自然, 社會)
![](https://hackmd.io/_uploads/SJZtTdZ5n.png)
5.  上傳程式碼以及程式輸出截圖到GitHub

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

### 成績：
    1. 基礎題：100/100
    2. 加分題：1/1

## Lab06 函式、模組
### 基礎題內容：
1. 請使用輾轉相除法，為兩個數字求出最大公因數
2. 若兩個數字互質，則輸出：「num1和num2互質。」
3. 若有最大公因數，則輸出：「num1和num2的最大公因數=num3」
4. 請依照以下範例輸出：
![](https://hackmd.io/_uploads/B1lGztZq3.png)
2.  上傳程式碼以及程式輸出截圖到GitHub

### 加分題內容：
1. 請使用random module，投擲1000000次骰子(骰子點數為1~6)，列出每個點數被骰到的機率(Prob)。(精準至小數點後第2位)。
2. 請依照以下範例輸出：
![](https://hackmd.io/_uploads/Syf5zF-5n.png)
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
```
![](https://hackmd.io/_uploads/HJU62FW52.png)

### 加分題內容：
#### **題目敘述：**
接續基礎題，請建立一個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現在的體重和心情分別為何？請照以下範例輸出：![](https://hackmd.io/_uploads/rJLBy5-c3.png)
2. (30%)請問shiba現在的心情是不是超過90？如果是，請照以下範例輸出：
![](https://hackmd.io/_uploads/BkZjycZ93.png)
3. (20%)請問shiba現在的心情是不是超過300？如果否，請照以下範例輸出：
![](https://hackmd.io/_uploads/HkCPJ5b9h.png)!

### 成績：
    1. 基礎題：100/100
    2. 加分題：1/1
    
## Lab08 檔案系統的使用
### 基礎題內容：
1. 讀取當前工作目錄並存成list，print在終端機裡，然後將裡面的元素一行一行寫入文字檔
2. 讀取 ‘/home/學號’ 目錄下所有檔案和資料夾，print在終端機裡，然後將裡面的元素一行一行寫入文字檔
3. 上傳程式碼到GitHub
4. 注意事項：
    - 兩題寫入同一個文字檔
    - 兩題之間用一行空白隔開
    - 請使用linesep跟sep
    - 截圖一張，截圖需先執行’ls’一次列出’/home/學號’路徑的所有檔案，再執行程式碼![](https://hackmd.io/_uploads/H1Zfb9W9h.png)

### 成績：
    基礎題：100/100

## Lab09 網路管理、Socket
### 基礎題內容：
#### 1. Linux Networking Commands (15%)
##### Network Topology (Original)
![](https://hackmd.io/_uploads/r1v4MqWqh.jpg)
1. 測試是否可以上網(從樹莓派輸入指令)
2. 查看隨便一個網址(e.g. google.com, apple.com, etc.)的ip
3. 查看到那個網頁的路徑
#### 2. RaspAP (15%)
##### Network Topology (Raspberry Pi as Router/AP)
![](https://hackmd.io/_uploads/rkPkVqbqn.jpg)
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
![](https://hackmd.io/_uploads/SJWhS9b92.jpg)
2. Server:
    - HOST = ‘10.3.141.1’ (可以先把HOST設為127.0.0.1，Server和Client都在電腦上做測試)
    - PORT = 8000
    - 檔案要放在樹莓派中
    ![](https://hackmd.io/_uploads/HyDZ8c-9n.png)
    - 一開始要顯示"Server started at: 10.3.141.1:8000"
    - 接著顯示"Waiting for connection…"
    ![](https://hackmd.io/_uploads/B1Rr8cbqh.png)
    - 當有Client連上時要顯示"Connected by (‘10.3.141.xx’, xxxxx)"
    ![](https://hackmd.io/_uploads/ryA_U5-5h.png)
    - 每收到Client傳來的訊息，要顯示Client的ip:port與內容並且回覆"Echo: + 收到的訊息"(顯示於Client)
    ![](https://hackmd.io/_uploads/HyQpUcW5h.png)
    - 當Client結束連線時，要顯示" (‘10.3.141.xx’, xxxxx) closed connection.“，接著回到"Waiting for connection…”，此時若再執行client.py可以再度建立連線。
    ![](https://hackmd.io/_uploads/BJ2lD5bcn.png)
    - server.py開始執行後要一直開著，只能最後手動把他結束 (`Crtl + C`)![](https://hackmd.io/_uploads/rJdVv9Wq3.png)
    - 檔名：server.py
3. Client:
    - 檔案要放在電腦中
    - 執行前請先執行Server
    - 一開始要顯示"Connected to 10.3.141.1:8000"
    - 接著要顯示"Send: "，此時可以一直傳訊息給Server，且會收到Server的回覆
    ![](https://hackmd.io/_uploads/r1CYDcZqh.png)
    - 當輸入訊息為"EXIT"時，結束連線，並顯示"Closed connection."
    ![](https://hackmd.io/_uploads/rJ8hv9-52.png)
    - 檔名：client.py
### 加分題內容：
1. 接續基礎題的TCP Socket，功能：讓Server可以同時服務多個Client(上述Server同時間只能服務一個Client)
![](https://hackmd.io/_uploads/SkaTdq-9n.jpg)
![](https://hackmd.io/_uploads/BkLlK5Wch.png)
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 |![](https://hackmd.io/_uploads/Hkb0ynGq2.png)|新增一個 key-value pair 並回傳’set success’，若key已存在 則回傳’key exist’|
    | /key_list |GET |無|回傳所有存在的 key (記得要轉為str格式)|
    |/get_value(key)|GET|無|回傳指定的 key 的資訊，若找不到就回傳’key not found’|
    |/update_value |POST |![](https://hackmd.io/_uploads/Hkb0ynGq2.png)|更新指定的 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
    ![](https://hackmd.io/_uploads/rJ_nO2f93.png)

        `assignment[i]` 的值代表第i個 job要分給的 agent是誰，可對照上述分配情形
        `cost` 為此種分配方法的總成本為多少
        注意：由於每個 job只能給一個 agent做，每個 agent也只能做一個 job，因此 `assignment` 中的數字不能重複，且要介於0和N−1之間
2. 測試資料：
    - 請使用input.json作為測資，形式為 dictionary，key 為題號，value 為測試的 input，助教批改時會更換測資。
    - cost 皆為正整數
    - N 大小不一定，最小為1
    ![](https://hackmd.io/_uploads/rkbQthfq2.png)
3. 輸出結果如下：
![](https://hackmd.io/_uploads/HkKBKnG5h.png)
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作為測資
    ![](https://hackmd.io/_uploads/rkyp03Gq3.png)
    
5. 輸出結果如下：
![](https://hackmd.io/_uploads/B1X1JTG5n.png)

6. 繳交方式：上傳plus.py的檔案到github上

### 成績：
    1. 基礎題：100/100
    2. 加分題：0.6/1

## Lab12 數據資料的儲存與讀取:
### 基礎題內容
1. 請至政府資料開放平臺(https://data.gov.tw/)選擇一個資料集
    - 選擇類別![](https://hackmd.io/_uploads/ry82yaz53.png)
    - 選擇資料集![](https://hackmd.io/_uploads/SJWRyafqn.png)
    - 點選JSON![](https://hackmd.io/_uploads/ByIggTzq2.png)
    - 資料原始格式![](https://hackmd.io/_uploads/BJT-xTMc3.png)
2. 用phpMyAdmin在資料庫中建立新的資料表，並新增至少四個欄位，使用PyMySQL與資料庫做溝通，最後根據API新增10筆以上的資料
3. 請在程式碼前面註解附上你使用的資料集網址![](https://hackmd.io/_uploads/SJPKVaf9h.png)

4. 繳交方式：
    - 程式碼:檔名Lab12.py的python檔
    - 截圖一張須包含完整的phpMyAdmin畫面，並且頁面停在建立好的資料表上![](https://hackmd.io/_uploads/rJS2xaMc2.png)
    - 上傳到github的檔案夾lab12

### 成績：
    基礎題：100/100
    
## Lab13 數據資料視覺化
### 基礎題內容：
1. 將歷年的台南氣溫資料用plt.plot()繪製成如下圖，儲存圖片命名為`lab13_01.png`
![](https://hackmd.io/_uploads/Hy9qSaz53.png)
2. 分別計算每個月份每年的氣溫平均值，把12個月份分別的的氣溫平均值繪製成一張表，計算每個月分氣溫的總平均值(全部的平均)，在圖表上繪製一條水平虛線，並且標示總平均值的數字在須線上，儲存圖片命名`lab13_02.png`
![](https://hackmd.io/_uploads/SySGUaG53.png)
3.  將前面兩張圖片使用subplot(1,2,x)畫在同一張圖片上，儲存圖片命名為`lab13_03.png`
![](https://hackmd.io/_uploads/BklB886fc2.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
![](https://hackmd.io/_uploads/BylC9az5n.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 如圖![](https://hackmd.io/_uploads/rJ5N2Tf5n.png)
5. accuracy*100+1-20 後無條件捨去就會是你這部分的成績(80%)
6. 用小畫家寫一個數字，並且用訓練後的模型預測他，呈現結果如圖，上傳的圖片可以截圖或用python存檔(20分 能預測就有分 不用一定要預測對)![](https://hackmd.io/_uploads/Hk5926fqh.png)
7. 繳交方式：
    - 程式碼：lab15.ipynb
    - accuracy圖片：lab15_acc.png
    - 數字圖片：lab15_predict.png
    - 上傳到github的檔案夾lab15
### 加分題內容：
1. 資料改成使用cifar 10 ![](https://hackmd.io/_uploads/ByB5RTz9n.png)
2. 輸入資料的shape為(32,32,3)
![](https://hackmd.io/_uploads/SJRsCpM93.png)
3. 準確率 > 0.85 就能拿到分數
4. 繳交方式：
    - 程式碼：lab15_plus.ipynb
    - accuracy圖片：lab15_plus_acc.png
    - 上傳到github的檔案夾lab15
### 成績：
    1. 基礎題：94/100
    2. 加分題：0/1

