用c语言实现算法,对带学号的5门成绩按照权值和优先级进行降序排列,输出排名和对应的学号,若成绩完全相同则排名相同
时间: 2024-03-24 14:39:53 浏览: 16
好的,我理解了你的问题。下面是用 C 言实现的算法,可以对带学的 5 门成绩按照权值和优先级进行降序排列,输出排名和对应的学号,若成绩完全相同则排名相同。
```c
#include <stdio.h>
#include <string.h>
#define NUM 5 // 学生数目
struct student{
char id[10]; // 学号
float score[NUM]; // 5门课程成绩
float sum; // 总成绩
int rank; // 排名
};
void input(struct student stu[]);
void calculate(struct student stu[]);
void sort(struct student stu[]);
void output(struct student stu[]);
int main(){
struct student stu[NUM]; // 定义结构体数组
input(stu); // 输入学生信息
calculate(stu); // 计算学生总成绩
sort(stu); // 排序
output(stu); // 输出排名和学号
return 0;
}
// 输入学生信息
void input(struct student stu[]){
int i, j;
printf("请输入各学生的学号和成绩:\n");
for(i = 0; i < NUM; i++){
printf("请输入第%d个学生的学号:", i+1);
scanf("%s", stu[i].id);
for(j = 0; j < NUM; j++){
printf("请输入第%d个学生的第%d门课程成绩:", i+1, j+1);
scanf("%f", &stu[i].score[j]);
}
}
}
// 计算学生总成绩
void calculate(struct student stu[]){
int i, j;
for(i = 0; i < NUM; i++){
stu[i].sum = 0;
for(j = 0; j < NUM; j++){
stu[i].sum += stu[i].score[j] * (j + 1); // 按照权值和计算总成绩
}
}
}
// 排序
void sort(struct student stu[]){
int i, j;
struct student temp;
for(i = 0; i < NUM; i++){
for(j = i+1; j < NUM; j++){
if(stu[i].sum < stu[j].sum){
temp = stu[i];
stu[i] = stu[j];
stu[j] = temp;
}
}
}
stu[0].rank = 1; // 排名从1开始
for(i = 1; i < NUM; i++){
if(stu[i].sum == stu[i-1].sum){
stu[i].rank = stu[i-1].rank; // 成绩相同,排名相同
}
else{
stu[i].rank = i + 1; // 排名按照顺序递增
}
}
}
// 输出排名和学号
void output(struct student stu[]){
int i;
printf("排名\t学号\n");
for(i = 0; i < NUM; i++){
printf("%d\t%s\n", stu[i].rank, stu[i].id);
}
}
```
这个算法会先要求输入 5 个学生的学号和成绩,然后计算每个学生的总成绩,按照总成绩进行降序排序,最后输出排名和对应的学号。其中,如果成绩完全相同,则排名相同。