import sys
import pickle
import os USERINFO = r'C:\Users\12078\PycharmProjects\OldBoy\选课系统\userinfo'
STUINFO = r'C:\Users\12078\PycharmProjects\OldBoy\选课系统\stuinfo'
COURSEINFO=r'C:\Users\12078\PycharmProjects\OldBoy\选课系统\courinfo'
COURSE_LIST=r'C:\Users\12078\PycharmProjects\OldBoy\选课系统\courinfo_list'
STU_COURSEINFO=r'C:\Users\12078\PycharmProjects\OldBoy\选课系统\stu_courinfo' class Course(object): def __init__(self,name,price,period):
self.name = name
self.price = price
self.period = period class Student(object):
opt_lst = [('查看课程', 'show_courses'),('选择课程','choose_course'),
('查看已选课程', 'show_selected'), ('退出', 'exit')]
def __init__(self,name):
self.name = name
self.courses = [] def show_courses(self):
with open(COURSE_LIST, mode='r', encoding='utf-8') as f:
for line in f:
print(line.strip()) def choose_course(self):
# pass # 设计一个数据结构,将student和 course同时存进去
courses=[]
with open(COURSE_LIST, mode='r', encoding='utf-8') as f:
for line in f:
courses.append(line.strip())
for index,c in enumerate(courses,1):
print(index,c)
num=int(input("请选择要选择的课程序号: "))
dic={}
flag=True
if os.path.getsize(STU_COURSEINFO) > 0:
with open(STU_COURSEINFO, mode='rb') as f:
while True:
try:
dic = pickle.load(f)
if self.name in dic:
self.courses=dic[self.name]
else:
self.courses=[]
if courses[num - 1] in self.courses:
print("该课程已经选择过了,请选择其他课程!")
flag=False
else:
self.courses.append(courses[num - 1])
dic[self.name] = self.courses
except EOFError:
break
else:
print("here")
self.courses=[]
self.courses.append(courses[num - 1])
dic[self.name] = self.courses
if flag:
with open(STU_COURSEINFO, mode='wb') as f: # 覆盖
pickle.dump(dic, f) # 将实例化对象 pickle进文件
print('%s课程创建成功' % courses[num-1]) def show_selected(self):
with open(STU_COURSEINFO, mode='rb') as f:
while True:
try:
dic = pickle.load(f)
if self.name in dic:
print(dic[self.name])
break
except EOFError:
print("没有此学生的选课信息")
break def exit(self):
sys.exit() @staticmethod
def init(ret):
with open(STUINFO,'rb') as f:
while True:
try:
obj = pickle.load(f)
if obj.name == ret[0]:
return obj
except EOFError:print('没有这个学生,出现了不可思议的错误!') class Manager(object):
opt_lst = [('创建课程','create_course'),('创建学生','create_student'),
('查看课程','show_courses'),('查看学生','show_students'),
('查看学生和已选课程','show_stu_course'),('退出','exit')]
def __init__(self,name):
self.name = name # 创建的课程对象直接pickle进到文件里。
def create_course(self):
cname = input("请输入课程的名字: ")
cprice = input("请输入课程的价格: ")
cperiod = input("请输入课程的周期: ")
course = Course(cname, cprice, cperiod)
with open(COURSE_LIST, mode='a', encoding='utf-8') as f:
f.write('%s\n' % (cname)) # 给定默认密码和身份 身份要和类重名方便使用反射
with open(COURSEINFO, mode='ab') as f:
pickle.dump(course, f) # 将实例化对象 pickle进文件
print('%s课程创建成功' % course.name) # 创建的学生对象直接pickle进到文件里,将学生的username,password,ident存到单独的文件夹里方便后面遍历。
def create_student(self):
usr = input('username :')
stu = Student(usr)
with open(USERINFO,mode = 'a',encoding='utf-8') as f:
f.write('%s|123456|Student\n'%(usr)) # 给定默认密码和身份 身份要和类重名方便使用反射
with open(STUINFO,mode = 'ab') as f:
pickle.dump(stu,f) # 将实例化对象 pickle进文件
print('%s学生创建成功'%stu.name) def show_courses(self):
with open(COURSE_LIST, mode='r', encoding='utf-8') as f:
for line in f:
print(line.strip()) def show_students(self):
with open(USERINFO, mode='r', encoding='utf-8') as f:
# for line in f:
# print(line.strip())
# 或:
while True:
text_line = f.readline()
if text_line:
print(text_line.strip())
else:
break def show_stu_course(self):
if os.path.getsize(STU_COURSEINFO) > 0:
with open(STU_COURSEINFO, mode='rb') as f:
while True:
try:
dic = pickle.load(f)
print(dic)
for k,v in dic.items():
c_list=";".join(v)
print('%s选择的课程是%s'%(k,c_list))
except EOFError:
break
else:
print("没有任何学生的选课信息。") def exit(self):
sys.exit() @classmethod
def init(cls,ret):
obj = cls(ret[0]) # 实例化一个 Manager对象返回
return obj # 用户 输入用户名 密码 判断用户是否合法和身份是啥?
def login():
''' :return: 登录成功:用户名,身份
登录失败:False
'''
username = input('username :')
password = input('password :')
with open(USERINFO,encoding='utf-8') as f:
for line in f:
usr,pwd,ident = line.strip().split('|')
if usr == username and password == pwd:
return usr,ident # 返回的是个元组 如: ('alex', 'Manager')
else:
return False ret = login()
# print(ret) # ('alex', 'Manager')
if ret:
print('登录成功,%s,欢迎使用选课系统'%ret[0])
if hasattr(sys.modules[__name__],ret[1]):
cls = getattr(sys.modules[__name__],ret[1]) # 第一次使用反射,获取身份 obj = cls.init(ret) # 返回一个 Manager或 Student对象
while True:
for index,opt in enumerate(cls.opt_lst,1):
print(index,opt[0])
num = int(input('您要选择的操作 :').strip())
if hasattr(obj,cls.opt_lst[num-1][1]):
getattr(obj,cls.opt_lst[num-1][1])() # 第二次使用反射,调用各自方法列表里的方法 Manager和Student里都有一个 opt_lst
else:
print('登录失败')

