#include
#include
typedef struct _STUDENT_INFO {
int id; // 序号
int rank; // 名次
int achievement; // 成绩
} STUDENT_INFO, *PSTUDENT_INFO;
// 交换2个学生的信息
void SwapStudentInfo(PSTUDENT_INFO stu1, PSTUDENT_INFO stu2)
{
int tmp;
// 交换ID
tmp = stu1->id;
stu1->id = stu2->id;
stu2->id = tmp;
// 交换成绩
tmp = stu1->achievement;
stu1->achievement = stu2->achievement;
stu2->achievement = tmp;
}
// 计算排名的函数
void CalculateRank(PSTUDENT_INFO students, int n)
{
int i, j, tmp;
// 按照成绩排序
for (i=0; i { for (j=i+1; j { if (students[i].achievement < students[j].achievement) { SwapStudentInfo(students+i, students+j); } } } // 根据排序后的成绩计算排名 for (i=0, j=1; i { students[i].rank = j; if (students[i].achievement != students[i+1].achievement) { ++j; } } } // 显示排名的函数 void DisplayRank(PSTUDENT_INFO students, int n) { int i; printf("\n%-10s%-10s%-10s\n", "排名", "序号", "成绩"); for (i=0; i { printf("%-10d%-10d%-10d\n", students[i].rank, students[i].id, students[i].achievement); } } void main() { int n, i; PSTUDENT_INFO students; // 输入学生人数 printf("请输入学生人数:"); scanf("%d", &n); // 动态分配n个学生信息的结构体 students = (PSTUDENT_INFO)malloc(n * sizeof(STUDENT_INFO)); // 输入n个学生的成绩 printf("\n请输入学生成绩:"); for (i=0; i { students[i].id = i+1; // 初始化各个学生的序号 scanf("%d", &students[i].achievement); } // 计算排名 CalculateRank(students, n); // 显示排名 DisplayRank(students, n); // 释放students free(students); }