python实现简单的学生管理系统

本文实例为大家分享了python实现简单学生管理系统的具体代码,供大家参考,具体内容如下

学生管理系统

相信大家学各种语言的时候,练习总是会写各种管理系统吧,管理系统主要有对数据的增删查改操作,原理不难,适合作为练手的小程序

数据的结构

要保存数据就需要数据结构,比如c里面的结构体啊,python里面的列表,字典,还有类都是常用的数据类型
在这里,我使用了链表来作为学生数据的数据结构,
即 Node类 和 Student_LinkList类,来实现链表

数据的持久化

我们在程序中产生的数据是保存在内存中的,程序一旦退出,下次就不能恢复此次的数据了,因此需要把内存种的数据,保存到文件或数据库中,存储起来,这个过程就叫数据的持久化

本程序使用了python标准库pickle提供的序列化方法dump()和load()来实现数据的持久化

配置文件

使用配置文件,可以方便程序中使用不同的子类实现,

本程序使用configparser来对配置文件解析
本程序配置文件名为 Student.ini

#Student.ini文件
[Student]
student = Student_LinkList

[Persistence]
persistence = Persistence_Pickle
file = student.pik

类之间的关系

Student #和学生数据有关的抽象类
±- Student_LinkList
Persistence #和持久化有关的抽象类
±- Persistence_Pickle
MyConfigure #和配置文件读取有关的类
UI #和交互有关的父类
±- Cmd_UI

界面预览

源码

'''
使用单链表实现的学生管理系统
'''
import pickle
import abc
import configparser

class Student(abc.ABC):
  '''
  抽象学生类
  '''
  @abc.abstractmethod
  def add(self):
    '''
    增加学生结点
    '''
    pass

  @abc.abstractmethod
  def ladd(self):
    '''
    从左侧增加学生结点
    '''
    pass

  @abc.abstractmethod
  def delete(self,id_):
    '''
    根据id值来删除一个结点
    '''
    pass

  @abc.abstractmethod
  def delete_name(self,name):
    '''
    根据姓名来删除一个结点
    '''
    pass

  @abc.abstractmethod
  def insert(self,idx,val):
    '''
    插入到指定的位置
    '''
    pass

  @abc.abstractmethod
  def show(self):
    '''
    显示所有的学生结点
    '''
    pass

  @abc.abstractmethod
  def search_id(self):
    '''
    根据id查询节点
    '''
    pass

  @abc.abstractmethod
  def search_name(self):
    '''
    根据name查询节点
    '''

  @abc.abstractmethod
  def modity_id(self):
    '''
    根据id找到节点,然后修改
    '''
    pass

class Node(object):
  '''
  学生链表结点
  '''
  def __init__(self,id_: int,name: str,sex: str,age: int,score: int):
    self.id = id_
    self.name = name
    self.sex = sex
    self.age = age
    self.score = score

    self.next = None

  def modity(self,id_,name,sex,age,score):
    '''
    修改
    '''
    self.id = id_
    self.name = name
    self.sex = sex
    self.age = age
    self.score = score

  def __str__(self):
    '''
    用于显示输出
    '''
    return f"[学生:{self.id:^2}]-->name:{self.name:^10}sex:{self.sex:^10}age:{self.age:^10}score:{self.score:^10}"

