P1004 成绩排名

转跳点:🐏

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

  

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

代码如下:

 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

好了,还是那句话 

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

posted @ 2019-10-03 08:00  秦_殇  阅读(203)  评论(0编辑  收藏  举报