成绩排序问题

问题描述:一个班有学生n人,输入学生名字和2项成绩(数学和语文),找到总分最高的学生并输出,若总分最高的学生大于一人,则按照名字的字典顺序输出。

要求:输入n表示学生人数,接着依次输入学生名字,数学成绩,语文成绩,按照字典顺序输出总分最高的学生名字,数学成绩,语文成绩。

程序如下:

#include<stdio.h>

#include<string.h>

struct stu_student{

    char name[19];

    int mgrade;

    int cgrade;

}list[200];

int main() {

    struct stu_student temp[200];

    int i, n,j,maxmark,mark;

    int a[100] = { 0 };

    scanf_s("%d", &n);                                         //输入n,表示学生人数

    for (i = 0; i < n; i++) {

         scanf_s("%s", list[i].name,19);

         scanf_s("%d%d", &list[i].mgrade, &list[i].cgrade);

    }                                                 //依次输入名字,数学成绩,语文成绩

    maxmark = list[0].mgrade + list[0].cgrade;

//以下是通过主元排序将总分从高到低排列

    for (i = 0; i < n; i++) {

         for (j = i + 1; j < n; j++) {

             mark = list[j].mgrade + list[j].cgrade;

             if (mark >= maxmark) {

                 maxmark = mark;                          //记录最高分maxmark

                 temp[j] = list[j];

                 list[j] = list[i];

                 list[i] = temp[j];

             }

        }

    }

    printf("\n");

//以下是通过主元排序按照字典顺序排列

    for (i = 0; i < n; i++) {

        if ((list[i].mgrade + list[i].cgrade) != maxmark)

             break; //当总分不等于maxmark时结束循环

         for (j = i+1; j < n; j++) {

             if ((list[j].mgrade + list[j].cgrade) != maxmark)

                 break; //当总分不等于maxmark时结束循环

             if (strcmp(list[j].name, list[i].name) < 0) {

                 temp[j] = list[j];

                 list[j] = list[i];

                 list[i] = temp[j];

             }

            

         }

    }

//以下是输出

    for (i = 0; (list[i].mgrade + list[i].cgrade)==maxmark; i++)

         printf("%s %d %d\n", list[i].name,list[i].mgrade,list[i].cgrade);

   

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值