使用Python實現學生信息管理系統

来源:https://www.cnblogs.com/Hang666/archive/2023/06/12/17474792.html
-Advertisement-
Play Games

> 本文介紹了一個簡單的學生信息管理系統,包括管理員登錄、重置學生密碼、添加、刪除和修改學生信息、查詢學生信息以及對學生成績進行排序等功能。該系統使用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()

程式設計分析

功能模塊劃分

該學生成績管理系統主要包含以下功能模塊:

  1. 學生信息添加模塊;
  2. 學生信息刪除模塊;
  3. 學生信息修改模塊;
  4. 學生信息查詢模塊;
  5. 學生成績排序模塊;
  6. 學生賬號管理模塊;
  7. 管理員登錄模塊;
  8. 管理員操作許可權管理模塊;
  9. 管理員賬號管理模塊。

因此,我們可以將整個程式分為九個部分,分別實現以上九個功能模塊。

數據存儲方式

在該項目中,我們採用文本文件的方式存儲學生信息、賬號信息和管理員信息。具體地,我們將學生信息存儲在名為的文件中,每行表示一個學生的信息,包括學生姓名、班級名稱、學號以及五門課程的成績;將賬號信息存儲在名為的文件中,每行表示一個學生的賬號信息,包括學生姓名、學號、賬號以及密碼;將管理員信息存儲在名為的文件中,每行表示一個管理員的賬號信息,包括管理員賬號和密碼。這種方式簡單方便,易於實現和維護。xinxi.txt xs.txt gly.txt

程式流程設計

該項目的程式流程如下所示:

  1. 列印出菜單,讓用戶選擇要執行的操作;
  2. 如果用戶選擇管理員登錄操作,則執行管理員登錄模塊,要求用戶輸入管理員賬號和密碼並與存儲在名為的文件中的信息進行比對;如果比對成功,則可以進行管理員操作許可權管理和管理員賬號管理;gly.txt
  3. 根據用戶的選擇,調用相應的函數實現對應的功能;
  4. 用戶可以反覆執行操作,直到選擇退出程式為止。

具體的函數實現和結構設計將在下一節中進行介紹。

總結

本項目是一個簡單的學生成績管理系統,通過對該項目的分析和實現,我們可以掌握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()

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第12面: > 面試官:瞭解位運算嗎? > > 二師兄:瞭解一些。(我很熟悉) > > 面試官:請列舉以下有哪些位運算? > > 二師兄:按位與(`&`)、按位或(`|`)、按位異或(`^`),按位取反(`~`)、左移(`>`)。 > > 面試官:好 ...
  • # Object源碼閱讀 > native:本地棧方法,使用C語言中實現的方法。 ```java package java.lang; public class Object { //註冊本地方法 private static native void registerNatives(); stati ...
  • ArrayList 實現了 List 介面。它可以存儲包括 null 的任何類型的對象,允許重覆元素。ArrayList 在內部使用一個數組來存儲元素,當元素數量超過數組容量時,ArrayList 會自動重新分配更大的內部數組,並且將現有元素複製到新數組中。ArrayList 基本等同於 Vecto... ...
  • 緩存雪崩是指在緩存中的大量數據在同一個時刻全部過期,導致原本這些可以由緩存中間件處理的高併發請求,一下子全部打到資料庫,導致資料庫伺服器崩潰的一種現象。那麼出現緩存雪崩的原因可以有①:緩存中間件宕機。②:緩存中大部分key都設置了相同的時間,導致這些key在同一時間內全部失效。解決的方法: ①:可以 ...
  • 大家好呀,我是小樓。 本文是上篇文章[《使用增強版 singleflight 合併事件推送,效果炸裂!》](https://mp.weixin.qq.com/s/PFojA2DWJF7ry9Rdu8znyA)的續集,沒看過前文必須要先看完才能看本文,實在不想看,拉到文章末尾,給我點個贊再退出吧~Do ...
  • 一個字典可能只包含幾個鍵值對,也可能包含數百萬個鍵值對,所以Python支持字典遍歷。字典可用於以各種方式存儲信息,因此有多種遍歷字典的方式:可遍歷字典的所有鍵值對、鍵或值。 # 1.遍歷所有的鍵值對 其語法格式: ![image](https://img2023.cnblogs.com/blog/ ...
  • 來源:cnblogs.com/zhangyinhua/p/11545305.html ## 一、BigDecimal概述 Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數,但在實際應用中,可 ...
  • # %00截斷 **介紹:** > 0x00,%00,/00 在url中 %00 表示ascll碼中的 0 ,而ascii中0作為特殊字元保留,表示字元串結束,所以當url中出現%00時就會認為讀取已結束。但是所謂的if攔截仍會讀取後面的尾碼達到繞過白名單的效果。 當前版本環境: PHP版本低於5. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...