#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作为参数传进去,这样更通用。
1. 这个需求没必要排序。只要一次循环,把10个数求和的同时找出最大值和最小值,然后减去它俩就行了,线性复杂度,比排序简单而且快多了。
2. 两个整数运算的结果还是整数。如果想得到浮点数的结果,或者改成aver=sum/8.0;或者把sum定义为double类型。
3. 建议给average加一个参数作为专家的人数,把10作为参数传进去,这样更通用。
#2
如果一定要用冒泡排序,这一行改成这样就好了:
for(i=0;i<10-j;i++)
排序算法很多,适用不同情况。这个场合,用鸽巢排序或计数排序应该是最快的
for(i=0;i<10-j;i++)
排序算法很多,适用不同情况。这个场合,用鸽巢排序或计数排序应该是最快的
#3
数组的起始的下标为0,但你在冒泡排序的时候,你是从1开始的,所以你漏了一个数
正确的应该是
for(i=1;i<=9;i++)
for(j=0;j<=9-i;j++)
正确的应该是
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作为参数传进去,这样更通用。
1. 这个需求没必要排序。只要一次循环,把10个数求和的同时找出最大值和最小值,然后减去它俩就行了,线性复杂度,比排序简单而且快多了。
2. 两个整数运算的结果还是整数。如果想得到浮点数的结果,或者改成aver=sum/8.0;或者把sum定义为double类型。
3. 建议给average加一个参数作为专家的人数,把10作为参数传进去,这样更通用。
#2
如果一定要用冒泡排序,这一行改成这样就好了:
for(i=0;i<10-j;i++)
排序算法很多,适用不同情况。这个场合,用鸽巢排序或计数排序应该是最快的
for(i=0;i<10-j;i++)
排序算法很多,适用不同情况。这个场合,用鸽巢排序或计数排序应该是最快的
#3
数组的起始的下标为0,但你在冒泡排序的时候,你是从1开始的,所以你漏了一个数
正确的应该是
for(i=1;i<=9;i++)
for(j=0;j<=9-i;j++)
正确的应该是
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
哎...不知道分数怎么分配出问题了,我第一次发帖,没分配到分数的抱歉啦,谢谢大家了!