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
好了,还是那句话
——前路多艰,诸君共勉!
以上是关于P1004 成绩排名的主要内容,如果未能解决你的问题,请参考以下文章