前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python+Excel数据分析实战:军事体能考核成绩评定(九)评定个人等级

Python+Excel数据分析实战:军事体能考核成绩评定(九)评定个人等级

原创
作者头像
张国平
修改2021-02-19 17:57:35
5.2K0
修改2021-02-19 17:57:35
举报

这一章我们实现个人军事训练成绩的等级评定,根据单杠、仰卧起坐、蛇形跑、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”如下:

海拔3701米3类人员的计算结果
海拔3701米3类人员的计算结果

到此,军事体能考核成绩评定系统的所有功能已经做完,同时今天也用9篇文章把制作经验梳理完毕,非常高兴!

这是我毕业至今第二次独立完成的软件系统,第一次是2013年用C++做了基于Oracle数据库的《休假人员管理系统》,非常的不完善,后来也没有继续开发,因为我大学专业是网络工程,大学编程学得不好,工作中也不需要编程,我都快放弃编程了,但是2018年开始的树莓派学习,让我重新学习了一门编程语言python,至今3年的树莓派编程开发让我重新树立了成为程序员的信心。

感谢号哥给了我一个做军事体能考核成绩评定项目的灵感,在号哥的鼓励下找到合适的python+Excel技术框架。感谢UP主路过嘅蒙面超V,在他的教程(基础+巩固)小白零基础开始用Python处理Excel数据一个月的学习后,2020年12月底开始编程,在1月底完成了这个小项目的制作。

希望这个小系统能帮到那千百个辛苦的文书,节省你们宝贵的统计计算时间,让军事训练考核更高效,也算是我离开这个集体前做的一件有意义的事情。

军事体能考核成绩评定系统下载

军事体能考核成绩评定系统全套Python源码下载

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基本情况
  • 二、代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档