这一章我们实现男子和女子30米x2蛇形跑成绩的计算,单位是数值,多少秒,全年龄段考核内容都是30米x2蛇形跑,相对也简单。

一、基本情况

通过分析男女30米x2蛇形跑“成绩计算标准表”,发现标准表也只是参照标准表,不是连续的全覆盖。比如标准中24岁以下,只规定了男子蛇形跑18.1秒的成绩为100分,18.7秒的成绩为95分,那么中间的情况多少分呢?

还是只能是我们根据公平原则去补充,在18.1秒、18.7秒的成绩之间去取平均分,数据量比较小,NO!数据量不算小,也不大,看下图就知道!

这时我也想到3公里测试的原始成绩跨度更大,使用这种手工添加补充的办法已经落后了,不过新算法再酝酿当中,也不复杂。本次我也选择手工计算,补充到成绩计算标准表里,精确到小数点后一位。

同样,通过Python的openpyxl模块读取补充成绩计算标准表中的数据,制成 {原始蛇形跑时长:分数} 格式的字典,以供主程序查询出换算成绩,再写入成绩表的对应位置中。

二、代码实现

1.我把计算男子和女子蛇形跑的文件分开,分别放入单独的模块中,男子的文件命名为serpentine_run_male.py。因为男女蛇形跑读取不同的工作簿中的标准表,分开做也方便。计算函数的原理与前面的文章相同,增加了一项判定,若原始数据类型不是整型和浮点型,则不执行计算,打印错误。

