> 本文介紹了一個簡單的學生信息管理系統,包括管理員登錄、重置學生密碼、添加、刪除和修改學生信息、查詢學生信息以及對學生成績進行排序等功能。該系統使用Python編寫,基於控制台交互 ## 實現思路 > 該系統分為兩個部分,管理員登錄和學生信息管理。在管理員登錄時,程式會要求用戶輸入用戶名和密碼進行 ...
本文介紹了一個簡單的學生信息管理系統,包括管理員登錄、重置學生密碼、添加、刪除和修改學生信息、查詢學生信息以及對學生成績進行排序等功能。該系統使用Python編寫,基於控制台交互
實現思路
該系統分為兩個部分,管理員登錄和學生信息管理。在管理員登錄時,程式會要求用戶輸入用戶名和密碼進行身份驗證;驗證通過後,進入到學生信息管理界面。學生信息管理界面提供了多種操作方式,包括重置學生密碼、添加、刪除和修改學生信息、查詢學生信息以及對學生成績進行排序等功能。
在實現過程中,我們使用了文件存儲學生信息,其中每一行代表一個學生的信息,各欄位之間以逗號分隔。在對學生成績進行排序時,我們計算每個學生的平均分,並將其作為排序依據。
代碼實現
登錄界面
# 登錄界面
def login():
print("歡迎使用學生信息管理系統") # 列印歡迎信息
while True: # 一直迴圈直到輸入正確的角色類型
role = input("請輸入登錄角色(1-學生,2-管理員):") # 輸入角色類型
if role == '1': # 如果輸入是學生
student_login() # 轉到學生登錄函數
break # 結束迴圈
elif role == '2': # 如果輸入是管理員
admin_login() # 轉到管理員登錄函數
break # 結束迴圈
else:
print("輸入有誤,請重新輸入") # 提示輸入錯誤,重新輸入
執行效果
學生登錄
# 學生登錄
def student_login():
while True: # 一直迴圈直到輸入正確的賬號和密碼
account = input("請輸入賬號:") # 輸入賬號
password = input("請輸入密碼:") # 輸入密碼
with open('xs.txt', 'r', encoding='utf-8') as f: # 打開存放學生信息的文件
for line in f: # 遍歷所有行
data = line.strip().split() # 分隔每行數據
姓名 = data[0].split(':')[1].strip() # 獲取姓名
學號 = data[1].split(':')[1].strip() # 獲取學號
賬號 = data[2].split(':')[1].strip() # 獲取賬號
密碼 = data[3].split(':')[1].strip() # 獲取密碼
if 賬號 == account and 密碼 == password: # 如果賬號和密碼匹配
print(f"歡迎登陸,{姓名}同學!") # 列印歡迎信息
student_menu(account) # 轉到學生菜單函數
return # 結束函數
print("賬號或密碼錯誤,請重新輸入") # 提示輸入錯誤,重新輸入
執行效果
學生菜單
# 學生菜單
def student_menu(account):
while True: # 一直迴圈直到選擇退出系統或者退回登錄界面
print("""
================
1. 查看所有學生信息
2. 查詢個人信息
3. 退回登錄界面
0. 退出系統
================
""") # 列印菜單
choice = input("請輸入您的選擇:") # 輸入選項
if choice == "1": # 如果輸入為 1
show_all_students() # 轉到顯示所有學生信息函數
elif choice == "2": # 如果輸入為 2
show_student_info() # 轉到顯示個人信息函數
elif choice == "3": # 如果輸入為 3
login() # 返回登陸
elif choice == "0": # 如果輸入為 0
print("感謝使用本系統,再見!") # 列印歡送信息
exit() # 退出程式
else:
print("輸入有誤,請重新輸入!") # 提示輸入錯誤,重新輸入
執行效果
展示所有學生信息
# 展示所有學生信息
def show_all_students():
with open('xinxi.txt', 'r',encoding='utf-8') as f: # 打開存放學生信息的文件
lines = f.readlines() # 讀取所有行
if len(lines) == 0: # 如果文件為空
print("暫無學生信息") # 列印提示信息
return # 結束函數
header = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format("姓 名", "班 級", "學 號", "Linux", "Python", "C語言", "C++語言", "Java語言", "平均分") # 定義表頭格式
print(header) # 列印表頭
for line in lines: # 遍歷每一行數據
info = line.strip().split(',') # 分隔每行數據
student_info = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format(info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[8]) # 格式化學生信息
print(student_info) # 列印學生信息
執行效果
查詢單個學生的學生信息
# 查詢單個學生的學生信息
def show_student_info():
student_id = input("請輸入要查詢的學號:") # 輸入學號
with open('xinxi.txt', 'r', encoding='utf-8') as f: # 打開存放學生信息的文件
found = False # 判斷是否找到該學生信息
for line in f: # 遍歷每一行數據
info = line.strip().split(',') # 分隔每行數據
if info[2] == student_id: # 如果該行數據中的學號和輸入的學號相同
print(f"姓名:{info[0]}") # 列印姓名
print(f"班級:{info[1]}") # 列印班級
print(f"學號:{info[2]}") # 列印學號
print(f"Linux成績:{info[3]}") # 列印 Linux 成績
print(f"Python成績:{info[4]}") # 列印 Python 成績
print(f"C語言成績:{info[5]}") # 列印 C 語言成績
print(f"C++語言成績:{info[6]}") # 列印 C++ 語言成績
print(f"Java語言成績:{info[7]}") # 列印 Java 語言成績
print(f"平均分:{info[8]}") # 列印平均分
found = True # 標記為找到
break # 結束迴圈
if not found: # 如果未找到該學生信息
print("未找到該學號的學生信息") # 提示未找到
執行效果
管理員登錄
# 管理員登錄
def admin_login():
while True: # 一直迴圈直到輸入正確的賬號和密碼或手動退出
account = input("請輸入賬號:") # 輸入賬號
password = input("請輸入密碼:") # 輸入密碼
try:
with open('gly.txt', 'r', encoding='utf-8') as f: # 打開存放管理員信息的文件
for line in f: # 遍歷每一行數據
info = line.strip().split(' ') # 分隔每行數據
if len(info) != 4: # 如果分割後的數據不是 4 項(即格式不正確)
continue # 跳過本次迴圈
# 根據文件內容里的冒號進行處理
name = info[0].split(':')[1] # 獲取姓名
num = info[1].split(':')[1] # 獲取工號
acc = info[2].split(':')[1] # 獲取賬號
pwd = info[3].split(':')[1] # 獲取密碼
if acc == account and pwd == password: # 如果賬號和密碼匹配
print(f"歡迎登陸,{name}管理員!") # 列印歡迎信息
admin_menu() # 轉到管理員菜單函數
return # 結束函數
print("賬號或密碼錯誤,請重新輸入") # 提示輸入錯誤,重新輸入
except IOError: # 捕獲文件打開異常
print("無法打開文件,請檢查文件路徑和許可權") # 提示無法打開文件
return # 結束函數
except Exception as e: # 捕獲其他異常
print(f"發生錯誤:{str(e)}") # 列印錯誤信息
return # 結束函數
執行效果
管理員菜單
# 管理員菜單
def admin_menu():
while True: # 一直迴圈直到選擇退出程式
choice = input(
"請選擇操作(1-重置學生賬號密碼,2-添加學生信息,3-刪除學生信息,4-修改學生信息,5-查詢學生信息,6-學生成績排序,0-退出):") # 列印管理員操作菜單,輸入選項
if choice == '1': # 如果選擇 1
reset_password() # 轉到重置學生賬號密碼函數
elif choice == '2': # 如果選擇 2
add_student() # 轉到添加學生信息函數
elif choice == '3': # 如果選擇 3
delete_student() # 轉到刪除學生信息函數
elif choice == '4': # 如果選擇 4
modify_student() # 轉到修改學生信息函數
elif choice == '5': # 如果選擇 5
search_student() # 轉到查詢學生信息函數
elif choice == '6': # 如果選擇 6
sort_students() # 轉到學生成績排序函數
elif choice == '0': # 如果選擇 0
break # 退出迴圈
else:
print("輸入有誤,請重新輸入") # 提示輸入錯誤,重新輸入
執行效果
重置學生賬號密碼
# 重置學生賬號密碼
def reset_password():
choice = input("請選擇操作(1-修改密碼,2-刪除賬號,3-添加賬號):") # 列印選項菜單,輸入選擇
if choice == '1': # 如果選擇 1
student_id = input("請輸入要修改密碼的學號:") # 輸入要修改密碼的學號
with open('xs.txt', 'r', encoding='utf-8-sig') as f: # 打開存放學生信息的文件
lines = f.readlines() # 讀取所有行數據
for i in range(len(lines)): # 遍歷每一行數據
line = lines[i].strip() # 去除首尾空格
info = line.split() # 分隔每行數據
if len(info) != 4: # 如果分割後的數據不是 4 項(即格式不正確)
continue # 跳過本次迴圈
name = info[0][3:] # 獲取姓名
sid = info[1][3:] # 獲取學號
account = info[2][3:] # 獲取賬號
password = info[3][3:] # 獲取密碼
if sid == student_id: # 如果學號匹配
print(f"姓名:{name},學號:{sid},賬號:{account},密碼:{password}") # 列印該學生信息
new_password = input("請輸入新密碼:") # 輸入新密碼
# 修改密碼
lines[i] = f"姓名:{name} 學號:{sid} 賬號:{account} 密碼:{new_password}\n"
with open('xs.txt', 'w', encoding='utf-8-sig') as f:
f.writelines(lines)
print("密碼修改成功") # 提示密碼修改成功
break # 結束迴圈
else: # 如果未找到該學生信息
print("未找到該學號的學生信息") # 提示未找到
elif choice == '2': # 如果選擇 2
student_id = input("請輸入要刪除賬號的學號:") # 輸入要刪除賬號的學號
with open('xs.txt', 'r', encoding='utf-8-sig') as f: # 打開存放學生信息的文件
lines = f.readlines() # 讀取所有行數據
for i in range(len(lines)): # 遍歷每一行數據
line = lines[i].strip() # 去除首尾空格
info = line.split() # 分隔每行數據
if len(info) != 4: # 如果分割後的數據不是 4 項(即格式不正確)
continue # 跳過本次迴圈
name = info[0][3:] # 獲取姓名
sid = info[1][3:] # 獲取學號
account = info[2][3:] # 獲取賬號
password = info[3][3:] # 獲取密碼
if sid == student_id: # 如果學號匹配
print(f"姓名:{name},學號:{sid},賬號:{account},密碼:{password}") # 列印該學生信息
# 刪除賬號
del lines[i] # 刪除該行數據
with open('xs.txt', 'w', encoding='utf-8-sig') as f:
f.writelines(lines)
print("賬號刪除成功") # 提示賬號刪除成功
break # 結束迴圈
else: # 如果未找到該學生信息
print("未找到該學號的學生信息") # 提示未找到
elif choice == '3': # 如果選擇 3
new_sid = input("請輸入新的學號:") # 輸入新學號
new_name = input("請輸入姓名:") # 輸入姓名
new_account = input("請輸入賬號:") # 輸入賬號
new_password = input("請輸入密碼:") # 輸入密碼
new_line = f"姓名:{new_name} 學號:{new_sid} 賬號:{new_account} 密碼:{new_password}\\n"
with open('xs.txt', 'a', encoding='utf-8-sig') as f: # 打開存放學生信息的文件
f.write(new_line) # 寫入新行數據
print("賬號添加成功") # 提示賬號添加成功
else:
print("輸入有誤,請重新選擇") # 提示選擇錯誤,重新選擇操作
執行效果
添加學生信息
# 添加學生信息
def add_student():
# 要求用戶輸入學生信息(姓名,班級,學號,Linux成績,Python成績,C語言成績,C++語言成績,Java語言成績)
student_info = input("請輸入學生信息(姓名,班級,學號,Linux成績,Python成績,C語言成績,C++語言成績,Java語言成績):")
info_list = student_info.split(',') # 將輸入的信息按逗號分隔開
if len(info_list) < 8: # 如果信息項不足8項(即輸入不完整)
print("輸入的信息不完整,請重新輸入!") # 提示信息不完整
return
name, cls, id, linux, python, c, cpp, java = info_list[:8] # 獲取各個信息項
total_score = (int(linux) + int(python) + int(c) + int(cpp) + int(java)) / 5 # 計算平均分
student_info = f"{name},{cls},{id},{linux},{python},{c},{cpp},{java}" # 構造要寫入文件的字元串
with open('xinxi.txt', 'a', encoding='utf-8') as f: # 打開存放學生信息的文件(以追加方式)
f.write(f"{student_info},{total_score}\n") # 將學生信息和平均分寫入文件
print(f"學生信息添加成功,平均分為{total_score},平均分已自動填充") # 輸出添加成功提示信息
執行效果
刪除學生信息
# 刪除學生信息
def delete_student():
student_id = input("請輸入要刪除信息的學號:")
with open('xinxi.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for i in range(len(lines)):
info = lines[i].strip().split(",")
if info[2] == student_id:
del lines[i]
with open('xinxi.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
print("學生信息刪除成功")
break
else:
print("未找到該學號的學生信息")
執行效果
修改學生信息
# 修改學生信息
def modify_student():
# 輸入要修改信息的學號
student_id = input("請輸入要修改信息的學號:")
# 打開文件並讀取所有行
with open('xinxi.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
# 迴圈遍歷每一行
for i in range(len(lines)):
# 分割數據並賦值給變數
data = lines[i].strip().split(',')
學生姓名 = data[0]
班級 = data[1]
學號 = data[2]
Linux成績 = int(data[3])
Python成績 = int(data[4])
C語言成績 = int(data[5])
Cpp語言成績 = int(data[6])
Java語言成績 = int(data[7])
平均分 = float(data[8])
# 如果學號匹配成功,則進入修改流程
if 學號 == student_id:
# 輸入新的學生信息
new_info_str = input(
"請按照格式輸入新的學生信息(姓名,班級,學號,Linux成績,Python成績,C語言成績,C++語言成績,Java語言成績):")
# 分割新的學生信息並賦值給變數
new_info = new_info_str.strip().split(',')
new_學生姓名 = new_info[0]
new_班級 = new_info[1]
new_學號 = new_info[2]
new_Linux成績 = int(new_info[3])
new_Python成績 = int(new_info[4])
new_C語言成績 = int(new_info[5])
new_Cpp語言成績 = int(new_info[6])
new_Java語言成績 = int(new_info[7])
# 計算新的平均分
new_平均分 = (new_Linux成績 + new_Python成績 + new_C語言成績 + new_Cpp語言成績 + new_Java語言成績) / 5
# 生成新的一行數據並替換舊的數據
lines[i] = f"{new_學生姓名},{new_班級},{new_學號},{new_Linux成績},{new_Python成績},{new_C語言成績},{new_Cpp語言成績},{new_Java語言成績},{new_平均分}\n"
# 打開文件並寫入新的所有行
with open('xinxi.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
# 輸出成功信息並結束函數
print("學生信息修改成功")
break
else:
# 如果未找到該學號的學生信息,則輸出失敗信息
print("未找到該學號的學生信息")
執行效果
查詢學生信息
# 查詢學生信息
def search_student():
# 輸入要查詢信息的學號
student_id = input("請輸入要查詢信息的學號:")
# 打開文件並逐行讀取
with open('xinxi.txt', 'r', encoding='utf-8') as f:
for line in f:
# 分割數據並賦值給變數
data = line.strip().split(',')
學生姓名 = data[0]
班級 = data[1]
學號 = data[2]
Linux成績 = data[3]
Python成績 = data[4]
C語言成績 = data[5]
Cpp語言成績 = data[6]
Java語言成績 = data[7]
平均分 = data[8]
# 如果學號匹配成功,則輸出學生信息並結束函數
if 學號 == student_id:
print(f"姓名:{學生姓名}")
print(f"班級:{班級}")
print(f"學號:{學號}")
print(f"Linux成績:{Linux成績}")
print(f"Python成績:{Python成績}")
print(f"C語言成績:{C語言成績}")
print(f"C++語言成績:{Cpp語言成績}")
print(f"Java語言成績:{Java語言成績}")
print(f"平均分:{平均分}")
break
else:
# 如果未找到該學號的學生信息,則輸出失敗信息
print("未找到該學號的學生信息")
執行效果
學生成績排序
# 學生成績排序
def sort_students():
# 迴圈直到用戶輸入正確選項為止
while True:
choice = input("請選擇排序方式(1-升序,2-降序):")
if choice == '1':
reverse = False
break
elif choice == '2':
reverse = True
break
else:
print("輸入有誤,請重新選擇")
# 打開文件並讀取所有行
with open('xinxi.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
students = []
# 迴圈遍歷每一行數據,並將其轉化為元組類型加入到 students 列表中
for line in lines:
info = line.strip().split(',')
score_sum = sum(map(float, info[3:]))
students.append((info[0], info[1], info[2], *info[3:], score_sum))
# 對 students 列表進行排序
students.sort(key=lambda x: x[-1], reverse=reverse)
# 輸出表格標題
print("排序結果如下:")
print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
"+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
"姓名", "班級", "學號", "Linux", "Python", "C語言", "C++語言", "Java語言", "平均分"))
print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
"+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
# 迴圈遍歷每一個排序後的學生信息,並輸出到控制臺上
for student in students:
print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
student[0], student[1], student[2], student[3], student[4], student[5], student[6], student[7], student[8]))
print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
"+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
執行效果
主函數
# 主函數
if __name__ == '__main__':
# 調用登錄函數
login()
程式設計分析
功能模塊劃分
該學生成績管理系統主要包含以下功能模塊:
- 學生信息添加模塊;
- 學生信息刪除模塊;
- 學生信息修改模塊;
- 學生信息查詢模塊;
- 學生成績排序模塊;
- 學生賬號管理模塊;
- 管理員登錄模塊;
- 管理員操作許可權管理模塊;
- 管理員賬號管理模塊。
因此,我們可以將整個程式分為九個部分,分別實現以上九個功能模塊。
數據存儲方式
在該項目中,我們採用文本文件的方式存儲學生信息、賬號信息和管理員信息。具體地,我們將學生信息存儲在名為的文件中,每行表示一個學生的信息,包括學生姓名、班級名稱、學號以及五門課程的成績;將賬號信息存儲在名為的文件中,每行表示一個學生的賬號信息,包括學生姓名、學號、賬號以及密碼;將管理員信息存儲在名為的文件中,每行表示一個管理員的賬號信息,包括管理員賬號和密碼。這種方式簡單方便,易於實現和維護。xinxi.txt
xs.txt
gly.txt
程式流程設計
該項目的程式流程如下所示:
- 列印出菜單,讓用戶選擇要執行的操作;
- 如果用戶選擇管理員登錄操作,則執行管理員登錄模塊,要求用戶輸入管理員賬號和密碼並與存儲在名為的文件中的信息進行比對;如果比對成功,則可以進行管理員操作許可權管理和管理員賬號管理;
gly.txt
- 根據用戶的選擇,調用相應的函數實現對應的功能;
- 用戶可以反覆執行操作,直到選擇退出程式為止。
具體的函數實現和結構設計將在下一節中進行介紹。
總結
本項目是一個簡單的學生成績管理系統,通過對該項目的分析和實現,我們可以掌握Python語言基本的文件處理技巧、字元串操作技巧、異常處理技巧等;同時也加深了我們對面向過程編程思想的理解和應用能力。在未來的開發工作中,這些技能和經驗都將非常有用。
完整代碼
# 登錄界面
def login():
print("歡迎使用學生信息管理系統")
while True:
role = input("請輸入登錄角色(1-學生,2-管理員):")
if role == '1':
student_login()
break
elif role == '2':
admin_login()
break
else:
print("輸入有誤,請重新輸入")
# 學生登錄
def student_login():
while True:
account = input("請輸入賬號:")
password = input("請輸入密碼:")
with open('xs.txt', 'r', encoding='utf-8') as f:
for line in f:
data = line.strip().split()
姓名 = data[0].split(':')[1].strip()
學號 = data[1].split(':')[1].strip()
賬號 = data[2].split(':')[1].strip()
密碼 = data[3].split(':')[1].strip()
if 賬號 == account and 密碼 == password:
print(f"歡迎登陸,{姓名}同學!")
student_menu(account)
return
print("賬號或密碼錯誤,請重新輸入")
# 學生菜單
def student_menu(account):
while True:
print("""
================
1. 查看所有學生信息
2. 查詢個人信息
3. 退回登錄界面
0. 退出系統
================
""")
choice = input("請輸入您的選擇:")
if choice == "1":
show_all_students()
elif choice == "2":
show_student_info()
elif choice == "3":
return
elif choice == "0":
print("感謝使用本系統,再見!")
exit()
else:
print("輸入有誤,請重新輸入!")
# 展示所有學生信息
def show_all_students():
with open('xinxi.txt', 'r',encoding='utf-8') as f:
lines = f.readlines()
if len(lines) == 0:
print("暫無學生信息")
return
header = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format("姓 名", "班 級", "學 號", "Linux", "Python", "C語言", "C++語言", "Java語言", "平均分")
print(header)
for line in lines:
info = line.strip().split(',')
student_info = "{:<6}{:<10}{:<12}{:<8}{:<8}{:<8}{:<8}{:<8}{:<8}".format(info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[8])
print(student_info)
# 查詢單個學生的學生信息
def show_student_info():
student_id = input("請輸入要查詢的學號:")
with open('xinxi.txt', 'r', encoding='utf-8') as f:
found = False
for line in f:
info = line.strip().split(',')
if info[2] == student_id:
print(f"姓名:{info[0]}")
print(f"班級:{info[1]}")
print(f"學號:{info[2]}")
print(f"Linux成績:{info[3]}")
print(f"Python成績:{info[4]}")
print(f"C語言成績:{info[5]}")
print(f"C++語言成績:{info[6]}")
print(f"Java語言成績:{info[7]}")
print(f"平均分:{info[8]}")
found = True
break
if not found:
print("未找到該學號的學生信息")
# 管理員登錄
def admin_login():
while True:
account = input("請輸入賬號:")
password = input("請輸入密碼:")
try:
with open('gly.txt', 'r', encoding='utf-8') as f:
for line in f:
info = line.strip().split(' ')
if len(info) != 4:
continue
# 根據文件內容里的冒號進行處理
name = info[0].split(':')[1]
num = info[1].split(':')[1]
acc = info[2].split(':')[1]
pwd = info[3].split(':')[1]
if acc == account and pwd == password:
print(f"歡迎登陸,{name}管理員!")
admin_menu()
return
print("賬號或密碼錯誤,請重新輸入")
except IOError:
print("無法打開文件,請檢查文件路徑和許可權")
return
except Exception as e:
print(f"發生錯誤:{str(e)}")
return
# 管理員菜單
def admin_menu():
while True:
choice = input(
"請選擇操作(1-重置學生賬號密碼,2-添加學生信息,3-刪除學生信息,4-修改學生信息,5-查詢學生信息,6-學生成績排序,0-退出):")
if choice == '1':
reset_password()
elif choice == '2':
add_student()
elif choice == '3':
delete_student()
elif choice == '4':
modify_student()
elif choice == '5':
search_student()
elif choice == '6':
sort_students()
elif choice == '0':
break
else:
print("輸入有誤,請重新輸入")
# 重置學生賬號密碼
def reset_password():
choice = input("請選擇操作(1-修改密碼,2-刪除賬號,3-添加賬號):")
if choice == '1':
student_id = input("請輸入要修改密碼的學號:")
with open('xs.txt', 'r', encoding='utf-8-sig') as f:
lines = f.readlines()
for i in range(len(lines)):
line = lines[i].strip()
info = line.split()
if len(info) != 4:
continue
name = info[0][3:] # 姓名
sid = info[1][3:] # 學號
account = info[2][3:] # 賬號
password = info[3][3:] # 密碼
if sid == student_id:
print(f"姓名:{name},學號:{sid},賬號:{account},密碼:{password}")
new_password = input("請輸入新密碼:")
# 修改密碼
lines[i] = f"姓名:{name} 學號:{sid} 賬號:{account} 密碼:{new_password}\n"
with open('xs.txt', 'w', encoding='utf-8-sig') as f:
f.writelines(lines)
print("密碼修改成功")
break
else:
print("未找到該學號的學生信息")
elif choice == '2':
student_id = input("請輸入要刪除賬號的學號:")
with open('xs.txt', 'r', encoding='utf-8-sig') as f:
lines = f.readlines()
for i in range(len(lines)):
line = lines[i].strip()
info = line.split()
if len(info) != 4:
continue
name = info[0][3:] # 姓名
sid = info[1][3:] # 學號
account = info[2][3:] # 賬號
password = info[3][3:] # 密碼
if sid == student_id:
print(f"姓名:{name},學號:{sid},賬號:{account},密碼:{password}")
# 刪除賬號
del lines[i]
with open('xs.txt', 'w', encoding='utf-8-sig') as f:
f.writelines(lines)
print("賬號刪除成功")
break
else:
print("未找到該學號的學生信息")
elif choice == '3':
new_sid = input("請輸入新的學號:")
new_name = input("請輸入姓名:")
new_account = input("請輸入賬號:")
new_password = input("請輸入密碼:")
new_line = f"姓名:{new_name} 學號:{new_sid} 賬號:{new_account} 密碼:{new_password}\n"
with open('xs.txt', 'a', encoding='utf-8-sig') as f:
f.write(new_line)
print("賬號添加成功")
else:
print("輸入有誤,請重新選擇")
# 添加學生信息
def add_student():
student_info = input("請輸入學生信息(姓名,班級,學號,Linux成績,Python成績,C語言成績,C++語言成績,Java語言成績):")
info_list = student_info.split(',')
if len(info_list) < 8:
print("輸入的信息不完整,請重新輸入!")
return
name, cls, id, linux, python, c, cpp, java = info_list[:8]
total_score = (int(linux) + int(python) + int(c) + int(cpp) + int(java)) / 5
student_info = f"{name},{cls},{id},{linux},{python},{c},{cpp},{java}"
with open('xinxi.txt', 'a', encoding='utf-8') as f:
f.write(f"{student_info},{total_score}\n")
print(f"學生信息添加成功,平均分為{total_score},平均分已自動填充")
# 刪除學生信息
def delete_student():
student_id = input("請輸入要刪除信息的學號:")
with open('xinxi.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for i in range(len(lines)):
info = lines[i].strip().split(",")
if info[2] == student_id:
del lines[i]
with open('xinxi.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
print("學生信息刪除成功")
break
else:
print("未找到該學號的學生信息")
# 修改學生信息
def modify_student():
student_id = input("請輸入要修改信息的學號:")
with open('xinxi.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for i in range(len(lines)):
data = lines[i].strip().split(',')
學生姓名 = data[0]
班級 = data[1]
學號 = data[2]
Linux成績 = int(data[3])
Python成績 = int(data[4])
C語言成績 = int(data[5])
Cpp語言成績 = int(data[6])
Java語言成績 = int(data[7])
平均分 = float(data[8])
if 學號 == student_id:
new_info_str = input(
"請按照格式輸入新的學生信息(姓名,班級,學號,Linux成績,Python成績,C語言成績,C++語言成績,Java語言成績):")
new_info = new_info_str.strip().split(',')
new_學生姓名 = new_info[0]
new_班級 = new_info[1]
new_學號 = new_info[2]
new_Linux成績 = int(new_info[3])
new_Python成績 = int(new_info[4])
new_C語言成績 = int(new_info[5])
new_Cpp語言成績 = int(new_info[6])
new_Java語言成績 = int(new_info[7])
new_平均分 = (new_Linux成績 + new_Python成績 + new_C語言成績 + new_Cpp語言成績 + new_Java語言成績) / 5
lines[i] = f"{new_學生姓名},{new_班級},{new_學號},{new_Linux成績},{new_Python成績},{new_C語言成績},{new_Cpp語言成績},{new_Java語言成績},{new_平均分}\n"
with open('xinxi.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
print("學生信息修改成功")
break
else:
print("未找到該學號的學生信息")
# 查詢學生信息
def search_student():
student_id = input("請輸入要查詢信息的學號:")
with open('xinxi.txt', 'r', encoding='utf-8') as f:
for line in f:
data = line.strip().split(',')
學生姓名 = data[0]
班級 = data[1]
學號 = data[2]
Linux成績 = data[3]
Python成績 = data[4]
C語言成績 = data[5]
Cpp語言成績 = data[6]
Java語言成績 = data[7]
平均分 = data[8]
if 學號 == student_id:
print(f"姓名:{學生姓名}")
print(f"班級:{班級}")
print(f"學號:{學號}")
print(f"Linux成績:{Linux成績}")
print(f"Python成績:{Python成績}")
print(f"C語言成績:{C語言成績}")
print(f"C++語言成績:{Cpp語言成績}")
print(f"Java語言成績:{Java語言成績}")
print(f"平均分:{平均分}")
break
else:
print("未找到該學號的學生信息")
# 學生成績排序
def sort_students():
while True:
choice = input("請選擇排序方式(1-升序,2-降序):")
if choice == '1':
reverse = False
break
elif choice == '2':
reverse = True
break
else:
print("輸入有誤,請重新選擇")
with open('xinxi.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
students = []
for line in lines:
info = line.strip().split(',')
score_sum = sum(map(float, info[3:]))
students.append((info[0], info[1], info[2], *info[3:], score_sum))
students.sort(key=lambda x: x[-1], reverse=reverse)
print("排序結果如下:")
print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
"+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
"姓名", "班級", "學號", "Linux", "Python", "C語言", "C++語言", "Java語言", "平均分"))
print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
"+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
for student in students:
print("|{:^8}|{:^15}|{:^10}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|{:^12}|".format(
student[0], student[1], student[2], student[3], student[4], student[5], student[6], student[7], student[8]))
print("+" + "-" * 8 + "+" + "-" * 15 + "+" + "-" * 10 + "+" + "-" * 12 +
"+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+" + "-" * 12 + "+")
# 主函數
if __name__ == '__main__':
login()