题目描述:
ackson想知道他在班级中的排名.教授已经公布班级中人的
学号和分数的列表.计算Jackson的排名,如果他分数是最高的(包
括和他分数一样),那么他的排名是1,如果他分数是第二高(包括
和他分数一样的),那么他的排名是2,等等
输入:
输入多个测试用例,以Jackson的学号为输入开始.学号是
10000000到99999999之间的整数.之后输入所有学生的学号和分数
.分数是0到100的整数.这个课堂上的学生数不超过1000.每个学生
的学号是不同的.以输入学号和分数都为0表示输入结束.
输出:
通过每个测试用例数据,在新的一行输出Jackson的班级排名
样例的输入:
20070101
20070102 100
20070101 33
20070103 22
20070106 33
例子的输出:
2
#include <stdio.h>
#include <stdlib.h>
typedef
struct
{
int num ;
int mark ;
}
STD;
int input( STD * , int , int * );
int rank( STD [] , int , int );
int main( void )
{
int jack_n ;
while ( scanf( "%d" , &jack_n ) != EOF )
{
STD stu[ 1000 + 1 ] ;
int sum ;
int jack_m ;
sum = input( stu , jack_n , &jack_m ); //输入并获得数据总数及Jack的成绩
printf("%d\n" , rank( stu , sum , jack_m ) );//输出Jack的名次
}
system("PAUSE");
return 0;
}
int input( STD * p_stu , int j_n , int * p_j_m )
{
STD * p_ini = p_stu ;
while ( scanf( "%d%d" , &p_stu->num , &p_stu->mark ) ,
p_stu -> num != j_n ) //读入数据直到Jack的
p_stu ++ ;
* p_j_m = p_stu ++ -> mark ;
while ( scanf( "%d%d" , &p_stu->num , &p_stu->mark ) ,
p_stu->num != 0 || p_stu->mark != 0 ) //读Jack后面的
p_stu ++ ;
return p_stu - p_ini ;
}
int rank( STD stu[] , int n , int j_m )
{
int r = 1 ;
int i ;
for ( i = 0 ; i < n ; i ++ )
if ( stu[i].mark > j_m )
r ++ ;
return r ;
}