选美比赛

在选美大奖赛的半决胜赛现场,有一批选手参加比赛,比赛的规则是最后得分越高,名次越低。当半决决赛结束时,要在现场按照选手的出场顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。例如:  
选手序号: 1,2,3,4,5,6,7  
选手得分: 5,3,4,7,3,5,6  
则输出名次为: 3,1,2,5,1,3,4  
请编程帮助大奖赛组委会完成半决赛的评分和排名工作。

*问题分析与算法设计  
问题用程序设计语言加以表达的话,即为:将数组A中的整数从小到大进行连续编号,要求不改变数组中元素的顺序,且相同的整数要具有相同的编号。  
普通的排序方法均要改变数组元素原来的顺序,显然不能满足要求。为此,引入一个专门存放名次的数组,再采用通常的算法:在尚未排出名次的元素中找出最小值,并对具有相同值的元素进行处理,重复这一过程,直到全部元素排好为止。

*程序说明与注释  

#include<stdio.h>   
  
#define NUM 7 /*定义要处理的人数*/   
  
int a[NUM+1]={0,5,3,4,7,3,5,6}; /*为简单直接定义选手的分数*/  
  
int m[NUM+1],l[NUM+1]; /*m:已编名次的标记数组 l:记录同名次元素的下标*/  
  
int main()   
  
{   
  
int i,smallest,num,k,j;   
  
num=1; /*名次*/  
  
for(i=1;i<=NUM;i++) /*控制扫描整个数组,每次处理一个名次*/  
  
if(m[i]==0) /*若尚未进行名次处理(即找到第一个尚未处理的元素)*/  
  
{   
  
smallest=a[i]; /*取第一个未处理的元素作为当前的最小值*/  
  
k=1; /*数组l的下标,同名次的人数*/  
  
l[k]=i; /*记录分值为smallest的同名次元素的下标*/  
  
for(j=i+1;j<=NUM;j++) /*从下一个元素开始对余下的元素进行处理*/  
  
if(m[j]==0) /*若为尚未进行处理的元素*/  
  
if(a[j]<smallest) /*分数小于当前最小值*/  
  
{   
  
smallest=a[j]; /*则重新设置当覵最小值*/   

k=0; /*重新设置同名次人数*/  
  
l[++k]=j; /*重新记录同名次元素下标*/  
  
}   
  
else if(a[j]==smallest) /*若与当前最低分相同*/  
  
l[++k]=j; /*记录同名次的元素下标*/  
  
for(j=1;j<=k;j++) /*对同名次的元素进行名次处理*/  
  
m[l[j>=num;   
  
num++; /*名次加1*/  
  
i=0; /*控制重新开始,找下一个没排名次的元素*/  
  
}   
  
printf("Player-No score Rank\n");   
  
for(j=1;j<=NUM;j++) /*控制输出*/  
  
printf(" %3d %4d %4d\n",j,a[j],m[j]);

*运行结果  
Player-No Score Rank  
1 5 3  
2 3 1  
3 4 2  
5 7 5  
5 3 1  
3 5 3  
7 6 4

*思考题  
若将原题中的“名次连续编号,不用考虑同名次的选手人数”,改为”根据同名次的选手人数对选手的名次进行编号“,那么应该怎样修改程序。

 

转载于:https://my.oschina.net/u/2298308/blog/361333

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值