weixin_46081926 2019-12-25 09:12 采纳率: 100%
浏览 559
已采纳

函数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的学生应该排最后一位,测试出来却在中间的位置,主函数是给定的不能变动。

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-12-25 10:31
    关注

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

    // 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;
    
                }
    
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!