Zijeak 2018-11-21 14:56 采纳率: 33.3%
浏览 2874

【C语言】结构体数组作为函数参数的排序问题

题目:
设计一个程序,统计一个班(最多50人)的学生成绩,要求能实现如下3个功能:
(1) 由键盘或文件输入每个学生的学号和四门课程的成绩;
(2) 计算每个学生的平均成绩和总成绩;
(3) 按总成绩从高到低排名,并按名次输出每个学生的情况,包括:
学号,各科成绩,平均成绩,总成绩,排名

我写的代码如下
问题在于,输入、计算部分都没有问题,但是,运行结果显示,**并没有进行排序操作,也就是说**,排序代码并未生效。
麻烦各位大佬帮忙看看哪里出了问题,感激不尽
 #include <stdio.h>
#include <stdlib.h>

struct student{
    char id[10];
    float sub_1;
    float sub_2;
    float sub_3;
    float sub_4;
    float sum;
    float aver;
    //int order;
};

//函数原型 
void order_stu(struct student stu[],int sum_stu);
void aver_stu(struct student *pt_1);

void main()
{
    int sum_stu;//学生的人数 
    printf("Please input the sum of students in this class:");
    scanf("%d",&sum_stu);
    getchar();

    struct student stu[sum_stu];
    //从键盘读取学生学号和四门课的成绩
    int i;
    for(i=0;i<sum_stu;i++)
    {
        printf("请分别输入第%d名学生的学号、四门课的成绩,以空格隔开:",i);
        scanf("%s %f %f %f %f",&stu[i].id,&stu[i].sub_1,&stu[i].sub_2,&stu[i].sub_3,&stu[i].sub_4);
        getchar();
        aver_stu(&stu[i]);
    }

    order_stu(stu,sum_stu);


}

//计算总分和平均值 
//利用指针,目的在于在本函数内为结构体内的aver和sum赋值,即改变结构体的内容 
void aver_stu(struct student *pt_1)
{
    pt_1->sum=pt_1->sub_1+pt_1->sub_2+pt_1->sub_3+pt_1->sub_4;
    pt_1->aver=(pt_1->sum)/4;
}

//排名次 
void order_stu(struct student stu[],int sum_stu)
{
    float sum_score;//总分 
    float aver;
    int i,j;
    struct student *p[sum_stu];//定义一个指针数组
    //使每个指针指向一个结构体数组元素 
    for(i=0;i<sum_stu;i++)
    {
        p[i]=&stu[i];
    }
    struct student *temp;
    //用冒泡排序法排序(从大到小) 
    for(i=0;i<sum_stu-1;i++)
    {//遍历sum_stu-1轮 
        for(j=0;j<sum_stu-i-1;j++)
        {//每过一轮,遍历的元素数目-1 
            if((p[j]->sum)<(p[j+1]->sum))
            {
                temp=p[j+1];//交换两结构体在结构体数组中的位置 
                p[j+1]=p[j];
                p[j]=temp;
            }
        }
    }
    //将结果通过列表的方式打印在屏幕上 
    printf("id           sub_1     sub_2     sub_3     sub_4     average    order\n");
    for(i=0;i<sum_stu;i++)
     printf("%s   %5f  %5f  %5f  %5f  %7f  %5d\n",stu[i].id,stu[i].sub_1,stu[i].sub_2,stu[i].sub_3,stu[i].sub_4,stu[i].aver,i+1);

}

运行结果如图所示
图片说明

  • 写回答

1条回答

  • threenewbee 2018-11-22 04:28
    关注

    你排序后放在p里,但是输出的还是stu数组

    printf("%s %5f %5f %5f %5f %7f %5d\n",stu[i].id,stu[i].sub_1,stu[i].sub_2,stu[i].sub_3,stu[i].sub_4,stu[i].aver,i+1);

    // Q714179.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct student{
        char id[10];
        float sub_1;
        float sub_2;
        float sub_3;
        float sub_4;
        float sum;
        float aver;
        //int order;
    };
    
    //函数原型 
    void order_stu(struct student stu[],int sum_stu);
    void aver_stu(struct student *pt_1);
    
    void main()
    {
        int sum_stu;//学生的人数 
        printf("Please input the sum of students in this class:");
        scanf("%d",&sum_stu);
        getchar();
    
        student * stu = (student *)malloc(sizeof(student) * sum_stu);
        //从键盘读取学生学号和四门课的成绩
        int i;
        for(i=0;i<sum_stu;i++)
        {
            printf("请分别输入第%d名学生的学号、四门课的成绩,以空格隔开:",i);
            scanf("%s %f %f %f %f",&stu[i].id,&stu[i].sub_1,&stu[i].sub_2,&stu[i].sub_3,&stu[i].sub_4);
            getchar();
            aver_stu(&stu[i]);
        }
    
        order_stu(stu,sum_stu);
    
    
    }
    
    //计算总分和平均值 
    //利用指针,目的在于在本函数内为结构体内的aver和sum赋值,即改变结构体的内容 
    void aver_stu(struct student *pt_1)
    {
        pt_1->sum=pt_1->sub_1+pt_1->sub_2+pt_1->sub_3+pt_1->sub_4;
        pt_1->aver=(pt_1->sum)/4;
    }
    
    //排名次 
    void order_stu(struct student stu[],int sum_stu)
    {
        float sum_score;//总分 
        float aver;
        int i,j;
        student **p = (student **)malloc(sizeof(student *) * sum_stu);//定义一个指针数组
        //使每个指针指向一个结构体数组元素 
        for(i=0;i<sum_stu;i++)
        {
            p[i]=&stu[i];
        }
        student *temp;
        //用冒泡排序法排序(从大到小) 
        for(i=0;i<sum_stu-1;i++)
        {//遍历sum_stu-1轮 
            for(j=0;j<sum_stu-i-1;j++)
            {//每过一轮,遍历的元素数目-1 
                if((p[j]->sum)<(p[j+1]->sum))
                {
                    temp=p[j+1];//交换两结构体在结构体数组中的位置 
                    p[j+1]=p[j];
                    p[j]=temp;
                }
            }
        }
        //将结果通过列表的方式打印在屏幕上 
        printf("id           sub_1     sub_2     sub_3     sub_4     average    order\n");
        for(i=0;i<sum_stu;i++)
         printf("%s   %5f  %5f  %5f  %5f  %7f  %5d\n",p[i]->id,p[i]->sub_1,p[i]->sub_2,p[i]->sub_3,p[i]->sub_4,p[i]->aver,i+1);
    
    }
    
    
    

    图片说明

    如果问题得到解决,请点我回答左上角的采纳和向上的箭头,谢谢

    评论

报告相同问题?

悬赏问题

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