/以下是我写的c++程序。
/函数f()的功能是去掉一个最大值和最小值后求平均值。
//跳水打分
#include<iostream>
using namespace std;
void f(double a[]); //参数是数组类型
//
int main()
{
double a[]={7.9,8.6,9.0,7.3,6.9,8.6,8.7,7.8,9.0};
f(a); //注意参数的传递
return 0;
}
//
void f(double a[])
{
int m=sizeof(a)/sizeof(double); //数组长度,error!!!仅仅将数组首地址传递给f(),无法求出长度(不知道何时结束)。
double sum=0.0;
//
for(int i=0; i<m-1; i++) //冒泡排序
for(int j=0; j<m-i-1; j++)
if(a[j]<a[j+1])
{ double temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
} //交换
//
for(int i=1; i<m-1; i++)
sum+=a[i];
//
cout<<sum/(m-2.0);
}
tips:传递整个数组作为参数时,为什么还需要数组的长度作为参数??
传递数组作为参数时只传递了数组在内存中的首地址,但对于数组有多大,必须由数组长度来确定。否则的话函数中对于数组的操作可能会越界,即对原本不属于数组的内存进行了修改,这样可能会导致程序出错。
当然,假如你能用其他方法来判断数组的结束地址,比如数组的最后一个元素设为一个特殊值,那么你也可以不用传递数组长度。(c++中string类型也是如此)
修改如下:
#include<iostream>
using namespace std;
void f(double a[],int ); //参数是数组类型,int 数组长度
//
int main()
{
double a[]={7.9,8.6,9.0,7.3,6.9,8.6,8.7,7.8,9.0};
int m= m=sizeof(a)/sizeof(double); //先求出数组长度m,传递给f()
f(a, m); //注意参数的传递
return 0;
}
//
void f(double a[], int m)
{
double sum=0.0;
for(int i=0; i<m-1; i++) //冒泡排序
for(int j=0; j<m-i-1; j++)
if(a[j]<a[j+1])
{ double temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
} //交换
for(int i=1; i<m-1; i++)
sum+=a[i];
//
cout<<sum/(m-2.0);
}
// 输出结果:8.27163