函数scoresort要求按学生平均成绩从高到低排序成绩表,为什么冒泡法和选择法都无法正确排序是逻辑错误吗?

#include<stdio.h>
#include<string.h>
struct student
{   long int num;
    char name[8];
    double score[3];
};
struct arrayst
{
struct student stu;
double nums;
};

int main()
{
    void input(struct arrayst a[],int x);
    void output(struct arrayst arr[],int x);
    void scoresort(struct arrayst arr[],int x);
    arrayst a[100];
    int n;
    while(1)
    {
        printf("请输入一个在5到100之间的数:");
        scanf("%d",&n);
        if(n>=5 && n<=100)
            break;
    }
    printf("NUM    MAME   SCORE1   SORE2   SCORE3\n");
    input(a,n);//建立学生成绩表
    printf("Before sort:\n");
    printf("NUM   MAME   SCORE1   SORE2   SCORE3   AVERAGE\n");
    output(a,n);//输出学生成绩表
    scoresort(a,n);//按平均成绩从高到低排序学生成绩表
    printf("After Sort:\n");
    printf("NUM   MAME   SCORE1   SORE2   SCORE3   AVERAGE\n");
    output(a,n);//输出学生成绩表
    return 0;
}
void input(struct arrayst a[],int x)
{  int i;
    for(i=0;i<x;i++)
    {
        scanf("%d%s%lf%lf%lf",&a[i].stu.num,&a[i].stu.name,&a[i].stu.score[0],&a[i].stu.score[1],&a[i].stu.score[2]);
    }
}
void output(struct arrayst arr[],int x)
{   float aver;
     int i;
    for(i=0;i<x;i++)
    {
    aver=(arr[i].stu.score[0]+arr[i].stu.score[1]+arr[i].stu.score[2])/3.0;
    printf("%-6d%-7s%-9.0lf%-8.0lf%-9.0lf%-.4f\n",arr[i].stu.num,arr[i].stu.name,arr[i].stu.score[0],arr[i].stu.score[1],arr[i].stu.score[2],aver);
    }
}




void scoresort(struct arrayst arr[],int x)
{   float aver[100];
    float temp;
    double te;
    char tem[20];
     int i,j,k,r;
    for(i=0;i<x;i++)
    {
    aver[i]=(arr[i].stu.score[0]+arr[i].stu.score[1]+arr[i].stu.score[2])/3.0;
    }
    for(i=0;i<x-1;i++)
    {   k=i;
        for(j=i+1;j<x;j++)
            if(aver[j]>aver[k])
                k=j;
    temp=arr[k].stu.num;arr[k].stu.num=arr[i].stu.num;arr[i].stu.num=temp;
    strcpy(tem,arr[k].stu.name);strcpy(arr[k].stu.name,arr[i].stu.name);strcpy(arr[i].stu.name,tem);
        for(r=0;r<3;r++)
        {te=arr[k].stu.score[r];arr[k].stu.score[r]=arr[i].stu.score[r];arr[i].stu.score[r]=te;}
    }
}

图片说明

num为2的学生应该排最后一位,测试出来却在中间的位置,主函数是给定的不能变动。

问题解决的话,请点下采纳,谢谢

// Q1048658.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#include<stdio.h>
#include<string.h>
struct student
{   long int num;
    char name[8];
    double score[3];
};
struct arrayst
{
struct student stu;
double nums;
};

int main()
{
    void input(struct arrayst a[],int x);
    void output(struct arrayst arr[],int x);
    void scoresort(struct arrayst arr[],int x);
    arrayst a[100];
    int n;
    while(1)
    {
        printf("请输入一个在5到100之间的数:");
        scanf("%d",&n);
        if(n>=5 && n<=100)
            break;
    }
    printf("NUM    MAME   SCORE1   SORE2   SCORE3\n");
    input(a,n);//建立学生成绩表
    printf("Before sort:\n");
    printf("NUM   MAME   SCORE1   SORE2   SCORE3   AVERAGE\n");
    output(a,n);//输出学生成绩表
    scoresort(a,n);//按平均成绩从高到低排序学生成绩表
    printf("After Sort:\n");
    printf("NUM   MAME   SCORE1   SORE2   SCORE3   AVERAGE\n");
    output(a,n);//输出学生成绩表
    return 0;
}
void input(struct arrayst a[],int x)
{  int i;
    for(i=0;i<x;i++)
    {
        scanf("%d%s%lf%lf%lf",&a[i].stu.num,&a[i].stu.name,&a[i].stu.score[0],&a[i].stu.score[1],&a[i].stu.score[2]);
    }
}
void output(struct arrayst arr[],int x)
{   float aver;
     int i;
    for(i=0;i<x;i++)
    {
    aver=(arr[i].stu.score[0]+arr[i].stu.score[1]+arr[i].stu.score[2])/3.0;
    printf("%-6d%-7s%-9.0lf%-8.0lf%-9.0lf%-.4f\n",arr[i].stu.num,arr[i].stu.name,arr[i].stu.score[0],arr[i].stu.score[1],arr[i].stu.score[2],aver);
    }
}




void scoresort(struct arrayst arr[],int x)
{
    arrayst temp;
    float aver[100];
    float temp1;
     int i,j,k,r;
    for(i=0;i<x;i++)
    {
    aver[i]=(arr[i].stu.score[0]+arr[i].stu.score[1]+arr[i].stu.score[2])/3.0;
    }
    for(i=0;i<x-1;i++)
    {
        for(j=0;j<x-i-1;j++)
            if(aver[j]<aver[j+1])
            {
                temp = arr[j];
                temp1 = aver[j];
                arr[j] = arr[j + 1];
                aver[j] = aver[j+1];
                arr[j + 1] = temp;
                aver[j+1]=temp1;

            }

    }
}