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

好了,还是那句话 

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

### 学生成绩排名算法的设计 为了实现学生成绩排名,在已有系统的框架下,即已经定义好的学生类及其属性基础上,可以通过增加一个用于计算总分的方法,并利用标准模板库(STL)中的`sort()`函数来对学生对象数组按照总分进行降序排列。 #### 定义学生类并加入求和方法 假设已有的学生类结构如下: ```cpp class Student { private: string id; string name; string className; float score1, score2, score3; public: // 构造函数和其他成员函数... // 计算三个科目分数之和作为总分 float getTotalScore() const { return this->score1 + this->score2 + this->score3; } }; ``` 此部分代码展示了如何扩展原有的学生类以支持获取单个学生的总成绩[^1]。 #### 排名逻辑的编写 对于整个班级的成绩排名,则可以在主程序或者专门处理业务逻辑的地方创建一个包含所有学生记录的对象列表,之后调用排序算法对其进行整理。这里给出具体的实现方案: ```cpp #include <algorithm> // 导入 sort 函数所在的头文件 // 自定义比较器,按总分从高到低排序 bool compareByTotal(const Student& a, const Student& b){ return (a.getTotalScore() > b.getTotalScore()); } void rankStudents(vector<Student>& studentsList){ std::sort(studentsList.begin(), studentsList.end(), compareByTotal); } ``` 上述代码片段实现了通过自定义比较器 `compareByTotal` 来指定排序规则,从而使得 `std::sort` 能够依据每位同学的总分来进行升序或降序排列。 #### 输出排名结果 最后一步就是遍历排好序后的向量容器,依次打印出各个学员的信息连同其对应的排名位置。注意这里的索引是从0开始计数的,因此实际展示给用户的排名应当加1表示真实的顺序编号。 ```cpp for(int i=0;i<studentsList.size();i++){ cout << "Rank #" << i+1 << ": "; cout << studentsList[i].getName(); cout << ", Total Score: " << studentsList[i].getTotalScore()<<endl; } ``` 这段代码负责将最终得到的结果集呈现出来,其中包含了每个学生的名称与其所获得的综合评分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值