分享

Python 实现简易版成绩管理系统!听说很多同学的期末作业?

 静幻堂 2019-12-22
有趣的程序媛 2019-12-19 14:02:06

今天给大家分享一个单链表的简单应用:在命令行,实现简易版成绩管理系统

这次的简易版成绩管理系统,主要有六大功能:

  1. 增加学生信息
  2. 删除学生信息
  3. 修改学生信息
  4. 查找学生信息
  5. 显示学生信息
  6. 按 ID 排序

实现效果如下:

Python 实现简易版成绩管理系统!听说很多同学的期末作业?

保存与读取信息

首先判断当前路径下,是否存在database.txt这个文件。如果不存在的话,就新建一个。如果存在的话,就按行读取数据。其中,eval函数将读取的字符床解析为字典。然后,将学生信息存储在单链表中。

try: withopen('database.txt','r')asf:  fordata inf.readlines():     SCS.append(eval(data))except: withopen('database.txt','w')asf:   pass

接着,如果用户选择退出程序的话,就遍历学生信息,并且以字符串的形式按行存储学生信息。

elif item ==0: with open('database.txt','w')asf:  self.point =self.head  whileself.point.next:    self.point =self.point.next     f.writelines('{}\n'.format(self.point.data))exit()

增加学生信息

由于本次实现的成绩管理系统比较简易,我们只对学生 id 和 成绩进行限制。

其一,我们要确保学生 id 不能重复。当我们希望向链表中添加数据时,首先要迭代整个链表,判断要添加元素的 id 是否已经在链表中存在。

defunique_id(self, std_id):self.point =self.headwhileself.point.next:  self.point =self.point.next  ifself.point.data['id'] ==std_id:    returnFalsereturnTrue

其二,我们要确保学生成绩在 0 ~ 100 分之间。当用户完成输入时,需要判断是否要保存数据,如果否,那么就不进行插入数据操作。为了降低用户误输入造成的影响,我们设定四种用户可能输入的字符:[‘y’, ‘yes’, ‘Y’, ‘Yes’]。

最后,我们以字典的形式插入学生信息。

# 增加信息def add_info(self): # id 不能重复 # 成绩不能超出范围 name =input('姓名:') std_id =input('学生id:')whilenot self.unique_id(std_id=std_id):  print('id重复')   std_id =input('学生id:') grade =input('学生成绩:')ifeval(grade) <0oreval(grade) >100:  print('超出范围')   grade =input('学生成绩:')print(name, std_id, grade)print('请确认无误后保存') choice =input('y/n')items= ['y','yes','Y','Yes']ifchoice in items:   data = {'id': std_id,'name': name,'grade': grade}   self.append(data)

删除学生信息

删除学生信息的方法,与上一节我们提到的单链表的删除操作相类似。最大的不同之处,我们不再比较整个的 data 域。而是取出 data 关键字 id 所对应的值,将其与用户输入的 id 相比较。

defdel_info(self, find): print('请确认无误后保存') choice = input('y/n') items = ['y','yes','Y','Yes']ifchoiceinitems:  ifnotself.head.next:     print('链表为空')    returnNone  self.point =self.head  whileself.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,我们就直接更改其对应的姓名与成绩等信息。

defmodify_info(self): find = input('输入需要修改的学生的id:')ifnotself.head.next:   print('链表为空')  returnNoneself.point =self.headwhilestr(self.point.next.data['id']) !=find:  self.point =self.point.next  ifself.point.nextisNone:     print('没有找到该元素')    returnNone name = input('姓名:') grade = input('学生成绩:')self.point.next.data['name'] = nameself.point.next.data['grade'] = grade

查找学生信息

查找学生信息,与修改学生信息的区别在于:找到对应的学生 id 之后,就直接打印 id 所对应的学生信息。

defsearch_info(self): find = input('输入需要查找的学生的id:')ifnotself.head.next:   print('链表为空')  returnNoneself.point =self.headwhilestr(self.point.next.data['id']) !=find:  self.point =self.point.next  ifself.point.nextisNone:     print('没有找到该元素')    returnNone data =self.point.next.data print('ID 姓名 成绩') print('{} {} {}'.format(data['id'], data['name'], data['grade']))

显示学生信息

该方法就是一边迭代链表,一边打印节点对应的学生信息,和上节的单链表的打印操作差不多。

# 显示信息defdisplay_info(self):self.point =self.head print('ID 姓名 成绩')whileself.point.next:  self.point =self.point.next   data =self.point.data   print('{} {} {}'.format(data['id'], data['name'], data['grade'])) print('')

排序

最后,我们要实现排序操作。

首先,要实现链表版的冒泡排序。冒泡排序(顺序形式),从左向右,两两比较,如果左边元素大于右边,就交换两个元素的位置。其中,每一轮排序,序列中最大的元素浮动到最右面。也就是说,每一轮排序,至少确保有一个元素在正确的位置。这样接下来的循环,就不需要考虑已经排好序的元素了,每次内层循环次数都会减一。其中,如果有一轮循环之后,次序并没有交换,这时我们就可以停止循环,得到我们想要的有序链表了。

defsort(self, item): length =self.get_size() i, j =0,0 flag =1whilei <length:  self.point =self.head.next  whilej < length - i -1:    ifint(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  ifflag:    break   i +=1   j =0

对于学生信息,我们可以通过成绩与学号这两个关键字进行排序。用户除了可以选择按成绩还是按学号排序,还可以选择顺序还是逆序排序。如果用户选择逆序的话,只要通过 reverse 方法,我们就可以创建一个新的 SCS 对象,其中新对象的数据顺序与原对象的数据顺序完全相反。该方法,也是基于单链表 reverse 操作的改进。最后排好序,我们只需完整显示数据即可。

defrank_info(self): choice = input('1.成绩排序 2.学号排序:') order = input('1.升序 2.降序:')ifchoice =='1':   item ='grade' elif choice =='2':   item ='id'else:  returnNoneself.sort(item=item)iforder =='2':   temp =self.reverse()   temp.display_info()  returnNoneself.display_info()defreverse(self): local_list = StudentControlSystem()self.point =self.head count =0whileself.point.next:   count +=1  self.point =self.point.next   data =self.point.data   local_list.insert_after_head(data)returnlocal_list

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多