class Student_LinkList(Student):
  '''
  学生链表
  '''
  def __init__(self):
    self.head = Node(-1,'head','-1',-1,-1)
    self.length = 0
    self.tail = self.head #尾部结点用于尾插

  def add(self,id_,name,sex,age,score):
    '''
    添加一个学生结点,尾插
    '''
    #print('当前tail的值',self.tail)
    temp = Node(id_,name,sex,age,score)
    self.tail.next = temp
    self.tail = self.tail.next

    self.length += 1
    print('[info]:添加成功')

  def ladd(self,id_,name,sex,age,score):
    '''
    添加一个学生,头插
    '''
    temp = Node(id_,name,sex,age,score)
    temp.next = self.head.next
    self.head.next = temp

    if self.tail == self.head:
      self.tail = temp

    self.length += 1
    print('[info]:添加成功')

  def delete(self,id_):
    '''
    根据id值来删除一个结点,用迭代实现
    '''
    p = self.head
    while p.next != None and p.next.id != id_:
      p = p.next

    if p.next == None:
      print('[error]:找不到id')
      return -1
    else:
      temp = p.next
      p.next = temp.next
      #如果删除的是尾结点,还要移动tail
      if temp.next == None:
        self.tail = p
      del temp
    print('[info]:删除成功')

  def delete_name(self,name):
    '''
    根据姓名来删除一个结点,用递归实现
    '''
    def _func(node: Node,name: str):
      '''
      递归函数
      '''
      #到了尾巴节点了,还没有找到
      if node.next == None:
        print('[info]:找不到name')
        return False
      elif node.next.name == name:
        temp = node.next
        node.next = temp.next
        #如果删除的是尾结点,还要移动tail
        if temp.next == None:
          self.tail = node
        del temp
        print('[info]:删除成功')
        return True
      else:
        return _func(node.next,name)

    t = self.head
    return _func(t,name)

  def insert(self,idx,id_,name,sex,age,score):
    '''
    在指定位置插入数据
    '''
    if idx > self.length or idx == 0:
      print(f'[error]:你输入的索引非法(1-{self.length})')
      return 0
    p,cur = self.head,0
    while p != None and cur < idx-1:
      p = p.next

    if cur < idx-1:
      return -1
    else:
      temp = Node(id_,name,sex,age,score)
      temp.next = p.next
      p.next = temp
      return True
    print('[info]:插入成功')

  def search_id(self,id_):
    '''
    根据id查询节点
    '''
    p = self.head
    while p != None and p.id != id_:
      p = p.next
    if p == None:
      return -1
    else:
      return p

  def search_name(self,name):
    '''
    根据name查询节点
    '''
    p = self.head

    def _func(node: Node,name: str):
      '''
      递归函数
      '''
      if node == None:
        return -1
      elif node.name == name:
        return node
      return _func(node.next,name)

    return _func(p,name)

  def modity_id(self,id0,id_,name,sex,age,score):
    '''
    根据id找到节点,然后修改
    '''
    node = self.search_id(id0)
    if node == -1:
      print('[error]:找不到该id')
      return -1
    else:
      node.modity(id_,name,sex,age,score)

  def show(self):
    '''
    显示所有的学生结点,迭代
    '''
    print(f'\n{"-"*25}以下是系统内数据{"-"*25}')
    temp = []
    p = self.head
    while p != None:
      temp.append(p)
      p = p.next
    return temp

class Student_Array():
  '''
  用数组实现学生数据存储
  '''
  pass

class Student_Queue():
  '''
  用队列实现
  '''
  pass

class Student_Dict():
  '''
  用队列实现
  '''
  pass

class Persistence(abc.ABC):
  '''
  链表数据的持久化
  '''
  @abc.abstractmethod
  def save(self):
    '''
    把对象保存
    '''
    pass

  @abc.abstractmethod
  def load(self):
    '''
    加载对象
    '''
    pass

class Persistence_Pickle(Persistence):
  '''
  使用pickle来序列化
  '''
  def __init__(self,cls: Student,file_):
    self.filename = file_
    self.obj = None
    self.cls = cls

  def save(self):
    with open(self.filename,'wb') as f:
      pickle.dump(self.obj,f)

  def load(self):
    try:
      with open(self.filename,'rb') as f:
        temp = pickle.load(f)
    except:
      temp = globals()[self.cls]()
    print('返回temp:',type(temp))
    self.obj = temp
    return temp

class Persistence_File(Persistence):
  '''
  使用文件来持久化
  '''
  pass

class Persistence_Mysql(Persistence):
  '''
  使用Mysql数据库来持久化
  '''
  pass

class Persistence_Socket(Persistence):
  '''
  使用远程套接字持久化
  '''
  pass

class MyConfigure(object):
  '''
  用来读取配置文件的类
  '''
  def __init__(self):
    self.config = configparser.ConfigParser()

  def save(self):
    '''
    保存配置文件
    '''
    with open('Student.ini','w') as f:
      self.config.write(f)

  def load(self):
    '''
    加载配置文件
    '''
    self.config.read('Student.ini')

  def get_student_class(self):
    '''
    获得Student该使用哪个子类
    '''
    return self.config['Student']['student']

  def get_persistence_class(self):
    '''
    获得持久化,该使用那个类,
    如果是Pickle或文件,还有file作为保存的文件名
    '''
    temp = {}
    temp['persistence'] = self.config['Persistence']['persistence']
    if 'Persistence_Pickle' in temp['persistence']:
      temp['file'] = self.config['Persistence']['file']
    return temp

