所有的程序开发都是从核心功能
出发的,所以我们在开发的时候首先要完成的总是最主要的功能,以后还要慢慢学会自
己提取“核心的功能”、进行“需求分析”,“程序设计”等工作来保证你们能够顺利成长
为一个优秀的程序员。
核心功能
功能概述
学生选课
需求分析
从“学生选课系统” 这几个字就可以看出来,我们最核心的功能其实只有 选课。
角色
学生、管理员
功能
登陆 : 管理员和学生都可以登陆,且登陆之后可以自动区分身份
选课 : 学生可以自由的为自己选择课程
创建用户 : 选课系统是面向本校学生的,因此所有的用户都应该由管理员完成
查看选课情况 :没个学生可以查看自己的选课情况,而管理员应该可以查看所有学生
的信息
工作流程
登陆 :用户输入用户名和密码
判断身份 :在登陆成果的时候应该可以直接判断出用户的身份 是学生还是管理员
学生用户 :对于学生用户来说,登陆之后有三个功能
1、查看所有课程
2、选择课程
3、查看所选课程
4、退出程序
管理员用户:管理员用户除了可以做一些查看功能之外,还有很多创建工作
1、创建课程
2、创建学生学生账号
3、查看所有课程
4、查看所有学生
5、查看所有学生的选课情况
6、退出程序
程序设计
对于复杂的功能,我们首先就应该想到面向对象编程。而要想将面向对象的程序开发好,就
应该做好类和对象的分析工作。
选课系统简单的划分其实只有两个角色:管理员和学生。 仔细思考,你会发现有很多想不通的地
方,比如学生选课,课从哪里来? 这样一想就会发现,其实课程应该可以由管理员创造出来,那么课
程又会有很多属性:价格、周期、课程名、授课老师等等 那么课程也应该是一个类。
综上,本程序最基础的分析已经完毕。接下来我们要把所有的类以及其中的属性、方法设计
出来
课程
属性:课程名、价格、周期、老师
*课程并没有什么动作,所以我们只设计属性不设计方法。其实这里还可以设计很多属性,
比如课程的开始时间、结束时间、教室等等,只要你需要,这些都可以记录下来,但是这里
我们为了简化代码,就先不设计这些了。
学生
属性:姓名、所选课程
方法:查看可选课程、选择课程、查看所选课程、退出程序
管理员
属性:姓名
方法:创建课程、创建学生学生账号、查看所有课程、查看所有学生、查看所有学生的
选课情况、退出程序
import hashlib
import sys
import pickle
flag0 = True
class Course:
def __init__(self,name,price,period,teacher):
self.name = name
self.price = price
self.period = period
self.teacher = teacher
def __repr__(self):
s = ''
for k in self.__dict__:
s += '%s :%s \n' %(k,self.__dict__[k])
return s
class Person:
def __init__(self, name):
self.name = name
class Student(Person):
li = [('查看所有课程', 'check_all_course'), ('选择课程', 'choise_course'),
('查看所选课程', 'check_choise_course'), ('退出程序', 'exit_program')]
def check_all_course(self):
f1 = open('course_info','rb')
while True:
try:
course = pickle.load(f1)
print(course)
except EOFError:
break
def choise_course(self):
with open('stu_course','a')as f1:
self.check_all_course()
cous_name = input('请输入选择的课程')
if cous_name == cous_name :
f1.write('%s:%s\n'%(self.name,cous_name))
else:
print('输入错误')
def check_choise_course(self):
with open('stu_course')as f2:
for line in f2:
new_line = line.strip().split(':')
if self.name == new_line[0]:
print('你已选择的课程有%s'% new_line[1])
def exit_program(self):
print('\033[32m退出成功\033[1m')
global flag0
flag0 = False
class Manager(Person):
li = [('创建课程', 'creat_course'), ('创建学生账号', 'creat_stu_id'),
('查看所有课程', 'check_all_course'), ('查看所有学生', 'check_all_student'),
('查看所选课程', 'check_choise_course'), ('退出程序', 'exit_program')]
def creat_course(self):
name = input('请输入课程名:').strip()
price = input('请输入价格:').strip()
period = input('请输入时间周期:').strip()
teacher = input('请输入授课老师:').strip()
course_obj = Course(name, price, period, teacher)
with open('course_info','ab')as f:
pickle.dump(course_obj,f)
# f.write('name:%s,price:%s,period:%s,teacher:%s\n' %(name,price,period,teacher))
print('\033[33m恭喜你课程创建成功!\033[0m')
def creat_stu_id(self):
stu_name = input('请输入学生账号:').strip()
stu_pwd = input('请输入学生密码:').strip()
stu_pwd_md5 = get_pwd(stu_pwd)
with open('userinfo','a')as f1:
f1.write('\n%s,%s,%s' %(stu_name,stu_pwd_md5,'Student'))
print('学生创建成功')
def check_all_course(self):
f = open('course_info','rb')
while True:
try:
course = pickle.load(f)
print(course)
except EOFError:
break
f.close()
def check_all_student(self):
list = []
with open('userinfo')as f2:
for line in f2:
new_line = line.strip().split(',')
if new_line[2] == 'Student':
list.append(new_line[0])
print(list)
def check_choise_course(self):
with open('stu_course')as f2:
for line in f2:
new_line = line.strip().split(',')
print(new_line)
def exit_program(self):
global flag0
print('退出成功')
flag0 = False
return flag0
def get_pwd(pwd):
pwd_md5 = hashlib.md5()
pwd_md5.update(pwd.encode('utf-8'))
return pwd_md5.hexdigest()
def login():
flag = True
while flag:
username = input('user:')
password = input('pwd:')
password = get_pwd(password)
f = open('userinfo')
for line in f:
user,pwd,status = line.strip().split(',')
if username == user and password == pwd:
print('\033[1;32m登录成功\033[0m')
f.close()
return {'username':user,'status':status}
else:
print('\033[1;32m登录失败,请重新登录\033[0m')
def main():
print('\033[1;34m欢迎进入学生选课系统\033[0m')
ret = login()
if ret:
clas = getattr(sys.modules['__main__'], ret['status'])
obj = clas(ret['username']) # 实例化得到一个obj
while flag0:
for key,item in