# 男子蛇形跑的成绩计算
# 从工作表“男子蛇形跑标准”中读取数据import openpyxl
class Serpentine_run_male_standard_data():wb = openpyxl.load_workbook('通用训练课目考核成绩计算.xlsx')ws_Serpentine_run_male = wb['男子30米蛇形跑标准']age24 = {}     # 24岁以下,{原始男子蛇形跑秒数:分数}age25_27 = {}  # 25~27岁,{原始男子蛇形跑秒数:分数}age28_30 = {}age31_33 = {}age34_36 = {}age37_39 = {}age40_42 = {}  # 40岁以上,{原始男子蛇形跑秒数:分数}age43_45 = {}  # 43~45岁,{原始男子蛇形跑秒数:分数}age46_48 = {}age49_51 = {}age52_54 = {}age55_57 = {}age58_59 = {}rngs = ws_Serpentine_run_male.iter_rows(min_row=3,max_row=64,min_col=1,max_col=26)# 生成{原始男子蛇形跑秒数:分数}的字典for row in rngs:#print([c.value for c in row])age24[row[1].value] = row[0].valueage25_27[row[3].value] = row[2].valueage28_30[row[5].value] = row[4].valueage31_33[row[7].value] = row[6].valueage34_36[row[9].value] = row[8].valueage37_39[row[11].value] = row[10].valueage40_42[row[13].value] = row[12].valueage43_45[row[15].value] = row[14].valueage46_48[row[17].value] = row[16].valueage49_51[row[19].value] = row[18].valueage52_54[row[21].value] = row[20].valueage55_57[row[23].value] = row[22].valueage58_59[row[25].value] = row[24].value# print('-----age24-----') # 打印数据以便检查# for m in age24.items():#     print(m)# print('-----age25_27-----')# for m in age25_27.items():#     print(m)# print('-----age28_30-----')# for m in age28_30.items():#     print(m)# print('-----age31_33-----')# for m in age31_33.items():#     print(m)# print('-----age34_36-----')# for m in age34_36.items():#     print(m)# print('-----age37_39-----')# for m in age37_39.items():#     print(m)# print('-----age40_42-----')  # 打印数据以便检查# for m in age40_42.items():#     print(m)# print('-----age43_45-----')# for m in age43_45.items():#     print(m)# print('-----age46_48-----')# for m in age46_48.items():#     print(m)# print('-----age49_51-----')# for m in age49_51.items():#     print(m)# print('-----age52_54-----')# for m in age52_54.items():#     print(m)# print('-----age55_57-----')# for m in age55_57.items():#     print(m)# print('-----age58_59-----')# for m in age58_59.items():#     print(m)def serpentine_run_male_score_computing(self,age,original_amount):'''根据年龄,实际蛇形跑秒数,计算所得分数'''if type(original_amount) is float or int:  # 核查数据是否是整型if age <= 24:if original_amount > 21.2:return 0elif original_amount < 18.1:return 100+181 - original_amount*10  # 防止小数计算出现不准确的情况elif 18.1 <= original_amount <= 21.2:return self.age24[original_amount]elif 25 <= age <= 27:if original_amount > 21.5:return 0elif original_amount < 18.3:return 100+183 - original_amount*10elif 18.3 <= original_amount <= 21.5:return self.age25_27[original_amount]elif 28 <= age <= 30:if original_amount > 21.9:return 0elif original_amount < 18.5:return 100+185 - original_amount*10elif 18.5 <= original_amount <= 21.9:return self.age28_30[original_amount]elif 31 <= age <= 33:if original_amount > 22.2:return 0elif original_amount < 18.7:return 100+187 - original_amount*10elif 18.7 <= original_amount <= 22.2:return self.age31_33[original_amount]elif 34 <= age <= 36:if original_amount > 22.6:return 0elif original_amount < 18.9:return 100+189 - original_amount*10elif 18.9 <= original_amount <= 22.6:return self.age34_36[original_amount]elif 37 <= age <= 39:if original_amount > 22.7:return 0elif original_amount < 19.1:return 100 + 191 - original_amount*10elif 19.1 <= original_amount <= 22.7:return self.age37_39[original_amount]# 40~59elif 40 <= age <= 42:if original_amount > 22.9:return 0elif original_amount < 19.3:return 100 + 193 - original_amount*10elif 19.3 <= original_amount <= 22.9:return self.age40_42[original_amount]elif 43 <= age <= 45:if original_amount > 23.3:return 0elif original_amount < 19.5:return 100 + 195 - original_amount*10elif 19.5 <= original_amount <= 23.3:return self.age43_45[original_amount]elif 46 <= age <= 48:if original_amount > 23.9:return 0elif original_amount < 19.7:return 100 + 197 - original_amount*10elif 19.7 <= original_amount <= 23.9 :return self.age46_48[original_amount]elif 49 <= age <= 51:if original_amount > 24:return 0elif original_amount < 19.9:return 100 + 199 - original_amount*10elif 19.9 <= original_amount <= 24 :return self.age49_51[original_amount]elif 52 <= age <= 54:if original_amount > 24.5:return 0elif original_amount < 20.6:return 100 + 206 - original_amount*10elif 20.6 <= original_amount <= 24.5:return self.age52_54[original_amount]elif 55 <= age <= 57:if original_amount > 24.8:return 0elif original_amount < 21.1:return 100 + 211 - original_amount*10elif 21.1 <= original_amount <= 24.8:return self.age55_57[original_amount]elif 58 <= age <= 59:if original_amount > 25.4:return 0elif original_amount < 21.3:return 100 + 213 - original_amount*10elif 21.3 <= original_amount <= 25.4:return self.age58_59[original_amount]else:print('ERROR:男子蛇形跑,原始成绩的数据类型须为整型(int)或者浮点型(float)类型')if __name__ == "__main__":   # 测试本模块serpentine_run_male_std = Serpentine_run_male_standard_data()result = serpentine_run_male_std.serpentine_run_male_score_computing(35,18)print(result)

2.女子仰卧起坐的文件命名为serpentine_run_female.py,除了读取的工作簿不同,其它内容与男子大体相同。只是在参照标准编写程序时要特别细心,设置临界数值时不能出错,比如24岁以下女子大于22.6秒0分,20秒100分,但是25岁~27岁是大于22.9秒0分,20.3秒100分。这种变化也可以通过编程实现自动化计算,虽变化次数不多,但设计算法的复杂度会增加很多,这里有改进的空间,可以探索。一切相似重复的代码段都可以使用函数替代吧。