class UI(object):
  '''
  界面交互
  '''
  def __init__(self):
    self.config = MyConfigure()
    self.config.load()
    s_class = self.config.get_student_class()
    p_class = self.config.get_persistence_class()

    self.persistence = globals()[p_class['persistence']](s_class,p_class['file'])
    self.student = self.persistence.load()
    print('实例化成功:',self.student,self.persistence)

  def save(self):
    '''
    把数据保存
    '''
    self.persistence.save()

  def quit(self):
    '''
    退出:先保存配置,然后退出
    '''
    self.config.save()
    self.save()

  def _show(self):
    '''
    显示所有学生节点
    '''
    return self.student.show()

  def _add(self,direction,*temp):
    '''
    增加学生结点,
    direction 1左添加,2右添加
    '''
    if direction == 1:
      self.student.ladd(*temp)
    elif direction == 2:
      self.student.add(*temp)

  def _delete(self,attribute: int,val: str):
    '''
    删除学生节点
    attribute: 需要根据哪个属性删除,1.id 或 2.name
    '''
    if attribute == 1:
      self.student.delete(val)
    elif attribute == 2:
      self.student.delete_name(val)

  def _insert(self,idx,*temp):
    '''
    把学生节点插入到指定的位置
    '''
    self.student.insert(idx,*temp)

  def _search(self,attribute,val):
    '''
    查询
    '''
    if attribute == 1:
      return self.student.search_id(val)
    elif attribute == 2:
      return self.student.search_name(val)

  def _modity(self,attribute,id_,*temp):
    '''
    修改
    '''
    if attribute == 1:
      self.student.modity_id(id_,*temp)
    elif attribute == 2:
      print('[info]:因为没实现,所以什么也不做')
      pass #根据name修改没有写

class Cmd_UI(UI):
  '''
  命令行的交互界面
  '''
  def __init__(self):
    super(Cmd_UI,self).__init__()

  def get_input_1_2(self,info: str):
    '''
    获得输入,返回1或者2
    info: 描述输入的信息
    '''
    x = None
    while x == None:
      temp = input(info)
      if temp == '1':
        x = 1
      elif temp == '2':
        x = 2
      else:
        print('你只能输入1或者2')
    return x

  def get_input_arg(self):
    '''
    获得用户的输入构造学生节点
    '''
    id_ = input('请输入id')
    name = input('请输入姓名')
    sex = input('请输入性别')
    age = input('请输入年龄')
    score = input('请输入成绩')
    return (id_,name,sex,age,score)

  def delete(self):
    '''
    删除节点
    '''
    info = '你想要根据哪个属性删除节点:1.id 2.name'
    attribute = self.get_input_1_2(info)
    val = input('输入你想要删除的值:')
    self._delete(attribute,val)

  def show(self):
    '''
    显示
    '''
    rel = self._show()
    for i in rel:
      print(i)

  def add(self):
    '''
    增加学生结点
    '''
    info = '你想要插入的位置:1.左边 2.右边'
    direction = self.get_input_1_2(info)
    arg = self.get_input_arg()
    self._add(direction,*arg)

  def insert(self):
    '''
    新学生,插入到指定的位置
    '''
    idx = int(input('输入要插入的位置'))
    temp = self.get_input_arg()
    self._insert(idx,*temp)

  def search(self):
    '''
    查询学生
    '''
    info = '你想要根据哪个属性搜索节点:1.id 2.name'
    attribute = self.get_input_1_2(info)
    val = input('输入你想要查询的值:')

    print(self._search(attribute,val))

  def modity(self):
    '''
    修改学生信息
    '''
    info = '你想要根据哪个属性搜索节点:1.id 2.name'
    attribute = self.get_input_1_2(info)
    val_ = input('输入要查询的值:')
    temp = self.get_input_arg()
    self._modity(attribute,val_,*temp)

  def main(self):
    '''
    主流程
    '''
    info = '''
    *******************
    *kalpa学生管理系统*
    *  0.显示数据  *
    *  1.增加数据  *
    *  2.删除数据  *
    *  3.查询数据  *
    *  4.修改数据  *
    *  5.保存并退出 *
    *******************
    '''
    print(info)
    a = '0'
    while a in ['0','1','2','3','4','5']:
      if a == '0':
        self.show()
      elif a == '1':
        self.add()
      elif a == '2':
        self.delete()
      elif a == '3':
        self.search()
      elif a == '4':
        self.modity()
      elif a == '5':
        self.quit()
        return
      a = input('>>')

