新手求助一道C++题目,不知道自己错在哪里了

时间:2021-04-24 16:14:52
9. 假设某次比赛聘请了10位专家为选手评分,参赛选手共计2位。评分数据已知并保存在2个一维数组a1, a2中。每位选手的最终成绩计算方法是: 去掉1个最高分和1个最低分后,求剩余评分的平均值作为最终成绩。请编程计算每位选手的最终成绩。(10分)
#include <iostream>
using namespace std;
double average(int a[])
{
    int j,i;
    int t;
    for(j=1;j<=9;j++)
    for(i=1;i<=10-j;i++)

        if(a[i]>a[i+1])
         {
          t=a[i];
         a[i]=a[i+1];
         a[i+1]=t;
         }
    int m,sum=0;
    float aver;
    for(m=1;m<=8;m++)
     {sum=sum+a[m];
     cout<<sum<<"*";//此处用于调试,但发现相加和不对
     }
     aver=sum/8;
    return aver;
}
int main()
{
    double aver1,aver2;
    int a[10]={2,5,9,8,7,3,6,4,1,7};
    int b[10]={1,3,5,2,3,4,5,6,1,2};
    aver1=average(a);
    cout<<"a的平均分为"<<aver1;
    aver2=average(b);
    cout<<"b的平均分为"<<aver2;
    return 0;

}
谢谢!

7 个解决方案

#1


感觉是排序出错了。暂时没时间细看,先说点其他的:
1. 这个需求没必要排序。只要一次循环,把10个数求和的同时找出最大值和最小值,然后减去它俩就行了,线性复杂度,比排序简单而且快多了。
2. 两个整数运算的结果还是整数。如果想得到浮点数的结果,或者改成aver=sum/8.0;或者把sum定义为double类型。
3. 建议给average加一个参数作为专家的人数,把10作为参数传进去,这样更通用。

#2


如果一定要用冒泡排序,这一行改成这样就好了:
    for(i=0;i<10-j;i++)

排序算法很多,适用不同情况。这个场合,用鸽巢排序或计数排序应该是最快的

#3


数组的起始的下标为0,但你在冒泡排序的时候,你是从1开始的,所以你漏了一个数
正确的应该是
for(i=1;i<=9;i++)
  for(j=0;j<=9-i;j++)

#4


注意冒泡排序的下标

#include <iostream>
using namespace std;
double average(int a[])
{
int j,i;
int t;
for(j=1;j<=9;j++)
for(i=0;i<=9-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
int m,sum=0;
float aver;
for(m=1;m<=8;m++)
{sum=sum+a[m];
cout<<sum<<"*";//此处用于调试,但发现相加和不对
}
aver=sum/8;
return aver;
}
int main()
{
double aver1,aver2;
int a[10]={2,5,9,8,7,3,6,4,1,7};
int b[10]={1,3,5,2,3,4,5,6,1,2};
aver1=average(a);
cout<<"a的平均分为"<<aver1 <<endl;
aver2=average(b);
cout<<"b的平均分为"<<aver2<<endl;
return 0;

}

#5



int a[10]={2,5,9,8,7,3,6,4,1,7};
sort(a, a + 10);
double arge_a = accumulate(a + 1, a + 9, 0) / 8; //arge_a = 5.0000000000000000

#6


谢谢大家的指正,已经算出来了,因为我是初学,并没有学得特别深入,有些方法还不会,谢谢大家的帮助,我会继续努力的!

#7


哎...不知道分数怎么分配出问题了,我第一次发帖,没分配到分数的抱歉啦,谢谢大家了!

#1


感觉是排序出错了。暂时没时间细看,先说点其他的:
1. 这个需求没必要排序。只要一次循环,把10个数求和的同时找出最大值和最小值,然后减去它俩就行了,线性复杂度,比排序简单而且快多了。
2. 两个整数运算的结果还是整数。如果想得到浮点数的结果,或者改成aver=sum/8.0;或者把sum定义为double类型。
3. 建议给average加一个参数作为专家的人数,把10作为参数传进去,这样更通用。

#2


如果一定要用冒泡排序,这一行改成这样就好了:
    for(i=0;i<10-j;i++)

排序算法很多,适用不同情况。这个场合,用鸽巢排序或计数排序应该是最快的

#3


数组的起始的下标为0,但你在冒泡排序的时候,你是从1开始的,所以你漏了一个数
正确的应该是
for(i=1;i<=9;i++)
  for(j=0;j<=9-i;j++)

#4


注意冒泡排序的下标

#include <iostream>
using namespace std;
double average(int a[])
{
int j,i;
int t;
for(j=1;j<=9;j++)
for(i=0;i<=9-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
int m,sum=0;
float aver;
for(m=1;m<=8;m++)
{sum=sum+a[m];
cout<<sum<<"*";//此处用于调试,但发现相加和不对
}
aver=sum/8;
return aver;
}
int main()
{
double aver1,aver2;
int a[10]={2,5,9,8,7,3,6,4,1,7};
int b[10]={1,3,5,2,3,4,5,6,1,2};
aver1=average(a);
cout<<"a的平均分为"<<aver1 <<endl;
aver2=average(b);
cout<<"b的平均分为"<<aver2<<endl;
return 0;

}

#5



int a[10]={2,5,9,8,7,3,6,4,1,7};
sort(a, a + 10);
double arge_a = accumulate(a + 1, a + 9, 0) / 8; //arge_a = 5.0000000000000000

#6


谢谢大家的指正,已经算出来了,因为我是初学,并没有学得特别深入,有些方法还不会,谢谢大家的帮助,我会继续努力的!

#7


哎...不知道分数怎么分配出问题了,我第一次发帖,没分配到分数的抱歉啦,谢谢大家了!