P1004 成绩排名

Posted daker-code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1004 成绩排名相关的知识,希望对你有一定的参考价值。

  这道题就比较简单了,大概就考察了结构体的使用,也没有其他的了,连排序的必要的没有。让我们来看一下题目

  技术图片

  同样,需求很明显,要输出最高分和最低分人的学号姓名。那这样子处理方案就很明显了,先把数据输进去再用qsort排个序,输出数组第一个和最后一个,完事。不过我们得知道 stdlib 里的 去sort如何使用给或者是自己写一个排序算法。排序算法和qsort我在博客其他文章里有介绍,在这里不做赘述。

代码如下:

技术图片
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAX_SIZE 12
 4 #define MAX_STD_SEIZE 150
 5 
 6 typedef struct data
 7 
 8     char name[MAX_SIZE];
 9     int ID[MAX_SIZE];
10     int Mark;
11  STD;
12 
13 int cmp(const void *a, const void *b);
14 
15 int main()
16 
17     int n, i = 0;
18     int Min_Mark = 100, Max_Mark = 0;
19     int Min_Pos, Max_Pos;
20     scanf("%d", &n);
21     STD Student[MAX_STD_SEIZE];
22 
23     for (int i = 0; i < n; i++)
24     
25         scanf("%s %s %d", Student[i].name, Student[i].ID, &Student[i].Mark);
26         getchar();
27     
28     qsort(Student, n, sizeof(Student[0]), cmp);
29     printf("%s %s\\n", Student[0].name, Student[0].ID);
30     printf("%s %s\\n", Student[n-1].name, Student[n-1].ID);
31 
32     return 0;
33 
34 
35 int cmp(const void *a, const void *b)
36 
37     return (* (STD *) a).Mark > (* (STD *) b).Mark ? -1 : 1;
38 
内置快排

 

  其实这道题不一定要排序,我们可以在输入的时候定义四个变量分别存储最大值、最小值、最大值索引,最小值索引。输入完就选出了最高分最低分,时间复杂度为O(n),比O(nlogn)的快排更加省事。

  代码如下

技术图片
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAX_SIZE 12
 4 #define MAX_STD_SEIZE 150
 5 
 6 typedef struct
 7 
 8     char name[MAX_SIZE];
 9     int ID[MAX_SIZE];
10     int Mark;
11  STD;
12 
13 int main()
14 
15     int n, i = 0;
16     int Min_Mark = 100, Max_Mark = 0;
17     int Min_Pos, Max_Pos;
18     scanf("%d", &n);
19     STD Student[MAX_STD_SEIZE];
20 
21     while (n--)
22     
23 
24         scanf("%s %s %d", Student[i].name, Student[i].ID, &Student[i].Mark);
25         if (Min_Mark > Student[i].Mark)
26         
27             Min_Pos = i;
28             Min_Mark = Student[i].Mark;
29         
30         if (Max_Mark < Student[i].Mark)
31         
32             Max_Pos = i;
33             Max_Mark = Student[i].Mark;
34         
35         i++;
36         getchar();
37     
38 
39     printf("%s %s\\n", Student[Max_Pos].name, Student[Max_Pos].ID);
40     printf("%s %s\\n", Student[Min_Pos].name, Student[Min_Pos].ID);
41 
42     return 0;
43 
View Code

好了,还是那句话 

     ——前路多艰,诸君共勉!

以上是关于P1004 成绩排名的主要内容,如果未能解决你的问题,请参考以下文章

等值并列排名(学生成绩排名)

成绩排名

1004. 成绩排名 (20)

1004. 成绩排名 (20)

PAT 1004 成绩排名

PAT1004. 成绩排名 (20)