【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? …...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...