专栏首页张国平_玩转树莓派Python+Excel数据分析实战:军事体能考核成绩评定(九)评定个人等级
原创

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

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

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

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

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

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

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python+Excel数据分析实战:军事体能考核成绩评定(八)体型评定

    这一章我们实现男子和女子体型的评定,原始数据是身高、体重或者体脂百分比。作为军人,达到体型合格是基本要求,也是军人形象气质的基础,相关规定:体型合格就不用考虑单...

    张国平
  • Python+Excel数据分析实战:军事体能考核成绩评定(八)体型评定

    这一章我们实现男子和女子体型的评定,原始数据是身高、体重或者体脂百分比。作为军人,达到体型合格是基本要求,也是军人形象气质的基础,相关规定:体型合格就不用考虑单...

    张国平
  • 树莓派综合项目2:智能小车(五)红外避障

    树莓派综合项目2:智能小车(二)tkinter图形界面控制,实现了本地图形界面控制小车的前进后退、转向和原地转圈。

    张国平
  • Blazor 修仙之旅 - 启动页

    APP 启动图,对于大家来说一定不陌生,它除了加载广告等信息,还有一个作用就是让APP有时间后台加载资源并渲染界面,以便启动图结束后给你展现的是一个渲染好的界面...

    晓晨
  • 实现浅拷贝与深拷贝

    Js包含基本数据类型与引用数据类型两种不同的数据类型的值,深拷贝与浅拷贝的概念只存在于引用数据类型。对于引用类型,浅拷贝是拷贝了指向这个对象堆内存的指针,是拷贝...

    WindrunnerMax
  • F5 BIG-IP Cookie 信息泄露利用工具

    F5 BIG-IP LTM 官方名称为本地流量管理器,也叫网络负载均衡器,是F5公司的新一代网络管理产品。BIG-IP LTM 可做4-7层负载均衡,具有负载均...

    字节脉搏实验室
  • 莫里航海图,最早的大数据实践

    大数据文摘
  • 雷军:我这十年来的思考

    那些成功做出独角兽企业的创业者,这类的人大多都是天生的,他们非常清楚自己想要什么,可以为了等这个机会,默默付出别人难以想象的代价,最后就只是为了这一仗。

    IT派
  • 美女教授带你从统计学视角看转录组分析

    分子生物学的中心法则自1958年由Francis Crick提出到今年正好60周年,它描述了“DNA制造RNA,RNA制造蛋白质”的遗传信息的标准流程 [1]。...

    生信宝典
  • 微软提供的XP启动加速软件(已验证)

    最近挂了两个硬盘,启动速度很慢,有一个方法是开机箱设置主从盘,麻烦。在网上发现一款微软提供的启动加速软件,用了一下,效果很明显。原理是记录了启动过程为一个映像文...

    贰师兄TEN

扫码关注云+社区

领取腾讯云代金券