杭电1.3.6考试排名

 1 /*杭电1.3.6考试排名*/

 2 #include <stdio.h>

 3 #include <string.h>

 4 #include <stdlib.h>

 5 typedef struct person

 6 {

 7     char name[11];

 8     int acnum;   //做对了几题

 9     int timescore;   //时间分-越多越不好

10 }Person;

11 

12 int cmp(const void * a,const void *b)

13 {

14     Person * c=(Person *)a;

15     Person * d=(Person *)b;

16     if (c->acnum!=d->acnum)  //先按ac数

17     {

18         return d->acnum-c->acnum;

19     }

20     else

21     {

22          if (c->timescore!=d->timescore)   //再按时间数

23          {

24              return c->timescore-d->timescore;

25          }

26          else   //名字

27          {

28              return strcmp(c->name,d->name);

29          }

30     }

31 }

32 

33 Person arrperson[100];   //假设最多100人

34 

35 int main(void)

36 {

37     int n,m;

38     int pernum=0;   //记录输入人数

39     int i;

40     scanf("%d %d",&n,&m);

41     while (scanf("%s",arrperson[pernum].name)!=EOF)

42     {

43         int errotime=0,timescore=0,ac=0;   //提交错的次数,时间分(未加错误的罚分),ac题数

44         char chartemp[8];   //装每个数字--用字符串处理

45         char * p;

46         for (i=0;i<n;i++)   //对每题的处理

47         {

48             scanf("%s",chartemp);

49             p=strchr(chartemp,'(');   //在这个字符串中找有没有括号------------------------------------------------------------------

50             if (p)   //不是null,就是有括号

51             {

52                 int shuzi1,shuzi2;    //前为时间,后卫错次数

53                 sscanf(chartemp,"%d(%d)",&shuzi1,&shuzi2);   //从字符串中提取数字--------------------------------------------------

54                 timescore+=shuzi1;

55                 errotime+=shuzi2;

56                 ac++;

57             }

58             else   //是null,就是没有括号----直接得到数字

59             {

60                 int shuzi;

61                 sscanf(chartemp,"%d",&shuzi);

62                 if (shuzi>0)   //数字<=零不管了,都是没有通过

63                 {

64                     timescore+=shuzi;

65                     ac++;

66                 }

67             }

68         }

69         timescore=timescore+errotime*m;

70         arrperson[pernum].timescore=timescore;

71         arrperson[pernum].acnum=ac;

72         pernum++;   //人数加

73     }

74     qsort(arrperson,pernum,sizeof(Person),cmp);

75     for (i=0;i<pernum;i++)

76     {

77         printf("%-10s %2d %4d\n",arrperson[i].name,arrperson[i].acnum,arrperson[i].timescore);

78     }

79     getchar();

80     return 0;

81 }

 

你可能感兴趣的:(杭电)