显示奥运会金牌榜

阅读(1342) 标签: 排序, 并列, file, import, new, count, rank, sort,

l  问题

下面是某届奥运会的比赛数据。

国家表:

运动员表记录了每位运动员所属的国家:

 

比赛成绩表记录了所有的比赛结果:

请列出本届奥运会的金牌榜,包括各个国家的金银铜牌数量,按金牌数排序,并给出名次,注意名次要考虑并列。 

 

l  思路

大致思路:只要将运动员表中的国家字段替换为国家表中的记录,再将比赛结果表中的运动员字段也替换为相应记录,比赛成绩就可以直接和国家联系起来了,而后将比赛结果按国家分组,然后就很容易统计出各个国家的金银铜牌数量了。至于三个关键字排序的名次,只要直接以三个关键字组成的序列排序即可,而并列问题则可以使用rank函数解决。

1.  首先将运动员表中的国家字段替换为国家表中相应的记录,比赛结果表中的运动员字段替换为运动员表中的相应记录。

2.  将表按运动员的国家分组。

3.  基于分组后的序列创建新序表,包含每个国家的名字、金银铜牌的数量统计,再预留一个名次字段,由于需要考虑并列,名次字段的值暂时留空,放到后面填写。

4.  以金牌数、银牌数、铜牌数三个变量组成的序列排序,用rank函数填写排序名次。

5.  最后依次按得到的名词作为关键字将表排好序即可。

 

l  代码

 

A

 

1

=file("C:\\txt\\Country.txt").import@t().keys(ID)

国家表

2

=file("C:\\txt\\Athlete.txt").import@t().keys(Athlete)

运动员表

3

=file("C:\\txt\\MatchResult.txt").import@t()

比赛结果表

4

>A2.switch(Country,A1), A3.switch(Athlete,A2)

先将运动员表和比赛结果表的字段替换为记录

5

=A3.group(Athlete.Country)

直接按运动员的国家分组

6

=A5.new(:Ranking, Athlete.Country.Country:Country, ~.count(Ranking==1):Gold,~.count(Ranking==2):Silver, ~.count(Ranking==3):Bronze)

创建新序表,同时求出每国金银铜牌数目并提取出国家名,并预留名次字段,值暂时留空

7

=A6.([Gold,Silver,Bronze])

列出金银铜牌数的序列组成的序列

8

>A6.run(Ranking=A7.rank@z([Gold,Silver,Bronze]))

以金银铜牌数的序列算出每个国家的名次

9

=A6.sort(Ranking)

按名次排序表

 

l  结果