python开发项目:学生选课系统
程序要求:
1.创建北京、上海两所学校(分析:通过学校类实例化两个学校实例)
2.创建Linux、python、go三个课程,Linux\go在北京开,Linux在上海开(创建Linux、python、go三门课程)
3.课程包含:周期、价格,通过学校来创建课程(分析:通过学校实例来创建课程,课程包含三个属性:名字、周期、价格)
4.通过学校来创建班级,班级关联课程、讲师(分析:通过学校实例来创建班级,班级要关联课程、讲师)
5.创建学员时,选择学校、关联班级(分析:选择学校后通过学校实例创建学员,学员关联班级)
6.创建讲师时要关联学校(分析:通过学校实例来创建讲师,并关联班级)
7.创建讲师角色时要关联学校提供的两个角色接口(同上)
8.学员视图:可以注册、交学费、选择班级
9.讲师视图:讲师可以管理自己的班级,上课选择班级、查看班级学员列表、修改所管理的学员的成绩
10.管理视图:创建讲师、创建班级、创建课程
11。上面的操作产生的数据都保存在文件里
由上述分析可知:需要创建5个类:学校、学员、班级、课程、讲师
5个类的对应关系:
一个学校对应多个班级、学员、课程、讲师
一个班级对应多个学员、一个课程、一个讲师
一个讲师对应多个班级、多个学员,(可通过班级找到学员、课程)
一个学员对应多个班级
有以上可知:可由学校类的属性中保存班级、学员、课程、讲师的实例字典,由班级类的属性中保
存学员实例字典,课程实例。由讲师类的属性中保存班级实例字典
功能需求:三个视图,即8、9、10所要求的功能
以下是程序的目录结构:

