部分需要注意的地方:
1 ,
double ClosestPoints(int psize,int **p,int & ind1,int & ind2);
用return只能返回一个值,因此这里函数的参数表中增加了引用类型的变量 &ind1,&ind2 , 这样传进子函数中的参数在子函数中变化的同时,主函数中也会改变
2 , 不知大小的二维数组的动态分配内存构建
C++
p = new int *[psize];
for(int i=0;i<psize;i++)
{
p[i] = new int[3];
}
C语言
int **p;
p=(int **)calloc(sizeof(int *),psize);
for(int i=0;i<psize;i++)
{
*(p+i)=(int *)calloc(sizeof(int ),psize);
}
3 , c++的<float.h>头文件中定义了FLT_MAX这个常量表示float类型的最大值
(其中也记录了double类型的最值)
而int类型是记录在<limits.h>头文件中,
int a=INT_MAX;。
完整代码如下:
#include"iostream"
#include"cmath"
using namespace std;
double ClosestPoints(int psize,int **p,int & ind1,int & ind2);
/*但是用return只能返回一个值,因此这里函数的参数表中增加了引用类型的变量 &ind1,&ind2
这样传进子函数中的参数在子函数中变化的同时,主函数中也会改变*/
int main()
{
int n,mind;
double z;
int psize;//元素个数
cout<<"请输入数组的大小:";
cin>>psize;
int **p; /*在未知数组大小的时候可以用动态分配内存的方法定义数组(一维二维均可)
此处为用二级指针指向一个二维数组*/
p = new int *[psize];
for(int i=0;i<psize;i++)
{
p[i] = new int[3];
} /*到此,二维数组的动态分配内存构建完成*/
for(int i=0;i<psize;i++)
{
cout<<"第"<<i+1<<"个坐标: "<<endl;
cin>>p[i][0]>>p[i][1];
} //输入坐标值
int ind1=0;
int ind2=0;
z=ClosestPoints(psize,p,ind1,ind2);
cout<<"最近对的最短距离是:"<<sqrt(z)<<endl;
cout<<"分别为:坐标"<<ind1+1<<" 坐标"<<ind2+1<<endl;
return 0;
}
double ClosestPoints(int psize,int **p,int &ind1,int &ind2)
{
double mind=FLT_MAX; /*c++的<float.h>头文件中定义了FLT_MAX这个常量表示float类型的最大值
(其中也记录了double类型的最值,
而int类型是记录在<limits.h>头文件中)int a=INT_MAX*/
double dis =0;
for(int i=0;i<=psize-2;i++)
{
for(int j=i+1;j<=psize-1;j++)
{
dis=(p[j][0]-p[i][0])*(p[j][0]-p[i][0])+(p[j][1]-p[i][1])*(p[j][1]-p[i][1]);
if(dis<mind)
{
mind=dis;
ind1=i;
ind2=j;
}
}
}
return mind;
}