Python+Excel数据分析实战:军事体能考核成绩评定(九)评定个人等级
这一章我们实现个人军事训练成绩的等级评定,根据单杠、仰卧起坐、蛇形跑、3公里跑成绩以及体型,综合评定个人等级。相关规定:体型合格就不用考虑单项不合格的情况,只看通用训练科目成绩总分(单杠、仰卧起坐、蛇形跑、3公里跑4项总成绩);体型不合格,就不能再有单项不及格的情况,若有单项不及格,不管总分多少,直接总评不合格。一、基本情况个人军事体育训练成绩评定有关规定:个人成绩采用 “特1级、特2级、特3级、
这一章我们实现个人军事训练成绩的等级评定,根据单杠、仰卧起坐、蛇形跑、3公里跑成绩以及体型,综合评定个人等级。
相关规定:体型合格就不用考虑单项不合格的情况,只看通用训练科目成绩总分(单杠、仰卧起坐、蛇形跑、3公里跑4项总成绩);体型不合格,就不能再有单项不及格的情况,若有单项不及格,不管总分多少,直接总评不合格。
一、基本情况
个人军事体育训练成绩评定有关规定:
个人成绩采用 “特1级、特2级、特3级、优秀、良好、及格 、不及格”七级制评定。新入伍人员 、文职人员本系统不涉及。
体型采用“合格、不合格”两级制评定。通用训练科目按照分数评定,设及格分数下限(三类人员55分、二类人员60分、一类人员65分),不设分数上限,成绩以各课目得分之和评定;专项训练课目组成绩采用“优秀、良好、及格、不及格”四级制评定,最低训练科目成绩为科目组成绩。体型不合格、单项科目成绩不及格者,个人军事训练成绩评定为不及格。(这里注意,顿号表并列,是体型不合格且单项科目成绩不及格者的意思)
1.一、二类人员个人成绩评定。体型合格,专项训练科目组成绩达到及格以上,依据通用训练课目成绩总分,对照个人军事体育训练成绩评定标准,评定个人等级。
2.三类人员个人成绩评定。体型合格,依据通用训练科目成绩总分,对照个人军事体育训练成绩评定标准,评定个人等级。
3.特等成绩评定。各类人员参评特级均需完成一个专项训练科目组考核(三类人员可在一、二类人员专项科目组中选取),按照相应年龄段标准评定成绩且达到良好以上。40岁以上人员参评特级需进行相应类别专项训练课目组考核,成绩按最高年龄段标准评定并达到良好以上。**达到特级者,颁发军事体育训练特级证书。**在历史上,这可谓前所未有。
因为专项训练科目是随机抽考,项目也很多,本系统没有纳入,所以一、二类人员个人成绩评定按照三类人员一样,没有涉及和考虑专项训练科目成绩,只要体型合格,依据通用训练科目成绩总分,对照个人军事体育训练成绩评定标准,评定个人等级。
涉及的数据较少,就没有通过Python的openpyxl模块读取标准表数据,在计算模块里直接引用标准数据。
二、代码实现
1.个人等级评定计算写成了一个带6个参数(3公里、仰卧起坐、蛇形跑、引体向上、体型、人员类别)的函数,模块文件名为overall_assessment.py,先计算不及格课目数和体型,再区分人员类别计算总分,返回个人等级。
# 通过体型、3公里、仰卧起坐、蛇形跑、引体向上各项成绩综合计算,评定个人军事训练成绩
def overall_assessment(a,b,c,d,body_type,staff_type):
n = 0 # n用来计算不及格课目的数量
if a == 0:
n+=1
if b == 0:
n += 1
if c == 0:
n += 1
if d == 0:
n += 1
if n > 0 and body_type == '不合格':
return '不合格' # 体型不合格、单项科目成绩不及格者,评定为不及格。
total = a + b + c + d
if staff_type == '一类':
if total < 260:
return '不及格'
elif 260 <= total < 340:
return '及格'
elif 340 <= total < 380:
return '良好'
elif 380 <= total < 440:
return '优秀'
elif 440 <= total < 480:
return '特3级'
elif 480 <= total < 500:
return '特2级'
elif 500 <= total:
return '特1级'
if staff_type == '二类':
if total < 240:
return '不及格'
elif 240 <= total < 320:
return '及格'
elif 320 <= total < 360:
return '良好'
elif 360 <= total < 440:
return '优秀'
elif 440 <= total < 480:
return '特3级'
elif 480 <= total < 500:
return '特2级'
elif 500 <= total:
return '特1级'
if staff_type == '三类':
if total < 220:
return '不及格'
elif 220 <= total < 300:
return '及格'
elif 300 <= total < 340:
return '良好'
elif 340 <= total < 440:
return '优秀'
elif 440 <= total < 480:
return '特3级'
elif 480 <= total < 500:
return '特2级'
elif 500 <= total:
return '特1级'
2.为方便软件使用者能反馈问题,也让使用者看到计算完成的提示,我设计了一个带进度条的小窗口,并显示一些软件介绍和联系方式。使用python内置的tkinter模块,比较简单。
import tkinter as tk
import time
class Gui:
def __init__(self,frame):
self.window = frame
self.window.title('通用训练课目考核成绩计算')
curWidth = 400 # 窗口宽度
curHight = 300 # 窗口高度
# 获取屏幕宽度和高度
scn_w, scn_h = self.window.maxsize()
# print(scn_w, scn_h)
# 计算中心坐标
cen_x = (scn_w - curWidth) / 2
cen_y = (scn_h - curHight) / 2
# print(cen_x, cen_y)
# 设置窗口初始大小和位置
self.size_xy = '%dx%d+%d+%d' % (curWidth, curHight, cen_x, cen_y) # 注意这里的x是英文字母x
#self.window.geometry(size_xy) # 设置窗口大小
'''定义进度条'''
tk.Label(self.window, text='计算进度:',font=("华文行楷", 15),fg='red').place(x=20, y=30)
self.canvas = tk.Canvas(self.window, width=200, height=22, bg="white")
self.canvas.place(x=110, y=30)
'''定义标签'''
message = tk.Message(self.window,text='欢迎使用体能成绩计算系统,此版本为V1.0.0,为最初的原始版本,'
'可能有许多错误和不完善的地方,请谅解。\t若你在使用后发现任何错误或者有任何建议,'
'非常感谢你能够致电开发者,你反馈的任何问题,都会促进该系统的进化!',width=380)
message.place(x=10, y=130)
label1 = tk.Label(self.window,text='联系人:张国平',font=("华文行楷", 15)).place(x=10, y=230)
label2 = tk.Label(self.window,text='电\000\000话:18989047020',font=("华文行楷", 15)).place(x=10, y=250)
# btn_download = tk.Button(self.window, text='退出', command=self.window.quit)
# btn_download.place(x=330, y=50)
#self.window.mainloop()
# 显示下载进度
def progress(self,percent):
# 填充进度条
fill_line = self.canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill="green") # 画矩形正方形
n = 200 * percent # 200是矩形的像素宽度
self.canvas.coords(fill_line, (0, 0, n, 60))
if percent == 1:
btn_download = tk.Button(self.window, text='退出', command=self.window.quit)
btn_download.place(x=180, y=100)
tk.Label(self.window, text='计算已完成!', font=("华文行楷", 15), fg='red').place(x=150, y=68)
self.window.update()
if __name__ == "__main__": # 测试本模块
window = tk.Tk()
gui = Gui(window)
window.geometry(gui.size_xy) # 设置窗口大小
gui.progress(0.4)
time.sleep(1)
gui.progress(0.9)
time.sleep(1)
gui.progress(1)
window.mainloop()
3.对主程序training_performance.py进行修改。根据性别,进行不同的实例化;判断性别后,先计算单杠成绩,接着计算仰卧起坐成绩,再计算蛇形跑成绩、3公里成绩,最后计算体型,个人成绩评定,分别写入表中换算成绩的相应位置。这里对小窗口的调用,可能使用多线程技术会好一点,时间紧我还没来得及去学习,有兴趣的同学可以自行试试。
import openpyxl
import datetime as dt
import tkinter as tk
from gui import Gui
from age_computing import age_computing # 导入年龄计算模块
from pullup_male import Pullup_standard_data # 导入男子引体向上成绩计算模块
from flex_arm_hang_female import Flex_arm_hang_standard_data # 导入女子单杠曲臂悬垂的成绩计算模块
from situp_male import Situp_male_standard_data # 导入男子仰卧起坐成绩计算模块
from situp_female import Situp_female_standard_data # 导入女子仰卧起坐成绩计算模块
from serpentine_run_male import Serpentine_run_male_standard_data # 导入男子蛇形跑成绩计算模块
from serpentine_run_female import Serpentine_run_female_standard_data # 导入女子蛇形跑成绩计算模块
from highland2001up_3km_male import Highland2001up3kmMaleStandardData # 导入男子高原2001~3000,3000米成绩计算模块
from highland3001up_3km_male import Highland3001up3kmMaleStandardData # 导入男子高原3001~4000,3000米成绩计算模块
from highland2001up_3km_female import Highland2001up3kmFemaleStandardData # 导入女子高原2001~3000,3000米成绩计算模块
from highland3001up_3km_female import Highland3001up3kmFemaleStandardData # 导入女子高原2001~3000,3000米成绩计算模块
from flatland_3km import Flatland3kmStandardData # 导入男女平原3000米成绩计算模块
from bodily_form import BodilyForm # 导入男女体型计算模块
from overall_assessment import overall_assessment
# 生成显示界面
window = tk.Tk()
gui = Gui(window)
window.geometry(gui.size_xy) # 设置窗口大小
percent = 0
gui.progress(percent)
wb=openpyxl.load_workbook('通用训练课目考核成绩计算.xlsx')
ws_training_score = wb['体能考核成绩']
ws_personnel_parameters = wb['人员参数设置']
col_parameters = [c.value for c in list(ws_personnel_parameters.columns)[1][1:]]
staff_type = col_parameters[0] #人员类别
elevation = col_parameters[1] #地区海拔
if staff_type == '三类':
lowest_score = 55
if staff_type == '二类':
lowest_score = 60
if staff_type == '一类':
lowest_score = 65
pullup_sd = Pullup_standard_data() # 实例化男子引体向上成绩计算
flexarmhang_sd = Flex_arm_hang_standard_data() # 实例化女子单杠曲臂悬垂成绩计算
situp_male = Situp_male_standard_data() # 实例化男子仰卧起坐成绩计算
situp_female = Situp_female_standard_data() # 实例化男子仰卧起坐成绩计算
serpentine_run_male = Serpentine_run_male_standard_data() # 实例化男子蛇形跑成绩计算
serpentine_run_female = Serpentine_run_female_standard_data() # 实例化女子蛇形跑成绩计算
bodily_form_male = BodilyForm('男') # 实例化男子体型成绩计算
bodily_form_female = BodilyForm('女') # 实例化女子体型成绩计算
if elevation in range(0,2001):
long_distance_run_male = Flatland3kmStandardData('男') # 实例化男子平原3Km米跑计算模块
long_distance_run_female = Flatland3kmStandardData('女') # 实例化女子平原3Km米跑计算模块
elif elevation in range(2001,3001):
long_distance_run_male = Highland2001up3kmMaleStandardData(elevation) # 实例化男子高原海拔2001~3000米,3Km米跑计算模块
long_distance_run_female = Highland2001up3kmFemaleStandardData(elevation) # 实例化女子高原海拔2001~3000米,3Km米跑计算模块
elif elevation in range(3001,4001):
long_distance_run_male = Highland3001up3kmMaleStandardData(elevation) # 实例化男子高原海拔3001~4000米,3Km米跑计算模块
long_distance_run_female = Highland3001up3kmFemaleStandardData(elevation) # 实例化女子高原海拔3001~4000米,3Km米跑计算模块
rngs = ws_training_score.iter_rows(min_row=6)
total_rows = ws_training_score.max_row - 5
print(total_rows)
n = 0
for row in rngs:
n += 1
gender = row[4].value # 性别
pullup = row[11].value # 单杠原始数量
situp = row[7].value # 仰卧起坐原始数量
serpentine_run = row[9].value # 蛇形跑原始数量
long_distance_run = row[13].value # 3Km跑原始时长
height = row[16].value # 身高
weight = row[17].value # 体重
percent_body_fat = row[18].value # 体脂百分比
if row[5].value:
#print(row[5].value)
age = age_computing(row[5].value) #由出生日期计算年龄,精确到天
row[6].value = age
if gender == '男':
if row[6].value != None: # 年龄不能为空
if pullup != None: # 单杆原始数不能为空
score_pullup = pullup_sd.pullup_score_computing(age, pullup) # 计算男子单杠或俯卧撑成绩
#print(row[0].value,pullup,row[12].value) # 测试
if not score_pullup < lowest_score:
row[12].value = score_pullup
else:
row[12].value = 0
if situp != None: # 仰卧起坐原始数不能为空
score_situp = situp_male.situp_male_score_computing(age, situp) # 计算男子仰卧起坐成绩
#print(row[0].value, situp, row[8].value)
if not score_situp < lowest_score:
row[8].value = score_situp
else:
row[8].value = 0
if serpentine_run != None: # 蛇形跑原始数不能为空
score_serpentine_run = serpentine_run_male.serpentine_run_male_score_computing(age, serpentine_run) # 计算男子蛇形跑成绩
#print(row[0].value, serpentine_run, row[10].value)
if not score_serpentine_run < lowest_score:
row[10].value = score_serpentine_run
else:
row[10].value = 0
if long_distance_run != None: # 3Km跑原始时长不能为空
score_long_run = long_distance_run_male.longrun_score_computing(age, long_distance_run) # 计算男子3Km跑成绩
#print(row[0].value, long_distance_run, row[14].value)
if not score_long_run < lowest_score:
row[14].value = score_long_run
else:
row[14].value = 0
if height !=None and weight !=None: #身高体重不为空时
body_mass_index = weight / (height * height)
row[19].value = bodily_form_male.bodilyform_score_computing(age,body_mass_index,percent_body_fat)
if row[12].value !=None and row[8].value !=None and row[10].value !=None and row[14].value !=None \
and row[19].value !=None: # 计算总评定成绩
row[20].value = overall_assessment(row[12].value,row[8].value,row[10].value,row[14].value,\
row[19].value,staff_type)
row[15].value = row[12].value + row[8].value + row[10].value + row[14].value
elif gender == '女':
if row[6].value != None:
if pullup != None: # 单杆原始数不能为空
score_pullup = flexarmhang_sd.flex_arm_hang_score_computing(age, pullup) # 女子曲臂悬垂或俯卧撑成绩计算
#print(row[0].value,pullup, row[12].value)
if not score_pullup < lowest_score:
row[12].value = score_pullup
else:
row[12].value = 0
if situp != None: # 仰卧起坐原始数不能为空
score_situp = situp_female.situp_female_score_computing(age, situp) # 计算女子仰卧起坐成绩
#print(row[0].value, situp, row[8].value)
if not score_situp < lowest_score:
row[8].value = score_situp
else:
row[8].value = 0
if serpentine_run != None: # 蛇形跑原始数不能为空
score_serpentine_run = serpentine_run_female.serpentine_run_female_score_computing(age, serpentine_run) # 计算女子蛇形跑成绩
#print(row[0].value, serpentine_run, row[10].value)
if not score_serpentine_run < lowest_score:
row[10].value = score_serpentine_run
else:
row[10].value = 0
if long_distance_run != None: # 3Km跑原始时长不能为空
score_long_run = long_distance_run_female.longrun_score_computing(age, long_distance_run) # 计算女子3Km跑成绩
#print(row[0].value, long_distance_run, row[14].value)
if not score_long_run < lowest_score:
row[14].value = score_long_run
else:
row[14].value = 0
if height !=None and weight !=None: #身高体重不为空时
body_mass_index = weight / (height * height)
row[19].value = bodily_form_female.bodilyform_score_computing(age,body_mass_index,percent_body_fat)
if row[12].value != None and row[8].value != None and row[10].value != None and row[14].value != None \
and row[19].value != None: # 计算总评定成绩
row[20].value = overall_assessment(row[12].value, row[8].value, row[10].value, row[14].value,\
row[19].value, staff_type)
row[15].value = row[12].value + row[8].value + row[10].value + row[14].value
else: # 性别输入有误
print('序号%d %s 的性别填写错误'%(row[0].value,row[1].value))
# 界面显示计算进度
percent = round(n/total_rows,2)
gui.progress(percent)
wb.save('计算结果.xlsx')
print('计算已完成!')
window.mainloop()
运行后,生成文件“计算结果.xlsx”如下:
到此,军事体能考核成绩评定系统的所有功能已经做完,同时今天也用9篇文章把制作经验梳理完毕,非常高兴!
这是我毕业至今第二次独立完成的软件系统,第一次是2013年用C++做了基于Oracle数据库的《休假人员管理系统》,非常的不完善,后来也没有继续开发,因为我大学专业是网络工程,大学编程学得不好,工作中也不需要编程,我都快放弃编程了,但是2018年开始的树莓派学习,让我重新学习了一门编程语言python,至今3年的树莓派编程开发让我重新树立了成为程序员的信心。
感谢号哥给了我一个做军事体能考核成绩评定项目的灵感,在号哥的鼓励下找到合适的python+Excel技术框架。感谢UP主路过嘅蒙面超V,在他的教程(基础+巩固)小白零基础开始用Python处理Excel数据一个月的学习后,2020年12月底开始编程,在1月底完成了这个小项目的制作。
希望这个小系统能帮到那千百个辛苦的文书,节省你们宝贵的统计计算时间,让军事训练考核更高效,也算是我离开这个集体前做的一件有意义的事情。
更多推荐
所有评论(0)