运动会成绩管理系统python_Python 实现简易版成绩管理系统
這次的簡易版成績管理系統,主要有六大功能:增加學生信息、刪除學生信息、修改學生信息、查找學生信息、顯示學生信息、按 ID 排序。
實現效果如下:
實現效果
保存與讀取信息
首先判斷當前路徑下,是否存在database.txt這個文件。如果不存在的話,就新建一個。如果存在的話,就按行讀取數據。其中,eval函數將讀取的字符床解析為字典。然后,將學生信息存儲在單鏈表中。
try: with open('database.txt', 'r') as f: for data in f.readlines(): SCS.append(eval(data))except: with open('database.txt', 'w') as f: pass接著,如果用戶選擇退出程序的話,就遍歷學生信息,并且以字符串的形式按行存儲學生信息。
elif item == 0:with open('database.txt', 'w') as f: self.point = self.head while self.point.next: self.point = self.point.next f.writelines('{}'.format(self.point.data))exit()增加學生信息
由于本次實現的成績管理系統比較簡易,我們只對學生 id 和 成績進行限制。
其一,我們要確保學生 id 不能重復。當我們希望向鏈表中添加數據時,首先要迭代整個鏈表,判斷要添加元素的 id 是否已經在鏈表中存在。
def unique_id(self, std_id): self.point = self.head while self.point.next: self.point = self.point.next if self.point.data['id'] == std_id: return False return True其二,我們要確保學生成績在 0 ~ 100 分之間。當用戶完成輸入時,需要判斷是否要保存數據,如果否,那么就不進行插入數據操作。為了降低用戶誤輸入造成的影響,我們設定四種用戶可能輸入的字符:[‘y’, ‘yes’, ‘Y’, ‘Yes’]。
最后,我們以字典的形式插入學生信息。
# 增加信息def add_info(self): # id 不能重復 # 成績不能超出范圍 name = input('姓名:') std_id = input('學生id:') while not self.unique_id(std_id=std_id): print('id重復') std_id = input('學生id:') grade = input('學生成績:') if eval(grade) < 0 or eval(grade) > 100: print('超出范圍') grade = input('學生成績:') print(name, std_id, grade) print('請確認無誤后保存') choice = input('y/n') items = ['y', 'yes', 'Y', 'Yes'] if choice in items: data = {'id': std_id, 'name': name, 'grade': grade} self.append(data)刪除學生信息
刪除學生信息的方法,與上一節我們提到的單鏈表的刪除操作相類似。最大的不同之處,我們不再比較整個的 data 域。而是取出 data 關鍵字 id 所對應的值,將其與用戶輸入的 id 相比較。
def del_info(self, find): print('請確認無誤后保存') choice = input('y/n') items = ['y', 'yes', 'Y', 'Yes'] if choice in items: if not self.head.next: print('鏈表為空') return None self.point = self.head while self.point.next.data['id'] != find: self.point = self.point.next pointer = self.point.next self.point.next = self.point.next.next del pointer修改學生數據
由于姓名之類的信息有可能會重復,而我們已經確保學生 id 的唯一性。所以進行修改操作時,我們以學生 id 為搜索項。如果找到了該學生 id,我們就直接更改其對應的姓名與成績等信息。
def modify_info(self): find = input('輸入需要修改的學生的id:') if not self.head.next: print('鏈表為空') return None self.point = self.head while str(self.point.next.data['id']) != find: self.point = self.point.next if self.point.next is None: print('沒有找到該元素') return None name = input('姓名:') grade = input('學生成績:') self.point.next.data['name'] = name self.point.next.data['grade'] = grade查找學生信息
查找學生信息,與修改學生信息的區別在于:找到對應的學生 id 之后,就直接打印 id 所對應的學生信息。
def search_info(self): find = input('輸入需要查找的學生的id:') if not self.head.next: print('鏈表為空') return None self.point = self.head while str(self.point.next.data['id']) != find: self.point = self.point.next if self.point.next is None: print('沒有找到該元素') return None data = self.point.next.data print('ID 姓名 成績') print('{} {} {}'.format(data['id'], data['name'], data['grade']))顯示學生信息
該方法就是一邊迭代鏈表,一邊打印節點對應的學生信息,和上節的單鏈表的打印操作差不多。
# 顯示信息def display_info(self): self.point = self.head print('ID 姓名 成績') while self.point.next: self.point = self.point.next data = self.point.data print('{} {} {}'.format(data['id'], data['name'], data['grade'])) print('')排序
最后,我們要實現排序操作。
首先,要實現鏈表版的冒泡排序。冒泡排序(順序形式),從左向右,兩兩比較,如果左邊元素大于右邊,就交換兩個元素的位置。其中,每一輪排序,序列中最大的元素浮動到最右面。也就是說,每一輪排序,至少確保有一個元素在正確的位置。這樣接下來的循環,就不需要考慮已經排好序的元素了,每次內層循環次數都會減一。其中,如果有一輪循環之后,次序并沒有交換,這時我們就可以停止循環,得到我們想要的有序鏈表了。
def sort(self, item): length = self.get_size() i, j = 0, 0 flag = 1 while i < length: self.point = self.head.next while j < length - i - 1: if int(self.point.data[item]) > int(self.point.next.data[item]): # self.point.data, self.point.next.data = # self.point.next.data, self.point.data temp = self.point.data self.point.data = self.point.next.data self.point.next.data = temp self.point = self.point.next j += 1 flag = 0 if flag: break i += 1 j = 0對于學生信息,我們可以通過成績與學號這兩個關鍵字進行排序。用戶除了可以選擇按成績還是按學號排序,還可以選擇順序還是逆序排序。如果用戶選擇逆序的話,只要通過 reverse 方法,我們就可以創建一個新的 SCS 對象,其中新對象的數據順序與原對象的數據順序完全相反。該方法,也是基于單鏈表 reverse 操作的改進。最后排好序,我們只需完整顯示數據即可。
def rank_info(self): choice = input('1.成績排序 2.學號排序:') order = input('1.升序 2.降序:') if choice == '1': item = 'grade' elif choice == '2': item = 'id' else: return None self.sort(item=item) if order == '2': temp = self.reverse() temp.display_info() return None self.display_info()def reverse(self): local_list = StudentControlSystem() self.point = self.head count = 0 while self.point.next: count += 1 self.point = self.point.next data = self.point.data local_list.insert_after_head(data) return local_list以上,我們已經介紹了學生成績管理系統的主要操作。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的运动会成绩管理系统python_Python 实现简易版成绩管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 实现对比conf 文件差
- 下一篇: python中列表实现自加减元素_pyt