C语言结构体排序遇到问题

题目要求输入20名学生的学号 名字 作 业(20%)考勤(10%)和期 末(70%)成绩并在求出总分后按总分从大到小排序

我在写排序的过程中遇到了困难,请告诉我怎么写,谢谢

#include <stdio.h>
#define N 5
struct student
{
    int no;
    char name[20];
    int kaoqing;
    int zuoye;
    int qimo;
};

int main(void)
{
    int i, sum = 0 ;
    struct student stu[N] = {0}, temp;
    puts("Please enter information of student: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d %s %d %d %d", &stu[i].no, stu[i].name, &stu[i].kaoqing, &stu[i].zuoye, &stu[i].qimo);
    }

    for (i = 0; i < N; i++)
    {
        sum++;
        // 考勤10%作业20%期末70%
        printf(" ID=%d Name=%s check_in=%f zuoye=%f qimo=%f sum=%f\n", stu[i].no, stu[i].name, stu[i].kaoqing * 0.1, stu[i].zuoye * 0.2, stu[i].qimo * 0.7, (stu[i].kaoqing * 0.1) + (stu[i].zuoye * 0.2) + (stu[i].qimo * 0.7));
    }

    return 0;
}

```

总分按照你的公式计算出来,写个冒泡排序就可以了。代码如下:

#include <stdio.h>
#define N 5
struct student
{
    int no;
    char name[20];
    int kaoqing;
    int zuoye;
    int qimo;
};

int main(void)
{
    int i, sum = 0;
    int j;
    struct student stu[N] = { 0 }, temp;
    double t1, t2;
    puts("Please enter information of student: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d %s %d %d %d", &stu[i].no, stu[i].name, &stu[i].kaoqing, &stu[i].zuoye, &stu[i].qimo);
    }

    //排序
    for (i = 0; i < N - 1; i++)
    {
        for (j = 0; j < N - 1 - i; j++)
        {
            t1 = stu[j].zuoye * 0.2 + stu[j].kaoqing * 0.1 + stu[j].qimo * 0.7;
            t2 = stu[j+1].zuoye * 0.2 + stu[j+1].kaoqing * 0.1 + stu[j+1].qimo * 0.7;
            if (t1 < t2)
            {
                temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }


    //显示结果
    for (i = 0; i < N; i++)
    {
        printf(" ID=%d Name=%s check_in=%f zuoye=%f qimo=%f sum=%f\n", stu[i].no, stu[i].name, stu[i].kaoqing * 0.1, stu[i].zuoye * 0.2, stu[i].qimo * 0.7, (stu[i].kaoqing * 0.1) + (stu[i].zuoye * 0.2) + (stu[i].qimo * 0.7));
    }

    return 0;
}

大概这样,稍微改动了一下你代码不严谨的地方:

#include <stdio.h>

#define N 3
#define SCORE_TYPE    float

struct student {
    int no;
    char name[20];
    SCORE_TYPE kaoqing;
    SCORE_TYPE zuoye;
    SCORE_TYPE qimo;
};

int main(void) {

    int i, sum = 0;
    struct student stu[N] = { 0 }, temp;
    puts("Please enter information of student: ");
    for (i = 0; i < N; i++) {
        scanf("%d %s %f %f %f", &stu[i].no, stu[i].name, &stu[i].kaoqing, &stu[i].zuoye, &stu[i].qimo);
    }


    // 选择排序
    for (int i = 0; i < N - 1; i++) {
        int index = i;
        
        for (int j = i + 1; j < N; j++) {

            // 计算出成绩
            SCORE_TYPE score_i = stu[index].kaoqing * 0.1 + stu[index].zuoye * 0.2 + stu[index].qimo * 0.7;
            SCORE_TYPE score_j = stu[j].kaoqing * 0.1 + stu[j].zuoye * 0.2 + stu[j].qimo * 0.7;
            
            // 比较成绩
            if (score_i < score_j) {
                index = j;    // 获得最大的成绩索引
            }        
        }

        // 交换
        if (index != i) {
            temp = stu[index];
            stu[index] = stu[i];
            stu[i] = temp;
        }
    }




    for (i = 0; i < N; i++) {
        sum++;
        // 考勤10%作业20%期末70%
        printf(" ID=%d Name=%s check_in=%f zuoye=%f qimo=%f sum=%f\n", stu[i].no, stu[i].name, stu[i].kaoqing * 0.1, stu[i].zuoye * 0.2, stu[i].qimo * 0.7, (stu[i].kaoqing * 0.1) + (stu[i].zuoye * 0.2) + (stu[i].qimo * 0.7));
    }

    return 0;
}

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632