# 女子蛇形跑的成绩计算
# 从工作表“女子蛇形跑标准”中读取数据import openpyxl
class Serpentine_run_female_standard_data():wb = openpyxl.load_workbook('通用训练课目考核成绩计算.xlsx')ws_Serpentine_run_female = wb['女子30米蛇形跑标准']age24 = {}     # 24岁以下,{原始女子蛇形跑秒数:分数}age25_27 = {}  # 25~27岁,{原始女子蛇形跑秒数:分数}age28_30 = {}age31_33 = {}age34_36 = {}age37_39 = {}age40_42 = {}  # 40岁以上,{原始女子蛇形跑秒数:分数}age43_45 = {}  # 43~45岁,{原始女子蛇形跑秒数:分数}age46_48 = {}age49_51 = {}age52_54 = {}age55_57 = {}age58_59 = {}rngs = ws_Serpentine_run_female.iter_rows(min_row=3,max_row=29,min_col=1,max_col=14)# 生成{原始女子蛇形跑秒数:分数}的字典for row in rngs:#print([c.value for c in row])age24[row[1].value] = row[0].valueage25_27[row[2].value] = row[0].valueage28_30[row[3].value] = row[0].valueage31_33[row[4].value] = row[0].valueage34_36[row[5].value] = row[0].valueage37_39[row[6].value] = row[0].valueage40_42[row[7].value] = row[0].valueage43_45[row[8].value] = row[0].valueage46_48[row[9].value] = row[0].valueage49_51[row[10].value] = row[0].valueage52_54[row[11].value] = row[0].valueage55_57[row[12].value] = row[0].valueage58_59[row[13].value] = row[0].value# print('-----age24-----') # 打印数据以便检查# for m in age24.items():#     print(m)# print('-----age25_27-----')# for m in age25_27.items():#     print(m)# print('-----age28_30-----')# for m in age28_30.items():#     print(m)# print('-----age31_33-----')# for m in age31_33.items():#     print(m)# print('-----age34_36-----')# for m in age34_36.items():#     print(m)# print('-----age37_39-----')# for m in age37_39.items():#     print(m)## print('-----age40_42-----')  # 打印数据以便检查# for m in age40_42.items():#     print(m)# print('-----age43_45-----')# for m in age43_45.items():#     print(m)# print('-----age46_48-----')# for m in age46_48.items():#     print(m)# print('-----age49_51-----')# for m in age49_51.items():#     print(m)# print('-----age52_54-----')# for m in age52_54.items():#     print(m)# print('-----age55_57-----')# for m in age55_57.items():#     print(m)# print('-----age58_59-----')# for m in age58_59.items():#     print(m)def serpentine_run_female_score_computing(self,age,original_amount):'''根据年龄,实际蛇形跑秒数,计算所得分数'''if type(original_amount) is float or int:  # 核查数据是否是整型if age <= 24:if original_amount > 22.6:return 0elif original_amount < 20:return 100+200 - original_amount*10  # 防止小数计算出现不准确的情况elif 20 <= original_amount <= 22.6:return self.age24[original_amount]elif 25 <= age <= 27:if original_amount > 22.9:return 0elif original_amount < 20.3:return 100+203 - original_amount*10elif 20.3 <= original_amount <= 22.9:return self.age25_27[original_amount]elif 28 <= age <= 30:if original_amount > 23.2:return 0elif original_amount < 20.6:return 100+206 - original_amount*10elif 20.6 <= original_amount <= 23.2:return self.age28_30[original_amount]elif 31 <= age <= 33:if original_amount > 23.5:return 0elif original_amount < 20.9:return 100+round((20.9 - original_amount),1)*10  # 防止小数计算出现不准确的情况elif 20.9 <= original_amount <= 23.5:return self.age31_33[original_amount]elif 34 <= age <= 36:if original_amount > 23.8:return 0elif original_amount < 21.2:return 100+212 - original_amount*10elif 21.2 <= original_amount <= 23.8:return self.age34_36[original_amount]elif 37 <= age <= 39:if original_amount > 24.1:return 0elif original_amount < 21.5:return 100+215 - original_amount*10elif 21.5 <= original_amount <= 24.1:return self.age37_39[original_amount]# 40~59elif 40 <= age <= 42:if original_amount > 24.4:return 0elif original_amount < 21.8:return 100 + 218 - original_amount*10elif 21.8 <= original_amount <= 24.4:return self.age40_42[original_amount]elif 43 <= age <= 45:if original_amount > 24.7:return 0elif original_amount < 22.1:return 100 + 221 - original_amount*10elif 22.1 <= original_amount <= 24.7:return self.age43_45[original_amount]elif 46 <= age <= 48:if original_amount > 25:return 0elif original_amount < 22.4:return 100 + 224 - original_amount*10elif 22.4 <= original_amount <= 25:return self.age46_48[original_amount]elif 49 <= age <= 51:if original_amount > 25.3:return 0elif original_amount < 22.7:return 100 + 227 - original_amount*10elif 22.7 <= original_amount <= 25.3:return self.age49_51[original_amount]elif 52 <= age <= 54:if original_amount > 25.6:return 0elif original_amount < 23:return 100 + 230 - original_amount*10elif 23 <= original_amount <= 25.6:return self.age52_54[original_amount]elif 55 <= age <= 57:if original_amount > 25.9:return 0elif original_amount < 23.3:return 100 + 233 - original_amount*10elif 23.3 <= original_amount <= 25.9:return self.age55_57[original_amount]elif 58 <= age <= 59:if original_amount > 26.2:return 0elif original_amount < 23.6:return 100 + 236 - original_amount*10elif 23.6 <= original_amount <= 26.2:return self.age58_59[original_amount]else:print('ERROR:女子蛇形跑,原始成绩的数据类型须为整型(int)或者浮点型(float)类型')if __name__ == "__main__":   # 测试本模块serpentine_run_female_std = Serpentine_run_female_standard_data()result = serpentine_run_female_std.serpentine_run_female_score_computing(31,18.6)print(result)

