#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student {
int num;
char *name;
char class[2];
int grade1, grade2;
int sum;
} STUD;
// 增加参数声明
void input(STUD *p, int n);
void sort(STUD *p, int n);
void input(STUD *p, int n) {
int i;
char a[20];
for (i = 0; i < n; i++) {
scanf("%d", &p[i].num);
scanf("%s", a);
p[i].name = (char *)malloc(strlen(a) + 1);
strcpy(p[i].name, a);
scanf("%s", &p[i].class);
scanf("%d", &p[i].grade1);
scanf("%d", &p[i].grade2);
}
}
// 比较函数,用于qsort
int compare(const void *a, const void *b) {
return ((STUD *)a)->sum - ((STUD *)b)->sum;
}
void sort(STUD *p, int n) {
int i;
for (i = 0; i < n; i++) {
p[i].sum = p[i].grade1 + p[i].grade2;
}
qsort(p, n, sizeof(STUD), compare);
}
int search(STUD *p, int n)
{
int i=0,num=1;
for(;i<n-1;i++)
{
if(p[i].sum==p[n].sum)
num++;
}
return num;
}
void output(STUD *p, int x,int n)
{
int i,flag=1,m;
STUD t;//为什么是用变量交换
while(flag){
flag=0;
for(i=x;i>0;i--)
{
m=strcmp(p[n-x-1].name,p[n-x].name);
if(m>0)
{
t=p[n-x-1];
p[n-x-1]=p[n-x];
p[n-x]=t;
flag=1;
}
}
}
for (i = n-x-1; i < n; i++) {
printf("%d %s %s %d %d %d\n", p[i].num, p[i].name, p[i].class, p[i].grade1, p[i].grade2,p[i].sum);
}
}
int main() {
int n, i,x;
scanf("%d", &n);
STUD *p = (STUD *)malloc(sizeof(STUD) * n);
if (p == NULL) {
printf("malloc error");
exit(0);
}
input(p, n);
sort(p, n);
x=search(p,n);
output(p,x,n);
// 释放内存
for (i = 0; i < n; i++) {
free(p[i].name);
}
free(p);
return 0;
}
交换的时候,要用结构体变量STUD t,t与p[i]j交换,p是结构体指针,p[i]是结构体变量,