【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? …...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...