python简易版成绩管理系统_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('{}\n'.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高效編程 回復學生即可。·
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python简易版成绩管理系统_Python 实现简易版成绩管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的核心数据类型_Python
- 下一篇: 内网集群 无法通信_记一次集群内无可用h