热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python字典成绩大于或等于130的同学_Python实现简易版成绩管理系统!听说很多同学的期末作业?...

今天给大家分享一个单链表的简单应用:在命令行,实现简易版成绩管理系统。这次的简易版成绩管理系统,主要有六大功能:增加学生信息

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

这次的简易版成绩管理系统,主要有六大功能:增加学生信息

删除学生信息

修改学生信息

查找学生信息

显示学生信息

按 ID 排序

实现效果如下:

保存与读取信息

首先判断当前路径下,是否存在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’]。

最后&#xff0c;我们以字典的形式插入学生信息。# 增加信息def add_info(self): # id 不能重复 # 成绩不能超出范围 name &#61;input(&#39;姓名&#xff1a;&#39;) std_id &#61;input(&#39;学生id&#xff1a;&#39;)whilenot self.unique_id(std_id&#61;std_id): print(&#39;id重复&#39;) std_id &#61;input(&#39;学生id&#xff1a;&#39;) grade &#61;input(&#39;学生成绩&#xff1a;&#39;)ifeval(grade) <0oreval(grade) >100: print(&#39;超出范围&#39;) grade &#61;input(&#39;学生成绩&#xff1a;&#39;)print(name, std_id, grade)print(&#39;请确认无误后保存&#39;) choice &#61;input(&#39;y/n&#39;)items&#61; [&#39;y&#39;,&#39;yes&#39;,&#39;Y&#39;,&#39;Yes&#39;]ifchoice in items: data &#61; {&#39;id&#39;: std_id,&#39;name&#39;: name,&#39;grade&#39;: grade} self.append(data)

删除学生信息

删除学生信息的方法&#xff0c;与上一节我们提到的单链表的删除操作相类似。最大的不同之处&#xff0c;我们不再比较整个的 data 域。而是取出 data 关键字 id 所对应的值&#xff0c;将其与用户输入的 id 相比较。defdel_info(self, find): print(&#39;请确认无误后保存&#39;) choice &#61; input(&#39;y/n&#39;) items &#61; [&#39;y&#39;,&#39;yes&#39;,&#39;Y&#39;,&#39;Yes&#39;]ifchoiceinitems: ifnotself.head.next: print(&#39;链表为空&#39;) returnNone self.point &#61;self.head whileself.point.next.data[&#39;id&#39;] !&#61;find: self.point &#61;self.point.next pointer &#61;self.point.next self.point.next&#61;self.point.next.next del pointer

修改学生数据

由于姓名之类的信息有可能会重复&#xff0c;而我们已经确保学生 id 的唯一性。所以进行修改操作时&#xff0c;我们以学生 id 为搜索项。如果找到了该学生 id&#xff0c;我们就直接更改其对应的姓名与成绩等信息。defmodify_info(self): find &#61; input(&#39;输入需要修改的学生的id&#xff1a;&#39;)ifnotself.head.next: print(&#39;链表为空&#39;) returnNoneself.point &#61;self.headwhilestr(self.point.next.data[&#39;id&#39;]) !&#61;find: self.point &#61;self.point.next ifself.point.nextisNone: print(&#39;没有找到该元素&#39;) returnNone name &#61; input(&#39;姓名&#xff1a;&#39;) grade &#61; input(&#39;学生成绩&#xff1a;&#39;)self.point.next.data[&#39;name&#39;] &#61; nameself.point.next.data[&#39;grade&#39;] &#61; grade

查找学生信息

查找学生信息&#xff0c;与修改学生信息的区别在于&#xff1a;找到对应的学生 id 之后&#xff0c;就直接打印 id 所对应的学生信息。defsearch_info(self): find &#61; input(&#39;输入需要查找的学生的id&#xff1a;&#39;)ifnotself.head.next: print(&#39;链表为空&#39;) returnNoneself.point &#61;self.headwhilestr(self.point.next.data[&#39;id&#39;]) !&#61;find: self.point &#61;self.point.next ifself.point.nextisNone: print(&#39;没有找到该元素&#39;) returnNone data &#61;self.point.next.data print(&#39;ID 姓名 成绩&#39;) print(&#39;{} {} {}&#39;.format(data[&#39;id&#39;], data[&#39;name&#39;], data[&#39;grade&#39;]))

显示学生信息

该方法就是一边迭代链表&#xff0c;一边打印节点对应的学生信息&#xff0c;和上节的单链表的打印操作差不多。# 显示信息defdisplay_info(self):self.point &#61;self.head print(&#39;ID 姓名 成绩&#39;)whileself.point.next: self.point &#61;self.point.next data &#61;self.point.data print(&#39;{} {} {}&#39;.format(data[&#39;id&#39;], data[&#39;name&#39;], data[&#39;grade&#39;])) print(&#39;&#39;)

排序

最后&#xff0c;我们要实现排序操作。

首先&#xff0c;要实现链表版的冒泡排序。冒泡排序(顺序形式)&#xff0c;从左向右&#xff0c;两两比较&#xff0c;如果左边元素大于右边&#xff0c;就交换两个元素的位置。其中&#xff0c;每一轮排序&#xff0c;序列中最大的元素浮动到最右面。也就是说&#xff0c;每一轮排序&#xff0c;至少确保有一个元素在正确的位置。这样接下来的循环&#xff0c;就不需要考虑已经排好序的元素了&#xff0c;每次内层循环次数都会减一。其中&#xff0c;如果有一轮循环之后&#xff0c;次序并没有交换&#xff0c;这时我们就可以停止循环&#xff0c;得到我们想要的有序链表了。defsort(self, item): length &#61;self.get_size() i, j &#61;0,0 flag &#61;1whilei int(self.point.next.data[item]): # self.point.data, self.point.next.data &#61; # self.point.next.data, self.point.data temp &#61;self.point.data self.point.data &#61;self.point.next.data self.point.next.data &#61; temp self.point &#61;self.point.next j &#43;&#61;1 flag &#61;0 ifflag: break i &#43;&#61;1 j &#61;0

对于学生信息&#xff0c;我们可以通过成绩与学号这两个关键字进行排序。用户除了可以选择按成绩还是按学号排序&#xff0c;还可以选择顺序还是逆序排序。如果用户选择逆序的话&#xff0c;只要通过 reverse 方法&#xff0c;我们就可以创建一个新的 SCS 对象&#xff0c;其中新对象的数据顺序与原对象的数据顺序完全相反。该方法&#xff0c;也是基于单链表 reverse 操作的改进。最后排好序&#xff0c;我们只需完整显示数据即可。defrank_info(self): choice &#61; input(&#39;1.成绩排序 2.学号排序&#xff1a;&#39;) order &#61; input(&#39;1.升序 2.降序&#xff1a;&#39;)ifchoice &#61;&#61;&#39;1&#39;: item &#61;&#39;grade&#39; elif choice &#61;&#61;&#39;2&#39;: item &#61;&#39;id&#39;else: returnNoneself.sort(item&#61;item)iforder &#61;&#61;&#39;2&#39;: temp &#61;self.reverse() temp.display_info() returnNoneself.display_info()defreverse(self): local_list &#61; StudentControlSystem()self.point &#61;self.head count &#61;0whileself.point.next: count &#43;&#61;1 self.point &#61;self.point.next data &#61;self.point.data local_list.insert_after_head(data)returnlocal_list



推荐阅读
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了蓝桥训练中的闰年判断问题,并提供了使用Python代码进行判断的方法。根据给定的年份,判断是否为闰年的条件是:年份是4的倍数且不是100的倍数,或者是400的倍数。根据输入的年份,输出结果为yes或no。本文提供了相应的Python代码实现。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
手机用户2502910491
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有