【python实现学生选课系统】

一、要求: 选课系统
管理员:
创建老师:姓名、性别、年龄、资产
创建课程:课程名称、上课时间、课时费、关联老师
使用pickle保存在文件
学生:
学生:用户名、密码、性别、年龄、选课列表[]、上课记录{课程1:【di,a,】}
1、列举所有课程
2、选择课程
3、学生上课,
4、ret = 课程.work() 获取课程的返回; 资产+=课时费
二、代码思路
1.类的关联:
a、Teacher类:关联管理员,由哪个管理员创建
b、 Course类:关联老师对象、管理员对象(注意:关联的是对象)
2.文件的写入:
a、管理员文件:写入的是管理员对象(封装管理员的用户名和密码)
b、学生文件:写入的是学生对象(封装了学生已选课程列表,已经上过的课程字典:key:课程对象 value:上课信息列表,是列表格式)
c、课程列表course_list、老师列表teacher_lis,都是列表格式。
三、文件概述
bin目录:存放administrator.py文件和students.py文件
config目录:存放settings.py文件,即配置文件
db目录:存放与数据相关的文件,包括课程列表course_list、老师列表teacher_list、学生文件夹、管理员文件夹
lib目录:存放models.py文件,即存放公共的模块
log目录:存放日志文件
四、代码实现
4.1 配置文件settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #配置文件的上级目录BASE_ADMIN_DIR = os.path.join(BASE_DIR, "db", "admin") #管理员目录BASE_STUDENTS_DIR = os.path.join(BASE_DIR, "db", "students") #学生目录TEACHER_DB_DIR = os.path.join(BASE_DIR, "db", "teacher_list") #老师列表目录COURSE_DB_DIR = os.path.join(BASE_DIR, "db", "course_list") #课程列表目录
4.2公共模块modules.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import random
import time
import pickle
from config import settings
import os
class Teacher:"""封装老师的相关信息"""def __init__(self, name, age, admin):self.name = nameself.age = ageself.__assets = 0self.create_time = time.strftime('%Y-%m-%d %H:%M:%S')self.create_admin = admindef gain(self, cost):"""增加资产:param cost: 增加的数量:return:"""self.__assets += costdef decrease(self, cost):"""减少资产:param cost: 减少的数量:return:"""self.__assets -= costclass Course:"""课程相关信息"""def __init__(self, course_name, cost, teacher_obj, admin):self.course_name = course_nameself.cost = costself.teacher = teacher_objself.create_time = time.strftime('%Y-%m-%d %H:%M:%S')self.create_admin = admindef have_lesson(self):"""课程上课,自动给相关联的任课老师增加课时费:return: 课程内容返回给上课者"""self.teacher.gain(self.cost)content = random.randrange(10, 100)r = time.strftime('%Y-%m-%d %H:%M:%S')temp = "课程:%s;老师:%s;内容:%d;时间:%f" % (self.course_name, self.teacher, content, r)return tempdef absence(self):"""教学事故:return:"""self.teacher.decrease(self.cost * 2)class Admin:def __init__(self):self.username = Noneself.password = Nonedef login(self, user, pwd):"""管理员登陆:param user::param pwd::return:"""if self.username == user and self.password == pwd:return Trueelse:return Falsedef register(self, user, pwd):"""管理员注册:param user::param pwd::return:"""self.username = userself.password = pwdpath = os.path.join(settings.BASE_ADMIN_DIR, self.username) #管理员目录pickle.dump(self, open(path, 'xb')) #将管理员对象写入文件class Student:"""学生相关信息"""def __init__(self):self.username = Noneself.password = Noneself.course_list = []self.study_dict = {}def select_course(self, course_obj):"""学生选课:param course_obj::return:"""self.course_list.append(course_obj) #将课程对象添加进课程列表def study(self, course_obj):"""学生上课:param course_obj::return:"""class_result = course_obj.have_lesson() #获取学生上课信息if course_obj in self.study_dict.keys(): #key:课程对象 value:上课信息列表,是列表格式self.study_dict[course_obj].append(class_result) #将上课信息列表添加进上一次的列表中else:self.study_dict[course_obj] = [class_result, ] #创建该课程对象的键值对def login(self, user, pwd):"""学生登陆:param user::param pwd::return:"""if self.username == user and self.password == pwd:return Trueelse:return Falsedef register(self, user, pwd):"""学生注册:param user::param pwd::return:"""self.username = userself.password = pwdpath = os.path.join(settings.BASE_STUDENTS_DIR, self.username) #学生目录pickle.dump(self, open(path, 'xb')) #将学生对象写入学生目录
4.3管理员文件administrator.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))import random
import time
import pickle
import os
from lib import models
from config import settings
from lib.models import *def create_course(admin_obj):teacher_list = pickle.load(open(settings.TEACHER_DB_DIR, 'rb')) #读取老师清单for num, item in enumerate(teacher_list, 1): #打印老师清单print(num, item.name,item.age,item.create_time,item.create_admin.username)course_list = [] #创建课程列表while True:name = input('请输入课程名称(q退出):')if name == 'q':breakcost = input('请输入课时费:')num = input('选择老师(序号):')obj = models.Course(name, cost, teacher_list[int(num)-1], admin_obj) #创建课程对象course_list.append(obj)if os.path.exists(settings.COURSE_DB_DIR): #如果有课程列表exists_list = pickle.load(open(settings.COURSE_DB_DIR, 'rb'))course_list.extend(exists_list) #对原有课程列表进行扩展pickle.dump(course_list, open(settings.COURSE_DB_DIR, 'wb')) #将学生列表写入文件def create_teacher(admin_obj):teacher_list = [] #创建老师列表while True:teacher_name = input('请输入老师姓名(q表示退出)')if teacher_name == 'q':breakteacher_age = input('请输入老师年龄')obj = models.Teacher(teacher_name, teacher_age, admin_obj) #创建老师对象teacher_list.append(obj)if os.path.exists(settings.TEACHER_DB_DIR):exists_list = pickle.load(open(settings.TEACHER_DB_DIR, 'rb'))teacher_list.extend(exists_list) #对原有老师列表进行扩展pickle.dump(teacher_list, open(settings.TEACHER_DB_DIR, 'wb')) #将老师列表写入文件def login(user,pwd):if os.path.exists(os.path.join(settings.BASE_ADMIN_DIR, user)):# 从文件中将管理员对象读取出来(里面封装了用户信息以及提供了登录方法)admin_obj = pickle.load(open(os.path.join(settings.BASE_ADMIN_DIR, user), 'rb'))if admin_obj.login(user, pwd):print('登录成功')while True:sel = input("1、创建老师;2、创建课程")if sel == '1':create_teacher(admin_obj)elif sel == '2':create_course(admin_obj)else:breakelse:return 1else:return 0def regiter(user,pwd):admin_obj = models.Admin()admin_obj.register(user, pwd)def main():inp = input("1、管理员登录;2、管理员注册;\n >>>")user = input('请输入用户名:')pwd = input('请输入密码:')if inp == '1':ret = login(user, pwd)if ret == 1:print('密码错误')elif ret == 0:print('用户不存在')elif inp == '2':regiter(user, pwd)if __name__ == "__main__":main()
4.4学生文件students.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import pickle
from lib import models
from config import settings
from lib.models import Course
from lib.models import Admin
from lib.models import Teacherdef course_info(student_obj): #打印已选课程信息for item in student_obj.course_list:print(item.course_name, item.teacher.name)def select_course(student_obj): #选择课程course_list = pickle.load(open(settings.COURSE_DB_DIR, 'rb')) #从文件读取课程for num, item in enumerate(course_list, 1):print(num, item.course_name, item.cost, item.teacher.name) #打印课程列表while True:num = input("请选择课程(q退出):")if num == "q":break;selected_course_obj = course_list[int(num)-1] #根据序号选择课程if selected_course_obj not in student_obj.course_list:student_obj.course_list.append(selected_course_obj) #添加进该学生的课程列表pickle.dump(student_obj, open(os.path.join(settings.BASE_STUDENTS_DIR, student_obj.username), 'wb'))#将学生对象dump进文件,封装学生选课列表,上课字典信息def login(user, pwd):if os.path.exists(os.path.join(settings.BASE_STUDENTS_DIR, user)):student_obj = pickle.load(open(os.path.join(settings.BASE_STUDENTS_DIR, user), 'rb'))if student_obj.login(user,pwd): #如果登陆成功while True:inp = input('1、选课;2、上课;3、查看课程信息')if inp == '1':select_course(student_obj)elif inp == '3':course_info(student_obj)else:breakelse:print('密码错误')else:print('用户不存在')def register(user, pwd):obj = models.Student()obj.register(user,pwd)def main():inp = input('1、登录;2、注册 \n >>>')user = input("用户名:")pwd = input("密码:")if inp == "1":login(user,pwd)elif inp == "2":register(user, pwd)if __name__ == "__main__":main()

