项目组接到一个新项目,要为某学校开发一个“学生信息管理系统”,经过与客户沟通交流,确定该系统的主要功能如下图所示。
整个学生信息管理系统主要包括两大模块:基本信息管理和学生成绩管理。
基本信息管理模块的主要功能有学生信息的添加、删除、修改、显示和学生数据的导入导出,、
学生成绩管理模块的主要功能有统计课程最高分、最低分和平均分。

上篇我们已经完成了学生信息管理的功能模块。
接下来我们先完善下学生信息管理功能,增加文件导入和导出学习信息的功能,同时增加学生成绩管理子菜单功能。
在学生信息管理类StudentList下面继续添加文件导入和导出的两个函数功能:
- class StudentList:
- def __init__(self):
- self.stulist = []
- ...
- #以下增加导入和导出学生信息功能
- def load(self,fn):
- #导入学生信息
- if os.path.exists(fn):
- try:
- with open(fn,'r',encoding = 'utf-8') as fp:
- while True:
- fs = fp.readline().strip('\n')
- if not fs:
- break
- else:
- stu = Student(*fs.split(','))
- if self.__exists(stu.no):
- print('该学号已存在')
- else:
- self.stulist.append(stu)
- print('导入完毕')
- except:
- print('error...') #要导入的文件不是utf-8编码,或是字段数不匹配等
- else:
- print('要导入的文件不存在')
-
-
- def save(self,fn):
- #导出学生信息
- with open(fn,'w',encoding = 'utf-8') as fp:
- for stu in self.stulist:
- fp.write(stu.no + ',')
- fp.write(stu.name + ',')
- fp.write(str(stu.chinese) + ',')
- fp.write(str(stu.math) + ',')
- fp.write(str(stu.english) + '\n')
- print("导出完毕")
我们新建一个csv文件输入如下内容:
005,TEST02,87,65,99
006,TEST03,90,85,85
然后运行程序,通过如下菜单导入此文件数据


导入完成后输入show命令我们可以看到相关导入数据:

接着我们输入save命令来导出文件:

打开文档如下:

根据我们整体的系统架构,我们先改造下主菜单,增加score菜单对应学生统计的函数
- scoreprocess():
-
- def main(self):
- #主控函数
- while True:
- print('学生信息管理系统V1.0'.center(24,'='))
- print('info -------学生基本信息管理')
- print('score -------学生成绩统计')
- print('exit -------退出系统')
- print(''.center(32,'='))
- s = input('main>').strip().lower()
- if s == 'info':
- self.infoprocess()
- elif s == 'score':
- self.scoreprocess()
- elif s == 'exit':
- break
- else:
- print('输入错误')
接着我们定义函数scoreprocess()用于学生成绩统计:
- def scoreprocess(self):
- #学生成绩统计
- print('学生成绩统计'.center(24,'='))
- print('avg --------课程平均分')
- print('max --------课程最高分')
- print('min --------课程最低分')
- print('return --------返回')
- print(''.center(30,'='))
- while True:
- s = input('score>').strip().lower()
- if s == 'avg':
- self.scoreavg()
- elif s == 'max':
- self.scoremax()
- elif s == 'min':
- self.scoremin()
- elif s == 'return':
- break
- else:
- print('输入错误')
最后定义三个函数统计平均,最高和最低分:
- def scoreavg(self):
- #求课程平均分
- length = len(self.stulist)
- if length > 0:
- chinese_avg = sum([stu.chinese for stu in self.stulist])/length
- math_avg = sum([stu.math for stu in self.stulist])/length
- english_avg = sum([stu.english for stu in self.stulist])/length
- print('语文成绩平均分是:%.2f'%chinese_avg)
- print('数学成绩平均分是:%.2f'%math_avg)
- print('英语成绩平均分是:%.2f'%english_avg)
- else:
- print('尚没有学生成绩...')
-
- def scoremax(self):
- #求课程最高分
- if len(self.stulist) > 0:
- chinese_max = max([stu.chinese for stu in self.stulist])
- math_max = max([stu.math for stu in self.stulist])
- english_max = max([stu.english for stu in self.stulist])
- print('语文成绩最高分是:%d'%chinese_max)
- print('数学成绩最高分是:%d'%math_max)
- print('英语成绩最高分是:%d'%english_max)
- else:
- print('尚没有学生成绩...')
-
- def scoremin(self):
- #求课程最低分
- if len(self.stulist) > 0:
- chinese_min = min([stu.chinese for stu in self.stulist])
- math_min = min([stu.math for stu in self.stulist])
- english_min = min([stu.english for stu in self.stulist])
- print('语文成绩最低分是:%d'%chinese_min)
- print('数学成绩最低分是:%d'%math_min)
- print('英语成绩最低分是:%d'%english_min)
- else:
- print('尚没有学生成绩...')
运行程序:
输入score:

平均分:

最高分

最低分
