杭电ACM 2023:求平均成绩

原创作品 转载请注明出处http://blog.csdn.net/always2015/article/details/45501859

这里写图片描述

这道题目有点坑啊。。其实这道题目不是很难,但是这道题目在定义变量类型时候都没有说清楚,在定义存储成绩等变量的时候我刚开始用的是float,整个结果运行无误,就是通不过,害我查看代码几十遍,然后还有没有找到什么错误。可真是把我急死了,最后干脆睡个午觉再来看。顿时发觉可能用double类型会通过,修改之后果然不出我所料,竟然AC了。花了这么长时间,尽然错在一个类型上面,我也是醉了。好吧,上面纯属抱怨,下面我就说一下我的代码,我的代码用到了数组初始化函数memset();我是用它来清零的。不懂的可以百度就出来了,下面贴上我的AC代码供大家参考,有疑问,请留言。

#include <iostream>
#include"string.h"
#include<iomanip>
using namespace std;

int main(void)
{
    int n,m,*flag,person_num=0;
    //必须使用double类型,否则通不过
    double *input_score,*indi_aver_score,*subject_aver_score,*indi_total_score,*subject_total_score;
    while(cin>>n>>m)
    {
        flag=new int[n];
        input_score=new double[n*m];
        //为个人平均成绩和课程平均成绩分配空间
        indi_aver_score=new double[n];
        subject_aver_score=new double[m];
        //为个人总分和每门课程成绩总分分配空间
        indi_total_score=new double[n];
        subject_total_score=new double[m];
        //对个人总分,每门课程成绩总分分配空间,flag用来判断每个人各科成绩均大于等于平均成绩的次数
        memset(flag,0,n*sizeof(int));
        memset(indi_total_score,0,n*sizeof(double));
        memset(subject_total_score,0,m*sizeof(double));

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                //输入每人的各科成绩,并统计每个人总分数,和各门课程总分数
                cin>>input_score[i*m+j];
                indi_total_score[i]+=input_score[i*m+j];
                subject_total_score[j]+=input_score[i*m+j];
            }

        }

        for(int k=0; k<n; k++)
        {
            //求出每个人的平均成绩,注意这里除的是课程数m,而不是人数n
            indi_aver_score[k]=indi_total_score[k]/m;
            //格式输出个人平均成绩
            if(k==n-1)
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<indi_aver_score[k]<<endl;
            else
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<indi_aver_score[k]<<" ";
        }

        for(int h=0; h<m; h++)
        {
            //求出每门课的平均成绩,注意这里除的是人数n,而不是课程数m
            subject_aver_score[h]=subject_total_score[h]/n;
            //格式输出每门课成绩
            if(h==m-1)
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<subject_aver_score[h]<<endl;
            else
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<subject_aver_score[h]<<" ";
        }

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                //判断每人各科成绩均是否大于等于平均成绩,true的话就在每人对应的flag上加1
                if(input_score[i*m+j]>=subject_aver_score[j])
                {
                    ++flag[i];
                }


            }

        }

        for(int k=0; k<n; k++)
        {
            //如果每人对应的flag都等于课程数,即每个人的每门课都大于等于平均数,则符合要求
            if(flag[k]==m)
                ++person_num;

        }
        //格式输出每门课都大于等于平均数的人数
        cout << person_num <<endl<< endl;
       //释放空间
        delete input_score;
        delete indi_aver_score;
        delete indi_total_score;
        delete subject_aver_score;
        delete subject_total_score;
        delete flag;
        //清零
        person_num=0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值