锅巴殿下 2021-10-23 10:46 采纳率: 100%
浏览 25
已结题

感觉代码写得挺对的,但是输入之后没法输出,为啥啊??

题目描述
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
77 279
55 279
这两行数据的含义是:总分最高的两个同学的学号依次是77号、55号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为77的学生语文成绩更高一些。如果你的前两名的输出数据是:
55 279
77 279
则按输出错误处理,不能得分。
输入
共n+1行。
第1行为一个正整数n(n≤300),表示该校参加评选的学生人数。
第22到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
输出
共5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
样例输入 Copy
8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
样例输出 Copy
8 265
2 264
6 264
1 258
5 258

#include<cstdio>
#include<cmath>
using namespace std;

int a[300],b[300],c[300],total[300],id[300];
int main()
{
    int n,i,j,temp,temp1,temp2,temp3,temp4;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d%d",&a[i],&b[i],&c[i]);
        total[i]=a[i]+b[i]+c[i];
        int t=i;
        id[i]=t+1;
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(total[j]<total[j+1]
            || total[j]==total[j+1] && a[j]<a[j=1]
            || total[j]==total[j=1] && a[j]==a[j+1] && id[j]<id[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
                
                temp1=b[j];
                b[j]=b[j+1];
                b[j+1]=temp1;
                
                temp2=c[j];
                c[j]=c[j+1];
                c[j+1]=temp2;
                
                temp3=total[j];
                total[j]=total[j+1];
                total[j+1]=temp3;
                
                temp4=id[j];
                id[j]=id[j+1];
                id[j+1]=temp4;
                
            }
        }
    }
    for(i=0;i<5;i++)
    {
        printf("%d %d\n",id[i],total[i]);
    }
    
    return 0;
}

  • 写回答

1条回答 默认 最新

  • -Undefined_ 2021-10-23 11:03
    关注
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int a[300],b[300],c[300],total[300],id[300];
    int main()
    {
        int n,i,j,temp,temp1,temp2,temp3,temp4;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&a[i],&b[i],&c[i]);
            total[i]=a[i]+b[i]+c[i];
            int t=i;
            id[i]=t+1;
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<n-1;j++)//内层循环到n-2,最后是n-2和n-1项比较,否则j+1的时候数组越界,
            {
                if(total[j]<total[j+1]
                || total[j]==total[j+1] && a[j]<a[j+1]
                || total[j]==total[j+1] && a[j]==a[j+1] && id[j]>id[j+1])
                {//你这个地方有些j+1写的是j=1,改一下 
            //第二个问题是如果总分和语文成绩相等时,学号小的应该排在前,所以是id[j]>id[j+1]
                    temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                    temp1=b[j];
                    b[j]=b[j+1];
                    b[j+1]=temp1;
                    temp2=c[j];
                    c[j]=c[j+1];
                    c[j+1]=temp2;
                    temp3=total[j];
                    total[j]=total[j+1];
                    total[j+1]=temp3;
                    temp4=id[j];
                    id[j]=id[j+1];
                    id[j+1]=temp4;
                }
            }
        }
        for(i=0;i<5;i++)
        {
            printf("%d %d\n",id[i],total[i]);
        }
        return 0;
    }
    

    觉得有用的话采纳一下哈

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月31日
  • 已采纳回答 10月23日
  • 创建了问题 10月23日

悬赏问题

  • ¥20 python作业求过程
  • ¥15 wincc已组态的变量过多
  • ¥60 如图:直线与椭圆X轴平行,求直线与椭圆任意一点的相切坐标计算公式
  • ¥50 如何用python使用opencv里的cv::cudacodec::VideoWriter函数对视频进行GPU硬编码
  • ¥100 c#solidworks 二次开发 工程图自动标边线法兰 等折弯尺寸怎么标
  • ¥15 halcon DrawRegion 提示错误
  • ¥15 FastAPI Uvicorn启动显示404
  • ¥15 centos7.9脚本,怎么排除特定的访问记录
  • ¥15 关于#Django#的问题:我的静态文件呢?
  • ¥15 关于CPLEX的问题,请专家解答