实现功能:
学生成绩信息包括:学号,姓名,语文成绩、数学成绩、英语成绩。
主要功能:
1、 学生信息录入;
2、 学生信息浏览;
3、 信息查询(a 按学号查 b 按最高分查(查询每门课的最高分的同学信息))
4、 信息排序(a 按总分排序(从高到低)b 按姓名排序 )
5、 信息删除(给定学号,删除该学生信息)
6、 信息修改(给定学号,修改该学生信息)
7、 保存信息(把当前的结构体数组内容保存
8、 读取信息(从文件student.txt中把结构体数组的内容读到结构体数组中)
0、 退出
一、首先定义每个学生结点
class Node:
def __init__(self,num,name,score_1,score_2,score_3):
self.num=num
self.name=name
self.score=[score_1,score_2,score_3]
if self.num is not None:
self.score.append(score_1+score_2+score_3)
self.next=None
其中包含了学生的学号,姓名,各科的分数以及总分存储在score的列表中,这种存储方式是为了后期的排序更加方便。
二、定义链表实现基本的增删改查
1、首先初始化整个链表
class linklist:
def __init__(self):
self.head=Node(None,None,None,None,None)
def isempty(self):
if self.head.next==None:
return True
else:
return False
2、实现学生的添加即链表的插入功能
def insert(self,num,name,score_1,score_2,score_3):
new_node=Node(num,name,score_1,score_2,score_3)
if self.isempty():
self.head.next=new_node
else:
new_node.next=self.head.next
self.head.next=new_node
3、实现删除功能(该方法不在链表类中下面会给出完整代码)
def delete(self):
try:
p,q=self.l.head,self.l.head.next
while q:
if q.num==int(self.treeWidget.currentItem().text(0)):
p.next=q.next
del q
break
else:
p,q=p.next,q.next
if self.querenpaixu():
messagebox.showinfo('','删除成功')
except AttributeError:
messagebox.showerror('','请选择要删除的信息')
4、实现按照不同的标准排序(冒泡排序)
根据输入的i不同会按照不同的标准排序,在i-2是非负整数的时候,i会根据当前值大小索引到分数列表中排序例如i=0就按照语文成绩排序。
def sort_score(self,i):
i=i-2
p=self.head.next
while p:
q=p.next
while q:
if i>=0:
if q.score[i]>p.score[i]:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
elif i==-1:
if q.name[0]<p.name[0]:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
elif i==-2:
if q.num<p.num:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
q=q.next
p=p.next
以下是学生管理系统所有的基本方法
import csv
class Node:
def __init__(self,num,name,score_1,score_2,score_3):
self.num=num
self.name=name
self.score=[score_1,score_2,score_3]
if self.num is not None:
self.score.append(score_1+score_2+score_3)
self.next=None
class linklist:
def __init__(self):
self.head=Node(None,None,None,None,None)
def isempty(self):
if self.head.next==None:
return True
else:
return False
#录入新的学生
def insert(self,num,name,score_1,score_2,score_3):
new_node=Node(num,name,score_1,score_2,score_3)
if self.isempty():
self.head.next=new_node
else:
new_node.next=self.head.next
self.head.next=new_node
#排序
def sort_score(self,i):
i=i-2
p=self.head.next
while p:
q=p.next
while q:
if i>=0:
if q.score[i]>p.score[i]:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
elif i==-1:
if q.name[0]<p.name[0]:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
elif i==-2:
if q.num<p.num:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
q=q.next
p=p.next
#读取学生信息
def read_csv(self,filename):
with open(filename,'r')as f:
t=csv.reader(f)
for i in t:
self.insert(int(i[0]),i[1],int(i[-4]),int(i[-3]),int(i[-2]))
#输出当前学生信息
def print_all(self):
p=self.head.next
while p:
print(p.num,p.name,p.score)
p=p.next
到这里就是学生系统(链表)的基本功能了
以下是美化界面后的完整代码
import csv
from tkinter import messagebox
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QTreeWidgetItem,QTreeWidget,QApplication,QWidget,QPushButton,QFileDialog,QLineEdit
class Node:
def __init__(self,num,name,score_1,score_2,score_3):
self.num=num
self.name=name
self.score=[score_1,score_2,score_3]
if self.num is not None:
self.score.append(score_1+score_2+score_3)
self.next=None
class linklist:
def __init__(self):
self.head=Node(None,None,None,None,None)
def isempty(self):
if self.head.next==None:
return True
else:
return False
def insert(self,num,name,score_1,score_2,score_3):
new_node=Node(num,name,score_1,score_2,score_3)
if self.isempty():
self.head.next=new_node
else:
new_node.next=self.head.next
self.head.next=new_node
def sort_score(self,i):
i=i-2
p=self.head.next
while p:
q=p.next
while q:
if i>=0:
if q.score[i]>p.score[i]:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
elif i==-1:
if q.name[0]<p.name[0]:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
elif i==-2:
if q.num<p.num:
q.num,q.name,q.score,p.num,p.name,p.score=p.num,p.name,p.score,q.num,q.name,q.score
q=q.next
p=p.next
def read_csv(self,filename):
with open(filename,'r')as f:
t=csv.reader(f)
for i in t:
self.insert(int(i[0]),i[1],int(i[-4]),int(i[-3]),int(i[-2]))
def print_all(self):
p=self.head.next
while p:
print(p.num,p.name,p.score)
p=p.next
class mywindow(QWidget):
def __init__(self):
super().__init__()
loadUi('student.ui',self)
self.treeWidget.setHeaderLabels(['学号','姓名','语文成绩','数学成绩','英语成绩','总成绩'])
self.l=linklist()
def add_new(self):
name=self.lineEdit_2.text()
num=self.lineEdit_3.text()
chinese=self.lineEdit_4.text()
math=self.lineEdit_5.text()
english=self.lineEdit_6.text()
self.l.insert(int(num),name,int(chinese),int(math),int(english))
messagebox.showinfo('','添加成功')
def clear_all(self):
self.lineEdit_2.clear()
self.lineEdit_3.clear()
self.lineEdit_4.clear()
self.lineEdit_5.clear()
self.lineEdit_6.clear()
def duquwenjian(self):
path,a=QFileDialog.getOpenFileName(self,'读取文件','','(*.csv)')
self.lineEdit.setText(path)
def querenduqu(self):
filename=self.lineEdit.text()
if filename=='':
messagebox.showinfo('','请上传文件')
return
try:
self.l.read_csv(filename)
messagebox.showinfo('','读取成功')
except FileNotFoundError:
messagebox.showerror('','未找到文件')
def tuichu(self):
self.close()
messagebox.showinfo('','成功退出')
def querenpaixu(self):
if self.l.isempty():
messagebox.showerror('','没有数据请输入或读取文件')
return False
i=int(self.comboBox.currentIndex())
self.l.sort_score(i)
self.treeWidget.clear()
p=self.l.head.next
while p:
self.treeWidget.addTopLevelItem(addItem(str(p.num), p.name, str(p.score[0]), str(p.score[1]), str(p.score[2]), str(p.score[3])))
p=p.next
return True
def delete(self):
try:
p,q=self.l.head,self.l.head.next
while q:
if q.num==int(self.treeWidget.currentItem().text(0)):
p.next=q.next
del q
break
else:
p,q=p.next,q.next
if self.querenpaixu():
messagebox.showinfo('','删除成功')
except AttributeError:
messagebox.showerror('','请选择要删除的信息')
def addItem(student_id, name, chinese, math, english, total):
# 创建一个新的QTreeWidgetItem
item = QTreeWidgetItem()
item.setText(0, student_id) # 设置学号
item.setText(1, name) # 设置姓名
item.setText(2, chinese) # 设置语文成绩
item.setText(3, math) # 设置数学成绩
item.setText(4, english) # 设置英语成绩
item.setText(5, total) # 设置总成绩
return item
def main():
import sys
app=QApplication(sys.argv)
a=mywindow()
a.show()
app.exec_()
if __name__=="__main__":
main()
测试截图