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 结果