if __name__ == "__main__":
  ui = Cmd_UI()
  ui.main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现GUI学生信息管理系统

    本文实例为大家分享了Python实现GUI学生信息管理系统的具体代码,供大家参考,具体内容如下 项目环境:  软件环境: OS:RedHat6.3                   Lib:Pygtk                   Language:Python                   Support tool:Glade3 项目简述: ①Glade3设计用户的登录窗口,功能主窗口 ②通过Gtk.Builder初始化,载入界面 ③在Mysql.py文件中实现Python操作数

  • Python实现学生成绩管理系统

    本文实例为大家分享了Python实现学生成绩管理系统的具体代码,供大家参考,具体内容如下 基本功能: 输入并存储学生的信息:通过输入学生的学号.姓名.和分数,然后就可以把数据保存在建立的student文件里面. 打印学生的所有信息:通过一个打印函数就可以把所有的信息打印在屏幕上. 修改学生信息:这个功能首先通过查询功能查询出该学生是否存在,如果存在就对该学生的信息进行修改,如果不存在则返回到主界面. 删除学生信息:该功能是对相应的学生进行删除操作,如果学生存在就查找到进行删除. 按学生成绩进行排

  • Python学生成绩管理系统简洁版

    讲起学生成绩管理系统,从大一C语言的课程设计开始,到大二的C++课程设计都是这个题,最近在学树莓派,好像树莓派常用Python编程,于是学了一波Python,看了一点基本的语法想写点东西练下手. 开发环境:Ubuntu+Python2.7 代码如下: #coding=utf-8 #保存学生信息 studentList=[] def addInfo(name,addr): tempInfo={} tempInfo['name']=name tempInfo['addr']=addr student

  • python实现学生信息管理系统

    继上篇博客Python实现简易通讯录后,我就想写一个复杂点的学生信息管理系统,这次实现的功能有 1.学生信息的录入管理: 2.学生选课操作: 3.学生选课情况查询: 这次仍然用到sqlite3模块.虽然看着挺简单,但是也踩了不少坑,毕竟刚开始实战,有些细节的还需要多多磨炼啊! 好了,废话不多说,直接上代码,欢迎感兴趣的朋友私信讨论~~~ #-*- coding:utf-8 -*- import sqlite3 #打开本地数据库用于存储用户信息 conn = sqlite3.connect('st

  • python实现简易学生信息管理系统

    本文实例为大家分享了python实现学生信息管理系统的具体代码,供大家参考,具体内容如下 简易学生信息管理系统主要功能有 1 录入学生信息 2 查找学生信息 3 删除学生信息 4 修改学生信息 5 排序 6 统计学生总人数 7 显示所有学生信息 0 退出系统 系统运行效果 主菜单的代码方法: # Author: dry # 开发时间:2019/9/11 # 开发工具:PyCharm import re # 导入正则表达式模块 import os # 导入操作系统模块 filename = "st

  • python学生管理系统代码实现

    本文实例为大家分享了python学生管理系统的具体代码,供大家参考,具体内容如下 类 class Student: stuID = "" name = "" sex = "M" classID = "NULL" #set ID def setStuID(self,stuID): self.stuID = stuID def setName(self,name): self.name = name def setSex(self

  • python学生信息管理系统

    本文实例为大家分享了python学生信息管理系统的具体代码,供大家参考,具体内容如下 #编译环境为python3 #学生信息管理系统包括基本的信息功能,能够实现学生信息的输入,查询,增添和删除 #基本框架:开始操作菜单,接收输入选项,调用相应的函数实现对应的功能,循环回到开始菜单, #操作菜单: student = [] def studentMeau(): print('-'*30) print('-------学生信息管理系统-------') print(' 1.添加学生信息') prin

  • python学生信息管理系统(完整版)

    本文是基于上一篇(python项目:学生信息管理系统(初版) )进行了完善,并添加了新的功能. 主要包括有: 完善部分:输入错误:无数据查询等异常错误 新的功能:文件的操作:文件的读写,其中重点是对文本字符串的详细解析(关于整个解析拆解和重组详见代码,以及添加了注释) 学生信息管理系统(完整版) 学生信息管理项目,要求带操作界面,并完成每项操作: +----------------------+ | 1)添加学生信息 | | 2)显示所有学生的信息 | | 3)删除学生信息 | | 4)修改学生

  • python版学生管理系统

    写一个学生管理系统,最好用python. 我都没学过python呢,只好开始临时抱佛脚,再到网上找找有没有例子看看,下面是我参照另一个博主写的,中间有一些和我不能融合的错误,我已经解决了. input("\n\nPress the enter key to exit.") def functionList(): # 定义功能菜单 print("---------请输入序号选择您要得功能---------") print("") print(&qu

  • python实现学生管理系统

    python写的简单的学生管理系统,练习python语法. 可以运行在windows和linux下,python 2.7. #!/usr/local/bin/python # -*- coding:utf-8 -*- import os import re #定义学生类 class Student: def __init__(self): self.name = '' self.ID = '' self.score = 0 #根据学生分数进行从大到小的冒泡排序 def BuddleSortByS

随机推荐