Python期末完成以下程序的设计:某体操比赛共有10名运动员参加

Python期末

完成以下程序的设计:某体操比赛共有10名运动员参加,12名评委将根据运动员表现进行评分(满分10分),请编写Python程序,解决下列问题:

1).每个运动员评分中去掉一个最高分和一个最低分,计算平均成绩,然后给出运动员排名;

2).尽量减少人为因素,组委会要求去掉第一个问题中打最高分或最低分次数排名前二的评委给每个运动员的评分,然后计算平均成绩后排名。

只有核心方法没有GUI


import os  # os为内置模块,是一定存在的

count = 3  # 最大检测次数,即第一次检测不存在则安装,会有安装失败的情况,就会再来一次

while count:

    try:

        import numpy  # 引入需要的模块

        print('numpy模块已安装')

        break

    except:

        print('numpy模块未安装,现在准备开始安装')

        os.system('pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple ')

        count -= 1

        continue
'''
导入 tkinter 导入numpy
'''
import tkinter as tk
import tkinter.messagebox
import tkinter.filedialog
import numpy as np




'''
定义一个运动员实体类
'''
class Athlete:
   def __init__(self):
        self.name=""
        self.avg = 0

'''
定义App类
'''
class App(tk.Frame): #App 继承于tkinter 的 Frame
    def __init__(self,master=None):
        tk.Frame.__init__(self,master) #初始化 Frame
        self.grid() #App 的 布局方式为 grid()
        self.CreateMenubar() #创建 菜单
        self.CreateWidget() #创建主体窗口
        window['menu'] = self.Menubar #主体窗口的menu为 Menubar
        self.data = None #初始化数据 data
        self.AthleteList = [] #初始化 运动员表
        self.Coach1 = 0 #初始化 两个最低最高分教练
        self.Coach2 = 0
        self.dataBackUp = None #初始化 数据备份
        self.AvgList= [] #初始化 平均值表



    def CreateWidget(self): #创建主体
        #GUI初始化窗口
        #...........

    def CreateMenubar(self):
       #初始化菜单栏
       #...........
    
    

    #打开文件
    def OpenFile(self):
        #选择文件对话框
        FilePath = tk.filedialog.askopenfilename(filetypes=[('文本文件','.txt')])
        if FilePath != "":
            #numpy 读取文件转为ndarray 把程序的data 赋值为这个array
            self.data =   np.loadtxt(FilePath)
            #备份数据
            self.dataBackUp = np.array(self.data)
            #显示数据到InfoLabel
            self.InfoLabel['text'] = self.data


    #找到 打最高分或最低分次数排名前二的评委
    def FindeTwoCoach(self):
        FList = []

        for i in range (0,self.data.shape[0]):
            FList.append(np.argmax( self.data[i,:]))#找每一个运动员的最高分位置 并添加到FList中
            FList.append(np.argmin(self.data[i,:]))#找每一个运动员的最低分位置 并添加到FList中
        CoachList = np.array(FList)
        print(CoachList)
        self.Coach1 = np.argmax(np.bincount(CoachList))#统计重复次数最多的元素(就是打最高最低分次数最多的教练)
        itemindex = np.argwhere(CoachList == self.Coach1)
        print(itemindex)
        CoachListNew =  np.delete(CoachList,itemindex)#删掉打最高最低分次数最多的教练 再来找第二个
        print(CoachListNew)
        self.Coach2 = np.argmax(np.bincount(CoachListNew))#统计重复次数最多的元素(就是打最高最低分次数最多的教练)
        self.InfoLabel ['text']= "打最高分或最低分次数排名前二的评委分别为:"+ str(self.Coach1)+"号和"+str(self.Coach2)+"号"


    #去掉最高最低分
    def RemoveHighestAndLowest(self):

        ResArrary = []
        for i in range(0,self.data.shape[0]):
            arr = np.delete(self.data[i,:],np.argmax(self.data[i,:]))

            arr = np.delete(arr,np.argmin(arr))

            # arr = np.delete(arr[i,:],np.argmin(arr[i,:]))
            ResArrary.append(list(arr))

        # print(ResArrary)
        self.data = np.array(ResArrary)
        self.InfoLabel['text'] = self.data
    #去掉两个高低分教练的影响
    def RemoveCoachAffect(self):
        self.FindeTwoCoach()
        res = np.delete(self.data,[self.Coach1,self.Coach2],axis=1)
        self.data = res
        self.InfoLabel['text'] = self.data
    #还原数据
    def RestoreData(self):
        self.data = np.array(self.dataBackUp)
        self.InfoLabel['text'] = self.data
    #计算平均数
    def CaculateAVG(self):
        self.AvgList = None
        print(self.data)
        res = np.mean(self.data , axis=1)#算行的平均数
        self.AvgList = res
        self.InfoLabel['text'] = res


    #生成最后的运动员表
    def GenerateAthleteList(self):
        print("生成")
        self.AthleteList = []
        print(len(self.AvgList))
        for a in range(0,len(self.AvgList)):
            name = "运动员"+str(a)+"号"
            athlete = Athlete()
            athlete.name = name
            athlete.avg = self.AvgList[a]
            self.AthleteList.append(athlete)
        self.AthleteList.sort(key= lambda x : x.avg)#根据运动员的平均分排序

   





if __name__ == '__main__':
    window = tk.Tk()
    window.title("评委系统")
    window.geometry('800x400')
    app = App(master=window)
    app.mainloop()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值