3.对主程序training_performance.py进行修改,判断性别后,先计算单杠成绩,接着计算仰卧起坐成绩,再计算蛇形跑成绩,写入表中换算成绩的相应位置。

import openpyxl
import datetime as dt
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   # 导入女子蛇形跑成绩计算模块wb = openpyxl.load_workbook('通用训练课目考核成绩计算.xlsx')
ws_training_score = wb['体能考核成绩']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()  # 实例化女子蛇形跑成绩计算rngs = ws_training_score.iter_rows(min_row=6)
for row in rngs:gender = row[4].value          # 性别pullup = row[11].value         # 单杠原始数量situp =  row[7].value          # 仰卧起坐原始数量serpentine_run = row[9].value  # 蛇形跑原始数量if row[5].value:#print(row[5].value)age = age_computing(row[5].value)    #由出生日期计算年龄,精确到天row[6].value = ageif gender == '男':if row[6].value != None:  # 年龄不能为空if pullup != None:    # 单杆原始数不能为空row[12].value = pullup_sd.pullup_score_computing(age, pullup) # 计算男子单杠或俯卧撑成绩#print(row[0].value,pullup,row[12].value) # 测试if situp != None:     # 仰卧起坐原始数不能为空row[8].value = situp_male.situp_male_score_computing(age, situp)  # 计算男子仰卧起坐成绩#print(row[0].value, situp, row[8].value)if serpentine_run != None:     # 蛇形跑原始数不能为空row[10].value = serpentine_run_male.serpentine_run_male_score_computing(age, serpentine_run)  # 计算男子蛇形跑成绩print(row[0].value, serpentine_run, row[10].value)elif gender == '女':if row[6].value != None:if pullup != None:  # 单杆原始数不能为空row[12].value = flexarmhang_sd.flex_arm_hang_score_computing(age, pullup) # 女子曲臂悬垂或俯卧撑成绩计算#print(row[0].value,pullup, row[12].value)if situp != None:     # 仰卧起坐原始数不能为空row[8].value = situp_female.situp_female_score_computing(age, situp)  # 计算女子仰卧起坐成绩#print(row[0].value, situp, row[8].value)if serpentine_run != None:     # 蛇形跑原始数不能为空row[10].value = serpentine_run_female.serpentine_run_female_score_computing(age, serpentine_run)  # 计算女子蛇形跑成绩print(row[0].value, serpentine_run, row[10].value)else:    # 性别输入有误print('序号%d %s 的性别填写错误'%(row[0].value,row[1].value))wb.save('计算结果.xlsx')

运行后,生成文件“计算结果.xlsx”如下:

到此,我们成功实现了男女仰卧起坐成绩计算的功能。

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

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