以下是程序的全部代码:
bin目录下的start
# -*- coding:utf-8 -*-
#!/user/bin/env.python
#Author:Mr Wu import os,sys BASE_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,BASE_dir)
from core import main if __name__ == '__main__':
obj = main.intersection_center()
obj.intersection()
conf目录下的settings
'''定义数据库的绝对路径'''
import os
if os.sep == "\\":
BASE_dir = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1])
database_dir = os.path.join(BASE_dir,"database")
else:
BASE_dir = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1])
database_dir = os.path.join(BASE_dir,"database") school_db_file = os.path.join(database_dir,"school")
core目录下的main:
import os,sys,shelve
BASE_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,BASE_dir)
from modules import School
from conf import settings class intersection_center(object):
'''开始交互'''
def __init__(self):
pass
def intersection(self):
while True:
print("\033[1;30m欢迎来到学生选课系统\033[0m\n"
"1:\033[1;31m管理视图\033[0m\n"
"2:\033[1;32m讲师视图\033[0m\n"
"3:\033[1;33m学员视图\033[0m\n"
"q:\033[1;34m退出\033[0m\n")
user_choice = input("\033[1;30m input your choice ID>>>:\033[0m")
if user_choice == "":
manage_view()
elif user_choice == "":
teacher_view()
elif user_choice == "":
student_view()
elif user_choice == "q":
print("\033[1;30m感谢您使用学生信息管理系统\033[0m")
break
else:
print("\033[1;31m输入错误!\033[0m") class manage_view(object):
'''管理视图'''
def __init__(self):
if os.path.exists(settings.school_db_file+".dat"): #shelve的.dat文件是用来存数据的
self.school_db = shelve.open(settings.school_db_file)
self.manage_intersection()
self.school_db.close()
else:
print("\033[1;31m系统提示:开始创建学校\033[0m")
self.create_school()
self.manage_intersection()
self.school_db.close()
def create_school(self):
'''创建学校'''
self.school_db = shelve.open(settings.school_db_file)
for i in range(2):
school_name = input("\033[1;30m input school name>>>:\033[0m")
school_address = input("\033[1;30m input school address>>>:\033[0m")
self.school_db[school_name] = School.School(school_name,school_address)
def manage_intersection(self):
'''管理视图交互'''
count = 0
print("\033[1;30m学校名称:\033[0m")
for key in self.school_db:
print(key)
while count < 3:
self.school_name = input("\033[1;30m输入要管理的学校名称>>>:\033[0m")
if self.school_name in self.school_db:
self.school = self.school_db[self.school_name]
while True:
print("\033[1;30m欢迎来到管理视图\033[0m\n"""
"1:\033[1;31m创建班级\033[0m\n"
"2:\033[1;32m创建课程\033[0m\n"
"3:\033[1;33m招聘讲师\033[0m\n"
"4:\033[1;34m查看班级\033[0m\n"
"5:\033[1;35m查看讲师\033[0m\n"
"6:\033[1;36m查看课程\033[0m\n"
"b:\033[1;37m返回\033[0m\n")
user_choice = input("\033[1;30m input your choice ID>>>:\033[0m")
if user_choice == "":
self.create_class()
elif user_choice == "":
self.create_course()
elif user_choice == "":
self.create_teacher()
elif user_choice == "":
self.show_class()
elif user_choice == "":
self.show_teacher()
elif user_choice == "":
self.show_course()
elif user_choice == "b":
print("\033[1;35m感谢您使用管理视图\033[0m")
break
else:
print("\033[1;31m输入错误!\033[0m")
break
else:
print("\033[1;31m输入错误,请重新输入\033[0m")
count += 1 def create_class(self):
'''创建班级'''
while True:
class_number = input("\033[1;30m输入班级编号>>>:\033[0m")
if class_number in self.school.classes:
print("\033[1;31m这个班级已经存在!\033[0m")
continue
else:
course_name = input("\033[1;30m输入关联的课程名称>>>:\033[0m")
if course_name in self.school.courses:
self.school.create_class(class_number,course_name)
print("\033[1;30m创建班级:\033[0m[\033[1;33m%s班]成功\033[0m,\033[1;30m开设课程:\033[0m[\033[1;33m%s\033[0m]"%(class_number,course_name))
if_continue = input("\033[1;30m是否继续创建班级? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
self.school_db.update({self.school_name:self.school})
break
else:
print("\033[1;31m输入错误!\033[0m")
else:
print("\033[1;31m此课程不存在,请先创建此课程!\033[0m")
break def create_teacher(self):
'''招聘教师'''
while True:
tea_name = input("\033[1;30m输入讲师的名字>>>:\033[0m")
if tea_name in self.school.teachers:
print("\033[1;31m这个讲师已经存在!\033[0m")
continue
else:
tea_age = input("\033[1;30m输入讲师的年龄>>>:\033[0m")
tea_sex = input("\033[1;30m输入讲师的性别>>>:\033[0m")
tea_salary = input("\033[1;30m输入讲师的薪资>>>:\033[0m")
while True:
class_number_str = input("\033[1;30m输入关联的班级编号(格式:int,int...)>>>:\033[0m")
class_number_list = class_number_str.split(",")
count = 0
for class_number in class_number_list:
if class_number in self.school.classes:
count += 1
if count == len(class_number_list):
self.school.create_teacher(tea_name,tea_age,tea_sex,tea_salary,class_number_list)
print("讲师:[%s] 关联班级:[%s班]"%(tea_name,class_number_str))
break
else:
print("\033[1;31m关联的班级中有不存在的班级,请检查后重新输入!\033[0m")
if_continue = input("\033[1;30m是否继续招聘讲师? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
print("\033[1;30m招聘讲师:[%s]成功\033[0m \033[1;33m薪资:[%s]\033[0m"%(tea_name,tea_salary))
self.school_db.update({self.school_name:self.school})
break
else:
print("\033[1;31m输入错误!\033[0m")
break def create_course(self):
'''创建课程'''
while True:
course_name = input("\033[1;30m输入课程名字>>>:\033[0m")
if course_name in self.school.courses:
print("\033[1;31m这个课程已经存在!\033[0m")
continue
else:
course_time = input("\033[1;30m输入课程周期>>>:\033[0m")
course_price = input("\033[1;30m输入课程价格>>>:\033[0m")
self.school.create_course(course_name,course_time,course_price)
print("\033[1;30m创建课程:\033[0m\033[1;33m[%s]成功\033[0m,\033[1;30m课程周期:\033[0m\033[1;33m[%s]\033[0m"%(course_name,course_time))
if_continue = input("\033[1;30m是否继续创建课程? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
self.school_db.update({self.school_name:self.school})
break
else:
print("\033[1;31m输入错误!\033[0m")
break def show_class(self):
'''班级信息'''
while True:
self.school.show_classes()
if_continue = input("\033[1;30m是否继续查看班级信息? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
break
else:
print("\033[1;301输入错误!\033[0m") def show_teacher(self):
'''讲师信息'''
while True:
self.school.show_teachers()
if_continue = input("\033[1;30m是否继续查看讲师信息? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
break
else:
print("\033[1;31m输入错误!\033[0m") def show_course(self):
'''课程信息'''
while True:
self.school.show_courses()
if_continue = input("\033[1;30m是否继续查看课程信息? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
break
else:
print("\033[1;31m输入错误!\033[0m") class teacher_view(object):
'''讲师视图'''
def __init__(self):
if os.path.exists(settings.school_db_file+".dat"):
self.school_db = shelve.open(settings.school_db_file)
self.teacher_intersection()
self.school_db.close()
else:
print("\033[1;31m抱歉学校还未建成!\033[0m") def teacher_intersection(self):
'''讲师交互'''
count = 0
while count < 3:
self.school_name = input("\033[1;30m请输入您就职学校的名字>>>:\033[0m")
if self.school_name in self.school_db:
self.school = self.school_db[self.school_name]
tea_name = input("\033[1;30m输入您的名字>>>:\033[0m")
if tea_name in self.school.teachers:
self.teacher = self.school.teachers[tea_name]
while True:
print("\033[1;30m欢迎来到讲师视图\033[0m\n"
"1:\033[1;31m上课选择班级\033[0m\n"
"2:\033[1;32m查看学员列表\033[0m\n"
"b:\033[1;33m返回\033[0m\n")
user_choice = input("\033[1;30minput your choice ID>>>:\033[0m")
if user_choice == "":
self.select_class()
elif user_choice == "":
self.show_student()
elif user_choice == "b":
print("\033[1;33m感谢您使用讲师视图\033[0m")
break
else:
print("\033[1;31m输入错误!\033[0m")
break
else:
print("\033[1;31m输入错误!\033[0m")
count += 1
else:
print("\033[1;31m输入错误!\033[0m")
count += 1 def show_student(self):
'''查看学员列表'''
while True:
print("\033[1;30m班级列表:\033[0m")
for key in self.teacher.classes:
print("\033[1;36m班级编号:%s 开设课程:%s\033[0m"%(key,self.teacher.classes[key].course_obj.course_name))
class_number = input("\033[1;30m输入您想查看的班级编号>>>:\033[0m")
if class_number in self.teacher.classes:
class_obj = self.teacher.classes[class_number]
for key in class_obj.student_list:
stu_name = key
stu_age = class_obj.student_list[stu_name].stu_age
print("\033[1;30m学员名字:%s\033[0m \033[1;31m学员年龄:%s\033[0m"%(stu_name,stu_age))
if_continue = input("\033[1;30m是否继续查看学员列表? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
break
else:
print("\033[1;31m输入错误!\033[0m")
else:
print("\033[1;31m班级编号不存在!\033[0m") def select_class(self):
'''上课选择班级'''
while True:
for class_number in self.teacher.classes:
class_obj = self.teacher.classes[class_number]
course_name = class_obj.course_obj.course_name
print("\033[1;30m班级编号:%s\033[0m \033[1;31m开设课程:m%s\033[0m"%(class_number,course_name))
select_class = input("\033[1;30m输入您想要上课的班级编号>>>:\033[0m")
if select_class in self.teacher.classes:
print("\033[1;35m讲师%s今天给%s班上课....\033[0m"%(self.teacher.tea_name,select_class))
if_continue = input("\033[1;30m是否重新选择上课班级? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
break
else:
print("\033[1;31m输入错误!\033[0m")
else:
print("\033[1;31m输入错误!\033[0m") class student_view(object):
'''学员视图'''
def __init__(self):
if os.path.exists(settings.school_db_file+".dat"):
self.school_db = shelve.open(settings.school_db_file)
self.student_interaction()
self.school_db.close()
else:
print("\033[1;31m抱歉学校还未建成!\033[0m")
def student_interaction(self):
'''学生交互'''
while True:
print("\033[1;30m欢迎来到学生视图\033[0m\n"
"1:\033[1;31m注册\033[0m\n"
"2:\033[1;32m查看课程\033[0m\n"
"b:\033[1;33m返回\033[0m\n")
user_choice = input("\033[1;30m input your choice ID>>>:\033[0m")
if user_choice == "":
self.registered_class()
elif user_choice == "":
self.show_course()
elif user_choice == "b":
print("\033[1;35m感谢您使用学生视图\033[0m")
break
else:
print("\033[1;35m输入错误!\033[0m")
def registered_class(self):
'''注册学校、班级、缴费'''
while True:
print("\033[1;30m学校名称:\033[0m")
for key in self.school_db:
print(key)
self.school_name = input("\033[1;30m输入您想要注册的学校>>>:\033[0m")
if self.school_name in self.school_db:
self.school = self.school_db[self.school_name]
for key in self.school.classes:
class_obj = self.school.classes[key]
course_name = class_obj.course_obj.course_name
course_price = class_obj.course_obj.course_price
print("\033[1;33m班级编号:%s\033[0m \033[1;34m课程名称:%s\033[0m \033[1;35m课程价格:%s\033[0m"%(key,course_name,course_price))
class_number = input("\033[1;30m输入您想要注册的班级编号>>>:\033[0m")
if class_number in self.school.classes:
class_obj = self.school.classes[class_number]
course_money = class_obj.course_obj.course_price
stu_name = input("\033[1;30m输入您的名字>>>:\033[0m")
if stu_name in class_obj.student_list:
print("\033[1;31m您已经报名此班级,请选择其他班级\033[0m")
else:
stu_age = input("\033[1;30m输入您的年龄>>>:\033[0m")
stu_sex = input("\033[1;30m输入您的性别>>>:\033[0m")
if_pay = input("\033[1;30m您选中的课程费用为:%s,是否支付费用? Y/N>>>:\033[0m"%(course_money))
if if_pay == "Y":
print("\033[1;39m注册班级:[%s班]成功 , 学习课程:[%s]\033[0m"%(class_number,class_obj.course_obj.course_name))
elif if_pay == "N":
continue
else:
print("\033[1;31m输入错误!\033[0m")
self.school.create_student(stu_age,stu_sex,stu_name,class_number)
self.school_db.update({self.school_name:self.school})
break
else:
print("\033[1;31m不存在此班级编号!\033[0m")
else:
print("\033[1;31m不存在此学校!\033[0m")
def show_course(self):
'''查看课程信息'''
while True:
class_number = input("\033[1;30m输入您上课的班级编号>>>:\033[0m")
if class_number in self.school.classes:
class_obj = self.school.classes[class_number]
course_obj = class_obj.course_obj
course_name = course_obj.course_name
course_time = course_obj.course_time
course_price = course_obj.course_price
print("\033[1;32m课程:%s\033[0m \033[1;33m周期:%s\033[0m \033[1;34m价格:%s\033[0m"%(course_name,course_time,course_price))
if_continue = input("\033[1;30m是否继续查看课程信息? Y/N>>>:\033[0m")
if if_continue == "Y":
continue
elif if_continue == "N":
break
else:
print("\033[1;31m输入错误\033[0m")
else:
print("\033[1;31m不存在此班级编号!\033[0m")
modules目录:
Class:
class Class(object):
def __init__(self,class_number,course_obj):
self.class_number = class_number
self.course_obj = course_obj
self.student_list = {}
Teacher:
class Teacher(object):
def __init__(self,tea_name,tea_age,tea_sex,tea_salary):
self.tea_name = tea_name
self.tea_age = tea_age
self.tea_sex = tea_sex
self.tea_salary = tea_salary
self.classes = {}
def teacher_add_class(self,class_number,class_obj):
self.classes[class_number] = class_obj
School:
from modules import Course,Class,Student,Teacher
import pickle
class School(object):
'''学校类'''
def __init__(self,school_name,school_address):
self.school_name = school_name
self.school_address = school_address
self.teachers = {} #讲师实例
self.classes = {} #班级实例
self.courses = {} #课程实例
#self.students = {} #待扩展
def create_class(self,class_number,course_name):
'''创建班级、班级关联课程'''
class1 = Class.Class(class_number,self.courses[course_name])
self.classes[class_number] = class1 def create_teacher(self,tea_name,tea_age,tea_sex,tea_salary,class_number_list):
'''招聘讲师'''
teacher = Teacher.Teacher(tea_name,tea_age,tea_sex,tea_salary)
for class_number in class_number_list:
teacher.teacher_add_class(class_number,self.classes[class_number])
self.teachers[tea_name ] = teacher def create_student(self,stu_age,stu_sex,stu_name,class_number):
'''创建学员,关联班级'''
student = Student.Student(stu_name,stu_age,stu_sex)
self.classes[class_number].student_list[stu_name] = student def create_course(self,course_name,course_time,course_price):
'''创建课程'''
course = Course.Course(course_name,course_time,course_price)
self.courses[course_name] = course def show_teachers(self):
'''查看教师信息'''
for key in self.teachers:
tea_obj = self.teachers[key]
print("名字:%s 年龄:%s 性别:%s 薪资:%s"%(tea_obj.tea_name,tea_obj.tea_age,tea_obj.tea_sex,tea_obj.tea_salary)) def show_classes(self):
'''查看班级信息'''
for key in self.classes:
class_obj = self.classes[key]
print("班级编号:%s 开设课程:%s"%(class_obj.class_number,class_obj.course_obj.course_name)) def show_courses(self):
'''查看课程信息'''
for key in self.courses:
course_obj = self.courses[key]
print("课程:%s 周期:%s 价格:%s"%(course_obj.course_name,course_obj.course_time,course_obj.course_price))
Course·:
class Course(object):
def __init__(self,course_name,course_time,course_price):
self.course_name = course_name
self.course_time = course_time
self.course_price = course_price
Student:
class Student(object):
def __init__(self,stu_name,stu_age,stu_sex):
self.stu_name = stu_name
self.stu_age = stu_age
self.stu_sex = stu_sex
以下是程序执行过程、结果:
开始界面:

管理视图:


创建课程:

创建班级:

招聘讲师:

查看班级:

查看讲师:

查看课程:

讲师视图:

上课选班级:

查看学员列表:

学员视图:

注册:


查看课程:

开发过程中遇到的问题:
1.数据存储问题:学校、班级、讲师、课程、学员之间的信息相互关联,如果将其分开存文件,那么如果有一处的信息变动,那么与之相关联的文件也要修改,这样做十分麻烦。
所以把班级实例、讲师实例、课程实例、学员实例都保存在学校实例中,这样只需要存学校一个文件即可
2.数据序列化问题:开始的时候我使用的是pickle序列化,这样在每个方法中都必须打开-关闭文件才能将文件中的数据更新,这样做十分麻烦。解决方法:使用shelve数据序列化,
在交互开始的时候打开文件,在交互结束的时候再关闭文件,在交互的过程中使用sellf.school_d.update({self.school_name:sellf.school})来更新文件中的数据,这样做十分简略
python开发项目:学生选课系统的更多相关文章
- Python开发程序:选课系统-改良版
程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- Python开发程序:选课系统
本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明
这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...
- python基础-10 程序目录结构 学生选课系统面向对象练习
一 程序目录结构 1 bin文件夹 二进制文件.代码程序 2 conf 配置文件 3 帮助文档 4 头文件库文件等 二 学生选课系统部分代码 未完待续 1 包内的__init__.py文件 在包 ...
- 学生选课系统 c语言
/********************************* *主题:学生选修课程系统设计 * *设计要求: *1.添加功能:程序能够任意添加课程和学生记录,可提供选择界面供用户选择所需要添加 ...
- python开发的学生管理系统
python开发的学生管理系统(基础版) #定义一个函数,显示可以使用的功能列表给用户 def showInfo(): print("-"*30) print(" 学生管 ...
- JAVA | 学生选课系统
这里使用JAVA语言编写的简易的学生选课系统,展现的都是这个系统核心代码. 其中有不足欢迎批评和指正! 链接数据库的代码 package connection;//连接数据库student impor ...
- 学生选课系统v1.0
最近两天写了下老师课上留的作业:学生选课系统.感觉自己写的特别麻烦,思路特别不清晰,平常自己总会偷懒,一些太麻烦细节的功能就不去实现了,用简单的功能来替代,直到自己这回写完这个系统(但自己写的比较lo ...
- java web知识点复习,重新编写学生选课系统的先关操作。
为了复习之前学习的相关的html,javaweb等知识.自己有重新编写了一遍学生选课系统. 下面主要展示登录界面的代码,以及各个大的主页面的相关jsp. <%@ page language=&q ...
随机推荐
- Ada boost学习
http://blog.csdn.net/dark_scope/article/details/14103983 据说在Deep Learning出来之前,SVM和Adaboost是效果最好的 两个算 ...
- LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到.在for (auto p: prerequistites)中特判了输入中可能出现的平行边或 ...
- POJ 2553 The Bottom of a Graph(强连通分量)
POJ 2553 The Bottom of a Graph 题目链接 题意:给定一个有向图,求出度为0的强连通分量 思路:缩点搞就可以 代码: #include <cstdio> #in ...
- VS2013+ffmpeg开发环境搭建-->【转】
本文转载自:http://blog.csdn.net/qq_28425595/article/details/51488869 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天整理资料时,发 ...
- Java-Maven:Maven清单
ylbtech-Java-Maven:Maven清单 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http ...
- 08.HttpUrlconnection方式调用
package com.rl.client; import java.io.BufferedInputStream; import java.io.BufferedReader; import jav ...
- k8s istio 配置请求的路由规则
使用istio我们可以根据权重和HTTP headers来动态配置请求路由. 基于内容的路由 因为BookInfo示例部署了3个版本的评论微服务,我们需要设置一个默认路由. 否则,当你多次访问应用程序 ...
- new一个接口
首先我们先看看接口的定义: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方 ...
- Linux 定时任务 Crontab按秒执行
目前在crontab中最小执行时间单位为分钟. 如果需要按秒来执行,有以下两种方法: 方法一:通过sleep来实现 例: 1.创建test.php文件,这里测试通过打印时间好区分. <?php ...
- 转/ C# 托管资源和非托管资源
原文 对于这两个一直就是模模糊糊的,半知零解 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,由.NET运行库在合适时调用垃圾回收器 ...