--- tags: 勤益課程 title: 1102期中考 --- <style> .emp {color:red} .info {color:green} </style> # 期中考 ## 1102 Web程式設計 :::info 注意事項 - 請在完成下列題目後,將檔案存放在以學號命名的目錄,壓縮後上傳至:arrow_right: [Dropbox 雲端](https://www.dropbox.com/request/WNdEohU6BUhBHbT1Ansu) - 上傳時限為 4/29(五) 12:00以前,逾期視同未交。 - 請勿以任何形式抄襲其它同學的答案,若有發現,所有人一律0分。 - 若有參考網路上之程式碼,請於程式中註明出處,避免如上的抄襲疑慮。 - 答案請勿使用 Python 以外的語言撰寫。 - 本次考試共有3小題,需打包上傳的目錄檔案結構請參考下圖 ![](https://i.imgur.com/7sEJw6S.png) ::: ## 題目1:員工薪資紀錄程式(midexam1.py)-33% 請參照以下畫面進行員工薪資的輸入,請確保最終執行結果與畫面完全一致。 ### 執行畫面 ``` D:\9A239245>py midterm1.py ----------------------- 員工薪資輸入 若姓名處未輸入則代表結束 ----------------------- 請輸入姓名:Peter 請輸入薪資:50000 請輸入姓名:Janet 請輸入薪資:60000 請輸入姓名:John 請輸入薪資:55220 請輸入姓名: ------------------------ 員工Peter 的薪資為 50000 員工Janet 的薪資為 60000 員工John 的薪資為 55220 ------------------------ 合計薪資: 165220.00 平均薪資: 55073.33 ======================== ``` ### 提示 - 請將每筆紀錄使用字典 Dict 來儲存,分別為姓名與薪資 (key:eName, eSalary) - 請將所有字典儲存在一個串列 List 中 - 可使用 while True: ,配合 break 中斷來進行主要迴圈 - 最後將所有輸入過的員工姓名與薪資印在螢幕上,最後並加上合計與平均薪資,其中必須使用F字串樣板,並請留意其對齊方式 - 合計與平均薪資也必須使用F字串樣板呈現出小數點2位並靠右對齊 - 請以 midexam1.py 命名存檔 ## 題目2:三角形重心計算(midexam2.py)-33% 請撰寫一個名為 triangle_zhonxin(a,b,c) 的求三角形重心函數,將之放在 pack 套件(目錄)下的 modu 模組(檔案)中,以提供其它程式呼叫使用。 ![](https://i.imgur.com/Chhcn63.png) 設三點為 A(x1,y1)、B(x2,y2)、C(x3,y3) 求重心 G 點的座標 (x,y) 三角形的重心公式如下: > x=(x1+x2+x3)/3 > y=(y1+y2+y3)/3 ### 執行畫面 參考1: ```=shell D:\9A239245>py midexam2.py 請輸入三角形的3個頂點坐標 ------------------------------ 請輸入頂點a的坐標:1,1 請輸入頂點b的坐標:2,2 請輸入頂點c的坐標:3,3 ------------------------------ 此三角形的重心為:(2, 2) ``` 參考2: ```=shell D:\9A239245>py midexam2.py 請輸入三角形的3個頂點坐標 ------------------------------ 請輸入頂點a的坐標:5,8 請輸入頂點b的坐標:9,11 請輸入頂點c的坐標:13,19 ------------------------------ 此三角形的重心為:(9, 13) ``` ### 提示 - 三個頂點坐標的輸入,需各自轉為 tuple - 輸入字串中的逗號(,)可用字串的split()方法拆開 - tuple() 方法可轉成 tuple 容器形態 - 呼叫 pack 套件下 modu 模組的 triangle_zhonxin 函數,需傳入 a,b,c 三個 tuple 變數<span class='info'>(白話:沒有pack目錄,pack目錄下沒有modu.py的話就是錯的)</span> - triangle_zhonxin 函數需回傳重心的坐標,該坐標也是一個 tuple 變數 - 整數經由除法計算後會變成浮點數 - 坐標計算後若有小數點,<span class='info'>請利用 round()四捨五入到整數</span> - 最後顯示重心坐標需使用F字串進行顯示 - 請以 midexam2.py 命名存檔 ## 題目3:城市天氣查詢(midexam3.py)-34% 請讀取台灣各城市之 PM2.5 文字檔案,匯入字典(dict)容器,然後讓使用者查詢,具體要求請參考下列提示 ### 執行畫面 ``` D:\9A239245>py midexam3.py 請輸入您想查詢 PM2.5 的城市:台中市 台中市 的 PM2.5為 22.8 請輸入您想查詢 PM2.5 的城市:台北市 台北市 的 PM2.5為 16.3 請輸入您想查詢 PM2.5 的城市:東京 查無此城市 請輸入您想查詢 PM2.5 的城市: 謝謝使用本程式 ``` ### 提示 1. 請複製以下內容另存為 citys.txt 文字檔 ``` 花蓮縣 9.4 台東縣 10.4 宜蘭縣 12.3 基隆線 15.4 台北市 16.3 新北市 17.9 澎湖縣 18.8 桃園市 19.3 新竹縣 20.9 台中市 22.8 新竹市 23.1 苗栗縣 23.5 屏東縣 26.3 連江縣 26.7 彰化縣 28.0 嘉義縣 30.6 金門縣 31.3 雲林縣 32.1 南投縣 32.8 台南市 32.8 嘉義市 34.2 高雄市 34.9 ``` 2. 讀取 citys.txt 文字檔,成為一個字典容器(字典名:citydict) 3. 讀取至字典時,要注意有中文與浮點數的問題 4. 讀取檔案時請進行例外處理,例如IO錯誤則顯示讀取失敗,或發生無預期的錯誤...等 5. 以迴圈進行提示使用者輸入想查詢 PM2.5 的城市,若未輸入才結束查詢 6. 查詢對應城市 PM2.5 的部分請寫成一個 pack 套件 weather 模組中的 qrypm25 函數,供上述查詢重複呼叫之用 7. 查到資料後的回應請使用F字串樣板,查不到則顯示"查無此城市" 8. 留意關檔、結束迴圈、字串樣板的使用時機 # 解答 ## midexam1.py ```python= employees=[] employee={} print("-----------------------\n員工薪資輸入\n若姓名處未輸入則代表結束\n-----------------------") while True: empName=input("請輸入姓名:") if empName=="": break salary=int(input("請輸入薪資:")) employee["eName"]=empName employee["eSalary"]=salary employees.append(employee) employee={} print() print("-"*24) total = 0 empnum = len(employees) for emp in employees: total = total + emp['eSalary'] print(F"員工{emp['eName']:6}的薪資為{emp['eSalary']:6}") print("-"*24) print(F"合計薪資:{total:>14.2f}") print(F"平均薪資:{total/empnum:>14.2f}") print("="*24) ``` ## midexam2.py ```python= import pack.modu as lib print('請輸入三角形的3個頂點坐標') print('-'*30) a=input("請輸入頂點a的坐標:") b=input("請輸入頂點b的坐標:") c=input("請輸入頂點c的坐標:") a = tuple(int(x) for x in a.split(",")) b = tuple(int(x) for x in b.split(",")) c = tuple(int(x) for x in c.split(",")) zhonxi_coordinate = lib.triangle_zhonxin(a, b, c) print('-'*30) print(f'此三角形的重心為:{zhonxi_coordinate}') ``` ```=python # pack/modu.py def triangle_zhonxin(a, b, c): x = round((a[0]+b[0]+c[0])/3) y = round((a[1]+b[1]+c[1])/3) return (x,y) ``` ## midexam3.py ```python= from pack.weather import qrypm25 citydict = {} try: f = open('citys.txt', 'r', encoding='UTF-8') for line in f: (city, pm25) = line.split() citydict[city] = float(pm25) f.close() except IOError: print("讀取失敗") except: # pylint: disable=bare-except print("無預期的錯誤") else: while True: qrycity=input("請輸入您想查詢 PM2.5 的城市:") if qrycity: answer=qrypm25(citydict, qrycity) print(f"{qrycity} 的 PM2.5為 {answer}" if answer else "查無此城市") print() else: break finally: print("\n謝謝使用本程式") ``` ```python= # pack/weather.py def qrypm25(citydict, city): answer=citydict.get(city,999) if answer==999: return "" return citydict[city] ``` # 成績公佈 ![](https://i.imgur.com/gWqtCtS.jpg)