---
tags: 勤益課程
title: 1102小考3
---
<style>
.emp {color:red}
.info {color:green}
</style>
# 第3次小考
## 1102 Web程式設計
:::info
注意事項
- 請在完成下列題目後,將檔案存放在以學號命名的目錄,壓縮後上傳至:arrow_right: [Dropbox 雲端](https://www.dropbox.com/request/kboRJ9EGVVtQMb7VKQV0)
- 上傳時限為 5/21(六) 24:00以前,逾期視同未交。
- 請勿以任何形式抄襲其它同學的答案,若有發現,所有人一律0分。
- 若有參考網路上之程式碼,請於程式中註明出處,避免如上的抄襲疑慮。
- 答案請勿使用 Python 以外的語言撰寫。
:::
## 題目:網紅資料的CRUD操作
請在輸入正確的帳密後,進行網紅資料的CRUD操作。
### 流程
``` mermaid
graph LR
A[輸入帳密] --> C{判斷帳密是否正確}
C -->|不正確| D[顯示錯誤訊息離開程式]
C -->|正確| F{顯示選單}
F -->|1| G[建立資料庫與資料表]
F -->|2| H[匯入資料]
F -->|3| I[顯示所有紀錄]
F -->|4| J[新增記錄]
F -->|5| K[修改記錄]
F -->|6| L[查詢指定手機]
F -->|7| M[刪除所有記錄]
F -->|0,Enter| N[離開]
```
### 補充說明
若有題意不清楚之處,請於課程群組中提出,老師會酌情增加說明或提示。
- 請下載:arrow_right: [帳密檔:pass.json](https://irw.ncut.edu.tw/peterju/course/flask/1102/quiz/test3/pass.json) 與:arrow_right: [資料檔:member.txt](https://irw.ncut.edu.tw/peterju/course/flask/1102/quiz/test3/member.txt)
- 讀取 pass.json 檔案,比對帳密輸入是否正確,正確則顯示選單,不正確則結束程式
- 選單的功能請參考執行畫面,按下【Enter】或【0】結束程式,其它鍵則顯示【無效的選擇】
- 建立sqlite3資料庫:【mydb.db】
- 建立資料表:【member】,欄位如下
| 欄位名稱 | 資料形態 | 欄位要求 |
| -------| ---------- | ------------- |
| iid | 整數 | 主索引 自動累加 |
| member | 字元,長度20 | 不可無值 |
| msex | 字元,長度1 | 不可無值 |
| mphone | 字元,長度15 | 不可無值 |
- 讀取 member.txt 檔案,將資料匯入 member 資料表
- 其餘選單操作皆可以 sqlite3 套件執行 SQL 敘述完成
- 新增記錄時必須要求使用者輸入姓名、性別、手機
- 修改記錄時,必須要輸入想修改記錄的姓名
### 重要提示
- 請將功能寫成函數放入模組內供主程式呼叫,例如讀取帳密檔、讀取資料檔建立資料庫、顯示選單、選單內之各項功能,並以 lib.py 命名
- 字串的 strip() 方法可刪除頭尾的空白字元
- 主程式請以 main.py 命名,上述自訂模組請以下列敘述引用:
`from lib import *`
- 有包含變數的顯示與SQL語法操作請都使用F字串,同時需留意對齊問題
```
for record in data:
print(f"{record[0]: <6} {record[1]} {record[2]}")
```
- 所有變數命名與顯示要求必須和題目說明完全一致
- 讀取json檔案,可使用 json.load() 方法
- 可能出錯之處請使用例外處理
### 執行畫面
請點選下方【詳細資料】後展開
:::spoiler
```
D:\quiz3>py main.py
請輸入帳號:admin
請輸入密碼:13579
=>帳密錯誤,程式結束
D:\quiz3>py main.py
請輸入帳號:admin
請輸入密碼:24680
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 3
=>查無資料
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 1
=>資料庫已建立
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 2
=>異動 6 筆記錄
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 3
姓名 性別 手機
-----------------------------
辦公室小野 F 0912-345678
阿神 M 0923-456789
老高 M 0934-567890
黃明志 M 0945-678901
蔡阿嘎 F 0956-789012
簡單哥 M 0967-890123
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 4
請輸入姓名: 蔡英文
請輸入性別: F
請輸入手機: 0911-222333
=>異動 1 筆記錄
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 3
姓名 性別 手機
-----------------------------
辦公室小野 F 0912-345678
阿神 M 0923-456789
老高 M 0934-567890
黃明志 M 0945-678901
蔡阿嘎 F 0956-789012
簡單哥 M 0967-890123
蔡英文 F 0911-222333
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 5
請輸入想修改記錄的姓名:
=>必須指定姓名才可修改記錄
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 5
請輸入想修改記錄的姓名: 老高
請輸入要改變的性別: F
請輸入要改變的手機: 0923-444555
原資料:
姓名:老高,性別:M,手機:0934-567890
=>異動 1 筆記錄
修改後資料:
姓名:老高,性別:F,手機:0923-444555
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 3
姓名 性別 手機
-----------------------------
辦公室小野 F 0912-345678
阿神 M 0923-456789
老高 F 0923-444555
黃明志 M 0945-678901
蔡阿嘎 F 0956-789012
簡單哥 M 0967-890123
蔡英文 F 0911-222333
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 6
請輸入想查詢記錄的手機: 0923-444555
姓名 性別 手機
-----------------------------
老高 F 0923-444555
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 7
=>異動 7 筆記錄
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 3
=>查無資料
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 9
=>無效的選擇
---------- 選單 ----------
0 / Enter 離開
1 建立資料庫與資料表
2 匯入資料
3 顯示所有紀錄
4 新增記錄
5 修改記錄
6 查詢指定手機
7 刪除所有記錄
--------------------------
請輸入您的選擇 [0-7]: 0
D:\quiz3>
```
:::
## 解答
### main.py
請點選下方【詳細資料】後展開
:::spoiler
```python=
from lib import *
username = input('請輸入帳號:')
password = input('請輸入密碼:')
if not chkLogin(username.strip(), password.strip()):
print("=>帳密錯誤,程式結束")
quit()
while True:
lstMenu() # 顯示功能表
choice = input("請輸入您的選擇 [0-7]: ").strip()
if choice == '1':
createDB()
elif choice == '2':
importData()
elif choice == '3':
qryTable()
elif choice == '4':
iName = input("請輸入姓名: ").strip()
iSex = input("請輸入性別: ").strip()
iPhone = input("請輸入手機: ").strip()
addRec(iName, iSex, iPhone)
elif choice == '5':
qName = input("請輸入想修改記錄的姓名: ").strip()
if qName:
iSex = input("請輸入要改變的性別: ").strip()
iPhone = input("請輸入要改變的手機: ").strip()
editRec(qName, iSex, iPhone)
else:
print("=>必須指定姓名才可修改記錄")
elif choice == '6':
qPhone = input("請輸入想查詢記錄的手機: ").strip()
qryPhone(qPhone)
elif choice == '7':
delTable()
elif choice == '' or choice == '0':
break
else:
print("=>無效的選擇")
```
:::
### lib.py
請點選下方【詳細資料】後展開
:::spoiler
```python=
import sqlite3
import json
def chkLogin(uid, pwd):
try:
with open('pass.json', 'r', encoding='UTF-8') as f:
passTable = json.load(f)
except Exception as e:
print(f'=>開檔發生錯誤,錯誤訊息為{e}')
else:
for rec in passTable:
if uid == rec["帳號"] and pwd ==rec["密碼"]:
return True
return False
def lstMenu():
print()
print(10*'-', "選單", 10*'-')
print('0 / Enter 離開')
print('1 建立資料庫與資料表')
print('2 匯入資料')
print('3 顯示所有紀錄')
print('4 新增記錄')
print('5 修改記錄')
print('6 查詢指定手機')
print('7 刪除所有記錄')
print(26*'-')
def createDB():
try:
conn = sqlite3.connect('mydb.db')
conn.execute('''
create table if not exists member
(
iid integer primary key autoincrement,
member char(20) not null,
msex char(1) not null,
mphone char(15) not null
);
''')
print('=>資料庫已建立')
conn.commit()
conn.close()
except Exception as e:
print(f'=>資料庫連接或資料表建立失敗,錯誤訊息為{e}')
def importData():
try:
with open('member.txt', 'r', encoding='UTF-8') as f:
conn = sqlite3.connect('mydb.db')
for line in f:
recL = line.strip().split(',')
# conn.execute(f"insert into member(mname, msex, mphone) values ('{recL[0]}', '{recL[2]}', '{recL[2]}');")
conn.execute(f"insert into member(mname, msex, mphone) select '{recL[0]}', '{recL[1]}', '{recL[2]}' \
where not exists(select 1 from member where mname='{recL[0]}' and mphone='{recL[2]}');")
print(f"=>異動 {conn.total_changes} 筆記錄")
conn.commit()
conn.close()
except Exception as e:
print(f"=>匯入資料表失敗,錯誤訊息為{e}")
def qryTable():
try:
conn = sqlite3.connect('mydb.db')
cursor = conn.execute("select * from member")
data = cursor.fetchall()
if len(data) > 0:
print("\n姓名 性別 手機")
print("-"*29)
for record in data:
print(f"{record[0]: <6} {record[1]} {record[2]}")
else:
print("=>查無資料")
conn.commit()
conn.close()
except Exception as e:
print(f"=>顯示所有紀錄失敗,錯誤訊息為{e}")
def addRec(nm, sex, phone):
try:
conn = sqlite3.connect('mydb.db')
conn.execute(f"insert into member(mname, msex, mphone) values ('{nm}','{sex}','{phone}');")
print(f"=>異動 {conn.total_changes} 筆記錄")
conn.commit()
conn.close()
except Exception as e:
print(f"=>新增記錄失敗,錯誤訊息為{e}")
def editRec(nm, sex, phone):
try:
conn = sqlite3.connect('mydb.db')
cursor = conn.execute(f"select * from member where mname like '%{nm}%'")
data = cursor.fetchall()
print("\n原資料:")
if len(data) > 0:
for record in data:
print(f"姓名:{record[0]},性別:{record[1]},手機:{record[2]}")
conn.execute(f"update member set msex='{sex}', mphone='{phone}' where mname like '%{nm}%'")
print(f"=>異動 {conn.total_changes} 筆記錄")
cursor = conn.execute(f"select * from member where mname like '%{nm}%'")
data = cursor.fetchall()
print("修改後資料:")
if len(data) > 0:
for record in data:
print(f"姓名:{record[0]},性別:{record[1]},手機:{record[2]}")
else:
print("=>查無資料")
else:
print("=>查無資料")
conn.commit()
conn.close()
except Exception as e:
print(f"=>修改記錄失敗,錯誤訊息為{e}")
def qryPhone(phone):
try:
conn = sqlite3.connect('mydb.db')
cursor = conn.execute(f"select * from member where mphone like '%{phone}%'")
data = cursor.fetchall()
if len(data) > 0:
print("\n姓名 性別 手機")
print("-"*29)
for record in data:
print(f"{record[0]: <6} {record[1]} {record[2]}")
else:
print("=>查無資料")
conn.commit()
conn.close()
except Exception as e:
print(f"=>查詢手機失敗,錯誤訊息為{e}")
def delTable():
try:
conn = sqlite3.connect('mydb.db')
conn.execute("delete from member")
print(f"=>異動 {conn.total_changes} 筆記錄")
conn.commit()
conn.close()
except Exception as e:
print(f"=>刪除所有紀錄失敗,錯誤訊息為{e}")
```
:::