Python 实现简易版成绩管理系统
上一次,公众号详情了如何使用 Python 实现单链表,下面让我们一探单链表的简单应用:在命令行,实现简易版成绩管理系统。
这次的简易版成绩管理系统,主要有六大功能:添加学生信息、删除学生信息、修改学生信息、查找学生信息、显示学生信息、按 ID 排序。
实现效果如下:
实现效果.JPG
保存与读取信息
首先判断当前路径下,能否存在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
以上,我们已经详情了学生成绩管理系统的主要操作。如需源码,请在微信公众号后端回复学生
就可。·
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Python 实现简易版成绩管理系统