学生成绩管理
需求分析:
学生成绩的登记、存储、统计等式教学中常规的业务,学生成绩程序主要以学生的语文、数学、英语的成绩为蓝本,对这些成绩进行处理。
系统概述:
学生成绩管理程序主要对学生的语文、数学、英语成绩进行存储、排序、统计等操作,方便教师完成学生成绩的管理与分析工作。
功能需求描述:
学生成绩管理程序采用面向对象的程序设计方法设计,维护学生的成绩表:
学号 | 姓名 | 语文 | 数学 | 英语 |
---|---|---|---|---|
1001 | AAA | … | … | … |
1002 | BBB | … | … | … |
主要的功能有:
- 增加成绩
从键盘中录入每个学生的成绩,增加学生成绩记录,执行命令 insert,例如:
insert
学号:1001
姓名:xxx
语文:78
数学:67
英语:78
- 修改成绩
重新录入成绩,修改学生的成绩,录入的过程中如果某个字段不录入新的值就不更新该字段,执行命令 update,例如:
update
学号:1001
姓名:
语文:87
数学:
英语:
那么直修改 1001 号学生的语文成绩,其它的不修改。
- 删除成绩
录入学生的学号就删除成绩记录,执行命令 delete,例如:
delete
学号:1001
- 导入成绩
从文本文件 marks.txt 中批量导入成绩,文件的格式如下:
学号
姓名
语文
数学
英语
每个字段值占一行,成绩必须有效,程序启动时会读取该文件数据。
- 导出成绩
成绩按学号顺序导出到文件 marks.txt 中,这也是成绩存储的文件,程序结束时会把成绩保存到该文件。
- 成绩统计
程序可以统计出各个科成绩的平均值、均方差,执行命令 stat,例如:
stat
- 分段统计
程序可以统计各个分数段的人数,执行命令 range Chinese/math/English,分别按语文、数学、英语进行分段统计,例如:
range math
按数学进行分段统计。
- 成绩排序
程序可以按各科成绩进行排序输出,执行命令 order Chinese/math/English/total,分别按语文、数学、英语、总分进行排序输出,例如:
order total
按总分排序输出。
程序命令设计:
程序命令 | 功能说明 |
---|---|
show | 显示学生成绩insert 插入学生成绩记录 |
insert | 插入学生成绩记录 |
update | 更新学生成绩记录 |
delete | 删除学生成绩记录 |
stat | 统计学生成绩 |
range Chinese/math/english | 统计各个分数段的人数,例如:Range math统计数学成绩的分数段人数 |
order Chinese/math/emglish/total | 按语文、数学、英语、总分排序输出成绩,例如:order total按总分排序输出 |
程序代码:
# -*- coding: utf-8 -*-
import math
import os
import random
class Mark:
def __init__(self, no, name, chinese=0, math=0, english=0):
self.no = no
self.name = name
self.chinese = chinese
self.math = math
self.english = english
def show(self):
print("%-12s%-12s%-12d%-12d%-12d%-12d" % (
self.no, self.name, self.chinese, self.math, self.english, self.chinese + self.math + self.english))
class StudentMark:
def __init__(self):
self.marks = []
def insert(self, m):
# 插入的 m.no 希望能按 no 顺序插入
i = 0
while i < len(self.marks) and self.marks[i].no < m.no:
i = i + 1
if i < len(self.marks) and self.marks[i].no == m.no:
print(m.no + " already exists")
return
self.marks.insert(i, m)
print("插入成功")
def show(self):
print("%-12s%-12s%-12s%-12s%-12s%-12s" % ("No", "Name", "Chinese", "Math", "English", "Total"))
for m in self.marks:
m.show()
print()
def enter(self):
try:
no = input("学号:").strip() # trim()
if no == "":
raise Exception("学号不能为空")
name = input("姓名:").strip()
# if name=="":
# raise Exception("姓名不能为空")
m = input("语文:").strip()
if m == "":
m = "0"
m = int(m)
if m < 0 or m > 100:
raise Exception("无效的成绩")
chinese = m
m = input("数学:").strip()
if m == "":
m = "0"
m = int(m)
if m < 0 or m > 100:
raise Exception("无效的成绩")
math = m
m = input("英语:").strip()
if m == "":
m = "0"
m = int(m)
if m < 0 or m > 100:
raise Exception("无效的成绩")
english = m
m = Mark(no, name, chinese, math, english)
return m
except Exception as e:
print(e)
return None
def update(self, m):
for i in range(len(self.marks)):
if self.marks[i].no == m.no:
if m.name != "":
self.marks[i].name = m.name
if m.chinese > 0:
self.marks[i].chinese = m.chinese
if m.math > 0:
self.marks[i].math = m.math
if m.english > 0:
self.marks[i].english = m.english
print("更新成功")
return
print(m.no + "不存在")
def delete(self, no):
i = 0
while i < len(self.marks):
if self.marks[i].no == no:
del self.marks[i]
print("删除成功")
return
else:
i = i + 1
print(no + "不存在")
def orderBy(self, course):
course = course.lower()
print("order by ", course)
print("%-12s%-12s%-12s%-12s%-12s%-12s" % ("No", "Name", "Chinese", "Math", "English", "Total"))
index = []
for m in self.marks:
index.append(m)
for i in range(len(index)):
for j in range(i + 1, len(index)):
if course == "chinese":
if index[i].chinese < index[j].chinese:
k = index[i]
index[i] = index[j]
index[j] = k
elif course == "math":
if index[i].math < index[j].math:
k = index[i]
index[i] = index[j]
index[j] = k
elif course == "english":
if index[i].english < index[j].english:
k = index[i]
index[i] = index[j]
index[j] = k
elif course == "total":
if index[i].chinese + index[i].math + index[i].english < index[j].chinese + index[j].math + index[
j].english:
k = index[i]
index[i] = index[j]
index[j] = k
for m in index:
m.show()
print()
def printChar(self, s, n):
print("%-12s%-6d" % (s, n), end=":")
if len(self.marks) > 0:
n = n * 100 // len(self.marks)
for i in range(n):
print("*", end="")
print()
def rangeBy(self, course):
global A
n0059 = 0
n6069 = 0
n7079 = 0
n8089 = 0
n90100 = 0
course = course.lower()
for i in range(len(self.marks)):
if course == "chinese":
A = self.marks[i].chinese
elif course == "math":
A = self.marks[i].math
elif course == "english":
A = self.marks[i].english
m=A
if m < 60:
n0059 += 1
elif m < 70:
n6069 += 1
elif m < 80:
n7079 += 1
elif m < 90:
n8089 += 1
else:
n90100 += 1
print(course + "各个分数段人数")
# print("[0,59]:",n0059," [60,69]:",n6069," [70,79]:",n7079," [80,89]:",n8089," [90,100]:",n90100)
self.printChar("[0,59]", n0059)
self.printChar("[60,69]", n6069)
self.printChar("[70,79]", n7079)
self.printChar("[80,89]", n8089)
self.printChar("[90,100]", n90100)
print()
def statistics(self):
if len(self.marks) == 0:
return
ca = 0
cs = 0
ma = 0
ms = 0
ea = 0
es = 0
for m in self.marks:
ca += m.chinese
cs += m.chinese * m.chinese
ma += m.math
ms += m.math * m.math
ea += m.english
es += m.english * m.english
ca = ca / len(self.marks)
cs = math.sqrt(cs / len(self.marks) - ca * ca)
ma = ma / len(self.marks)
ms = math.sqrt(ms / len(self.marks) - ma * ma)
ea = ea / len(self.marks)
es = math.sqrt(es / len(self.marks) - ea * ea)
print("语文平均分:%.2f 语文均方差:%.2f" % (ca, cs))
print("数学平均分:%.2f 数学均方差:%.2f" % (ma, ms))
print("英语平均分:%.2f 英语均方差:%.2f" % (ea, es))
print()
def saveMarks(self):
try:
fobj = open("marks.txt", "wt")
for m in self.marks:
fobj.write(m.no + "\n")
fobj.write(m.name + "\n")
fobj.write(str(m.chinese) + "\n")
fobj.write(str(m.math) + "\n")
fobj.write(str(m.english) + "\n")
fobj.close()
except Exception as e:
print(e)
def readMarks(self):
self.marks = []
if not os.path.exists("marks.txt"):
return
try:
fobj = open("marks.txt", "rt")
while True:
try:
no = fobj.readline().strip("\n")
if no == "":
break
name = fobj.readline().strip("\n")
m = fobj.readline().strip("\n")
m = int(m)
if m < 0 or m > 100:
raise Exception("无效成绩")
chinese = m
m = fobj.readline().strip("\n")
m = int(m)
if m < 0 or m > 100:
raise Exception("无效成绩")
math = m
m = fobj.readline().strip("\n")
m = int(m)
if m < 0 or m > 100:
raise Exception("无效成绩")
english = m
self.marks.append(Mark(no, name, chinese, math, english))
except Exception as ea:
print(ea)
fobj.close()
except Exception as eb:
print(eb)
def process(self):
self.readMarks()
while True:
s = input(">")
s = s.lower()
s = s.split(" ")
if s[0] == "show":
self.show()
elif s[0] == "order":
if len(s) > 1:
self.orderBy(s[1])
else:
print("格式示范: order chinese")
elif s[0] == "insert":
m = self.enter()
if m:
self.insert(m)
elif s[0] == "update":
print("提示:不输入直接回车的字段不更新")
m = self.enter()
if m:
self.update(m)
elif s[0] == "delete":
no = input("学号:").strip()
if no != "":
self.delete(no)
else:
print("学号不能为空")
elif s[0] == "range":
if len(s) > 1:
self.rangeBy(s[1])
else:
print("格式示范: range chinese")
elif s[0] == "stat":
self.statistics()
elif s[0] == "exit":
break
else:
print("有效的命令:")
print("show")
print("insert")
print("update")
print("delete")
print("stat")
print("order chinese/math/english/total")
print("range chinese/math/english")
print("exit")
self.saveMarks()
def createMarks(self):
n = random.randint(10, 20)
self.marks = []
for i in range(n):
s = str(i + 1)
while len(s) < 5:
s = "0" + s
name = chr(ord("a") + random.randint(0, 26))
chinese = random.randint(0, 100)
math = random.randint(0, 100)
english = random.randint(0, 100)
self.marks.append(Mark(s, name, chinese, math, english))
with open("marks.txt", "w") as File:
A = File.write(str(self.marks))
sm = StudentMark()
print("请确定自己是否随机获取数据(默认没有数据,随机之后数据重新刷新,原来数据不存在,请慎重!")
N = input("是否确定yes/其他:").lower()
if N == "yes":
sm.createMarks()
sm.saveMarks()
sm.process()
结果:
show:
insert:
update:
delete:
stat:
range:
order:
最后
还有许多的功能在这里没有展示,需要自己探索,只有不断的探索,才会有更多的收获!