# 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