python链表实战制作学生管理系统(附带pyqt5的界面优化)

实现功能:

学生成绩信息包括:学号,姓名,语文成绩、数学成绩、英语成绩。

主要功能:

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()

测试截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值