相关文章:
【python实现学生选课系统】
一、要求: 选课系统 管理员: 创建老师:姓名、性别、年龄、资产 创建课程:课程名称、上课时间、课时费、关联老师 使用pickle保存在文件 学生: 学生:用户名、密码、性别、年龄、选课列表[]、上课记录{课程…...
备受青睐的4D毫米波成像雷达,何以助力高阶自动驾驶落地?
近日,海外媒体曝出特斯拉已向欧洲监管机构提交车辆变更申请,并猜测特斯拉最新的自动驾驶硬件HW4.0或将很快量产上车。据爆料,HW4.0最大的变化是马斯克放弃的毫米波雷达又加了回来,根据国外知名博主Greentheonly的拆解分析…...
3.20算法题(一) LeetCode 合并两个有序数组
题目链接:算法面试题汇总 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 题目描述:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元…...
QT | 编写一个简单的上位机
QT | 编写一个简单的上位机 时间:2023-03-19 参考: 1.易懂 | 手把手教你编写你的第一个上位机 2.QT中修改窗口的标题和图标 3.图标下载 1.打开QT Creator 2.新建工程 Qt Creator 可以创建多种项目,在最左侧的列表框中单击“Application”&am…...
DirectX12(D3D12)基础教程(二十一)—— PBR:IBL 的数学原理(2/5)
目录3、IBL 数学原理3.1、基于微平面理论的 “Cook-Torrance” 模型回顾3.2、 ksk_sks 项与菲涅尔项等价消除3.3、拆分“漫反射项”和“镜面反射项”3、IBL 数学原理 接下来,就让我们正式进入整个 IBL 的数学原理的旅程。请注意,前方高能! …...
嵌入式学习笔记——SysTick(系统滴答)
系统滴答前言SysTick概述SysTick是个啥SysTick结构框图1. 时钟选择2.计数器部分3.中断部分工作一个计数周期(从重装载值减到0)的最大延时时间工作流程SysTick寄存器1.控制和状态寄存器SysTick->CTRL2.重装载值寄存器SysTick->LOAD3.当前值寄存器Sy…...
Linux实操之服务管理
文章目录一、服务(service)管理介绍:service管理指令查看服务名服务的运行级别(runlevel):CentOS7后运行级别说明chkconfig指令介绍一、服务(service)管理介绍: 服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它…...
基于Java+SpringBoot+vue的毕业生信息招聘平台设计和实现【源码+论文+演示视频+包运行成功】
博主介绍:专注于Java技术领域和毕业项目实战 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例(200套) 目录 一、效果演示 二、…...
智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)
摘要:智能生活垃圾检测与分类系统用于日常生活垃圾的智能监测与分类,通过图片、视频和摄像头识别生活垃圾,对常见的可降解、纸板、玻璃、金属、纸质和塑料等类别垃圾进行检测和计数,以协助垃圾环保分类处理。本文详细介绍基于YOLO…...
建立农村污水处理设施已经成为了当务之急!
在现代社会中,随着城市化进程的加速和人口的增长,选择农村污水处理设备进行污水处理已经成为了一个非常重要的问题。虽然城市中的污水处理设施得到了很好的发展,但是农村地区的污水处理还存在很多问题。 在农村地区,由于缺乏污水…...
【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)
MATLAB求解一维线性函数问题前言正文函数实现可视化处理可视化结果前言 一维线性函数,也称为一次函数,是指只有一个自变量xxx的函数,且函数表达式可以写成yaxbyaxbyaxb的形式,其中aaa和bbb是常数。具体来说,aaa称为斜…...
【JavaEE】Thread 类及常用方法
一、Thread 类Thread 类我们可以理解为是 java 用于管理线程的一个类,里面封装了操作系统提供的线程管理这一方面的 API (Thread 是优化后的结果), Java 代码创建的每一个线程,可以理解为为 Thread 实例化的对象,Threa…...
C语言数据结构初阶(7)----队列
CSDN的uu们,大家好。这里是C语言数据结构的第七讲。 目标:前路坎坷,披荆斩棘,扶摇直上。 博客主页:姬如祎队列的基础知识队列(queue)是只允许在一端进行插入操作,而在另一端进行删除…...
代码随想录二刷 day01 | 704. 二分查找 27. 移除元素 977. 有序数组的平方
代码随想录二刷day01704. 二分查找27. 移除元素977. 有序数组的平方704. 二分查找 题目链接 做这种题最好现在纸上写一写,如果在大脑中想,可能一会就晕了。 二刷的时候发现了一个新的知识点 即: >>的作用 二分法第二种写法:…...
Linux 终端、进程组、会话、守护进程
文章目录一、终端概念终端概念控制终端二、进程组概念进程组概述进程组相关 API会话会话概念会话相关 API创建会话注意事项守护进程守护进程介绍守护进程模型守护进程参考代码守护进程相关 API参考文章一、终端概念 终端概念 1、终端(Terminal) 终端是…...
你是否有潜质成为谷歌开发者专家?加入 GDE 成长计划,释放潜力!
谷歌开发者专家 (Google Developer Experts,GDE),又称谷歌开发者专家项目,是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...
安全防御之防火墙篇(二)
目录 1.防火墙如何处理双通道协议? 2.防火墙如何处理NAT? 3.防火墙支持哪些NAT技术,主要应用的场景是什么? 4.当内网PC通过公网域名解析访问内网服务器的时候,会存在什么问题,如何解决?请详细…...
设计必备,5个png免抠素材网站,建议收藏
做设计、PPT都需要用到大量的免抠素材,职场中熟练使用Photoshop的人毕竟是少数,也很少有人愿意花费时间去精细抠图。那这5个免抠素材网站一定要收藏好,可以有效帮你节省时间,提高工作效率。 1、菜鸟图库 https://www.sucai999.co…...
shell 脚本expect
expect 是什么 expect - programmed dialogue with interactive programs(与互动程序进行程序对话) 定义脚本执行的 shell #!/usr/bin/expect -f 定义的是执行 expect 可执行文件的链接路径(或真实路径),功能类似于bas…...
第十九天 Maven总结
目录 Maven 1. 前言 2. 概述 2.1 介绍 2.2 安装 3. IDEA集成Maven 3.1 集成Maven环境 3.2 创建Maven项目 3.3 Maven坐标详解 3.4 导入maven项目 4. 依赖管理 4.1 依赖配置 4.2 依赖传递 4.3 依赖范围 4.4 生命周期 4.5 插件 Maven 1. 前言 1). 什么是Maven? …...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