python_选课系统的更多相关文章

  1. 从零开始学Python06作业思路:学生选课系统

    一,作业要求 选课系统: 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 学生:用户名.密码.性别.年龄.选课列表[].上课记录{课程1:[di,a,]} ...

  2. python之选课系统详解[功能未完善]

    作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类--   2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能       遇到的困 ...

  3. Python开发程序:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  4. python实现学生选课系统 面向对象的应用:

    一.要求: 选课系统 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 使用pickle保存在文件 学生: 学生:用户名.密码.性别.年龄.选课列表[].上课 ...

  5. Python开发程序:选课系统

    本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  6. python 面向对象 class 老男孩选课系统

    要求:1. 创建北京.上海 2 所学校 class2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含,周期,价格,通过学校创建课 ...

  7. 一个简单的python选课系统

    下面介绍一下自己写的python程序,主要是的知识点为sys.os.json.pickle的模块应用,python程序包的的使用,以及关于类的使用. 下面是我的程序目录: bin是存放一些执行文件co ...

  8. 学生选课系统 c语言

    /********************************* *主题:学生选修课程系统设计 * *设计要求: *1.添加功能:程序能够任意添加课程和学生记录,可提供选择界面供用户选择所需要添加 ...

  9. day27、28 二十八、项目:选课系统

    选课系统 作业要求 角色:学校.学生.课程.讲师 要求: 1. 创建北京.上海 2 所学校 ----> 创建学校 2. 创建linux , python , go 3个课程 , linux\py ...

随机推荐

  1. 第十四周C++学习总结

    类模板使用方法:类模板名 <数据类型> 对象名: C++有个标准模板库(STL)(standard template library),编程时使用它会提高程序的可靠性. Stl 包含了(容 ...

  2. Vim最强调试插件:vimspector

    最近看到了韦大在知乎的回答后,想去试用一下vimspector,却发现vimspector诞生两年了却没有介绍它的中文资料.我查阅官方文档遇到不少困难,在这里记录折腾出来的结果,与大家分享. vims ...

  3. day37 Pyhton 网络编程04

    # tcp协议和udp协议的选择问题 # tcp # 大量的连续的数据 传递文件\发送邮件 # 文件的传递 # 下载电影 # udp # 短消息类 社交软件 # qq 微信 # 在线播放视频 快会丢帧 ...

  4. JetBrains-CLion永久激活教程

    前言 JetBrains Clion 是一款专为 C/C++ 开发所设计的跨平台 IDE.本文适用 JetBrains CLion v2019.3/3.1/3.2/3.3 永久激活,附破解补丁和激活码 ...

  5. JS时间扩展插件

    前言 原生JS有些没定义的方法只能自己封装了,比如获取现在相隔本年过了几天以及过了多少周,这些都是原JS里没有的方法,现在插件只有一些方法,后期再慢慢扩展 插件使用方法 引用TimeToPack.js ...

  6. 没花一分钱的我竟然收到的JetBrains IDEA官方免费赠送一年的Licence

    前言 做java的人,一般IDE工具用的不是eclipse就是IntelliJ IDEA了吧,eclipse因为是开源软件,而且起步比较早,功能也比较完善.早期基本上做java的使用eclipse都是 ...

  7. svn右键菜单不显

    问题1: 32位svn客户端安装到64位win7机器上,出现svn右键菜单不显. 网上有些说,,选择Mufwin7,关键下拉列表没有这项. 后来有人推荐64位系统安装64svn;32位系统安装32sv ...

  8. docker部署nginx服务器

    1,下载nginx镜像 docker pull nginx 2,启动 docker run --name runoob-nginx-test -p 8081:80 -d nginx 3,创建本地目录 ...

  9. Android面试题收录及解答10月刊

    前言 嗨,大家好,好久不见.这里跟大家侃侃这中间发生了什么. 一个月前呢,想准备面试,就网上随便找找面试题什么的,发现要么就是卖课的,要么就是不给详细回答的或者回答不够深的(也许是我没找到).反正稍微 ...

  10. 【4】TensorFlow光速入门-保存模型及加载模型并使用

    本文地址:https://www.cnblogs.com/tujia/p/13862360.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...