当前位置: 首页 > news >正文

【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的拆解分析&#xf…...

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. 二分查找 题目链接 做这种题最好现在纸上写一写,如果在大脑中想,可能一会就晕了。 二刷的时候发现了一个新的知识点 即: >>的作用 二分法第二种写法&#xff1a…...

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

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...