6-4 学生成绩排序(8分)

有一组n名学生数据,n由用户输入,每个数据中含有四门课成绩,请按成绩总和从高到低对这组数据进行排序。 编写函数calc求出每名学生的总分。 编写函数sort按每名学生的总分从高到低对这组数据进行排序。

函数接口定义:

void calc(struct student *p,int n); 
void sort(struct student *p,int n);

其中 p 和 n 都是用户传入的参数。 函数calc求出p指针所指向的结构体数组中 n 名学生各自的总分。 函数sort对p指针所指向的结构体数组的学生数据按总分降序排序

裁判测试程序样例:

#include <stdio.h>
#define N 30
struct student                    
{
    int num;
    char name[10];
    float score[4];
    float sum;
};
void calc(struct student *p,int n);     
void sort(struct student *p,int n);
int main()
{
    struct student stu[N];
    int i,j,n;
    float f;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%s",&stu[i].num,stu[i].name);
        for(j=0;j<4;j++)
        { 
            scanf("%f",&f);
            stu[i].score[j]=f;
        }
    }
    calc(stu,n);
    sort(stu,n);
    for(i=0;i<n;i++)
    {
        printf("%5d%10s",stu[i].num,stu[i].name);
        printf("%5.1f%5.1f%5.1f%5.1f%7.1f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].score[3],stu[i].sum);
    }
    return 0;
}
/* 请在这里填写答案 */

输入样例:

第一行输入学生人数n,第二行开始输入n名学生的学号、姓名和四门课成绩,每名学生占一行

4
101 zhang 67 68 75 80
102 chen 89 75 90 76
103 li 88 88 88 88
104 sun 90 90 98 90
结尾无空行

输出样例:

输出n行数据,按照学生总分递减排序,每名学生占一行

  104       sun 90.0 90.0 98.0 90.0  368.0
  103        li 88.0 88.0 88.0 88.0  352.0
  102      chen 89.0 75.0 90.0 76.0  330.0
  101     zhang 67.0 68.0 75.0 80.0  290.0
结尾无空行
//pta 上运行无误 
void calc(struct student *p,int n)
{
    int i;

    for(i=0;i<n;i++)
    {
        for(int j=0;j<4;j++)
        {
            (p+i)->sum+=(p+i)->score[j];
        }
    }
}
void sort(struct student *p,int n)
{
    int i=0,k=0,j=0,temp=0;
    float a[4];
    char name[10];
    for(int i=0;i<n;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(p[j].sum < p[j+1].sum)
            {
                temp=p[j].sum;
                p[j].sum=p[j+1].sum;
                p[j+1].sum=temp;

                k=p[j].num;
                p[j].num=p[j+1].num;
                p[j+1].num=k;

                strcpy(name,p[j].name);
                strcpy(p[j].name,p[j+1].name);
                strcpy(p[j+1].name,name);

                a[0]=p[j].score[0];
                a[1]=p[j].score[1];
                a[2]=p[j].score[2];
                a[3]=p[j].score[3];
                
                
                p[j].score[0]=p[j+1].score[0];
                p[j].score[1]=p[j+1].score[1];
                p[j].score[2]=p[j+1].score[2];
                p[j].score[3]=p[j+1].score[3];
                
                
                p[j+1].score[0]=a[0];
                p[j+1].score[1]=a[1];
                p[j+1].score[2]=a[2];
                p[j+1].score[3]=a[3];
                //tan zi peng wu di






            }
        }

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值