Python+Excel数据分析实战:军事体能考核成绩评定(六)男女蛇形跑计算相关推荐

  1. Python+Excel数据分析实战:军事体能考核成绩评定(一)项目概况

    一.技术背景 Excel(Microsoft office)是现在最常用的办公软件,主要涉及电子表格制作.数据处理.报表输出展示以及更高端的还有金融建模等:我们知道,在需要批处理多个Excel工作表以 ...

  2. Python+Excel数据分析实战:军事体能考核成绩评定(四)女子曲臂悬垂计算

    上一章Python+Excel数据分析实战:军事体能考核成绩评定(三)男子引体向上计算成功实现了男子引体向上计算的功能,这一章我们实现女子单杠考试成绩的计算,女子的单杠考核与男子的引体向上不同,为曲臂 ...

  3. python国防_Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算...

    一.基本框架 项目任务: 每个人的体能测试有单杠.仰卧起坐.30米x2蛇形跑.3000米跑四个项目,外加体型是否合格(BMI身体质量指数或者PBF体脂百分比),每项原始测试数据,通过不同项目各自规定的 ...

  4. python体能达标成绩_Python+Excel数据分析实战:军事体能考核成绩评定(九)评定个人等级...

    这一章我们实现个人成绩的等级评定,根据单杠.仰卧起坐.蛇形跑.3公里跑成绩以及体型,综合评定个人等级. 相关规定:体型合格就不用考虑单项不合格的情况,只看通用训练科目成绩总分(单杠.仰卧起坐.蛇形跑. ...

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

    这一章我们实现个人军事训练成绩的等级评定,根据单杠.仰卧起坐.蛇形跑.3公里跑成绩以及体型,综合评定个人等级. 相关规定:体型合格就不用考虑单项不合格的情况,只看通用训练科目成绩总分(单杠.仰卧起坐. ...

  6. Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算

    一.基本框架 项目任务: 每个人的体能测试有单杠.仰卧起坐.30米x2蛇形跑.3000米跑四个项目,外加体型是否合格(BMI身体质量指数或者PBF体脂百分比),每项原始测试数据,通过不同项目各自规定的 ...

  7. python国防_Python+Excel数据分析实战:军事体能考核成绩评定(八)体型评定

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

  8. python excel数据分析实战_一次完整的数据分析实战!仅用4步,效率吊打Excel和Python...

    我最近发现很多人都走进了这样一个误区:觉得业务数据分析是专业的数据分析岗位的人才需要做的事情,业务人员只需要给他们提需求就可以了. 但实际上业务人员一点数据分析都不会就是只会打仗,不会算账,缺乏了统筹 ...

  9. Excel数据分析实战之开宗明义: Excel与数据分析实战

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.喜 ...

最新文章

  1. PCL点云分割(1)
  2. PYTHON2.day03
  3. 中小企业网络管理技术完全篇
  4. Ubuntu下安装pip
  5. 迈克尔 杰克逊mv_杰克逊JSON解析错误– UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...
  6. c#中将集合写入文本_在C#中将记录插入MySQL数据库
  7. 微软提出第一个端到端的Video Captioning方法:SWIN BERT,涨点显著!
  8. 基础 | 这波编程基础绝了!快来学习!
  9. oracle 10g在线重定义新特性——关联对象自动重命名(二)
  10. Win32反汇编(四)栈的工作原理与堆栈平衡,函数方法参数的调用约定
  11. python pandas 数据透视表_python 用pandas实现数据透视表功能
  12. 社交网络电影计算机分析,基于社交网络的电影票房分析--以豆瓣电影和新浪微博为例...
  13. python绝技运用python成为顶级pdf_python绝技:运用python成为顶级黑客 中文pdf完整版[42MB]...
  14. java 采集 cms_javaxinghuacms 杏花程序一个由 开发的电影管理系统,集 播放采集为一身的 Develop 238万源代码下载- www.pudn.com...
  15. python基础 -34- 面向对象(动态生成一个类)
  16. 电力安全教育之临时用电
  17. 百度apollo planning代码学习-Apollo\modules\planning\math\piecewise_jerk\PiecewiseJerkPathProblem类代码详解
  18. 收集整理网络协议类型
  19. Unity 3D 面试 数据结构与算法简述
  20. 苹果移动设备密码破解

热门文章

  1. 二、什么是项目集、项目组合及运营管理
  2. 零基础如何学好python爬虫?之python爬取B站小视频
  3. 2021-2022-1 20212801 树莓派第三章的实验
  4. 五上语文课文名字记忆法
  5. 戴尔页面计算机怎么创建快捷方式,Dell笔记本电脑怎么Fn功能快捷键?
  6. 被讨厌的勇气:“自我启发之父“阿德勒哲学课
  7. linux中creat-file函数,c语言createfile函数用法?
  8. java操作hadf
  9. 【产品实操】三分钟教你快速搭建字符识别CNN模型
  10. electron获取cookie删除cookie设置cookie