解释C语言程序,详细说明每一步作用

程序大意:在三维直角坐标戏中(Z值为0,相当于二维),先定义一个class1以个一个点为中心,以某个值为“半径d”,第二个点与第一个点的距离D21小于“半径d”,则第二个点属于class1,如果距离大于“半径d”则产生新的class2,并以第二个点为中心,“半径”仍为“d”,第三个点与第一、二个点距离为D31、D32,D31和D32同时大于“半径d”的话则产生新的class3以第三点为中心,否则第三点属于距离较近的点所在的class,例如,如果D31小于D32小于“半径d”则第三点属于class1,依次下去20个点,最后表现出各个class的中心是哪些点,并表示出20个点各属于哪个class。

#include "stdio.h"
#include "math.h"

int x[20][3] = {{ 3, 1, 0},
{ 1, 4, 0},
{ 2, 5, 0},
{ 2, 2, 0},
{ 3, 3, 0},
{110, 98, 0},
{100,100, 0},
{ 96,112, 0},
{ 99, 99, 0},
{105,110, 0},
{ 6,101, 0},
{ 1, 94, 0},
{ 7, 95, 0},
{ 2,102, 0},
{ 114, 93, 0},
{101, 1, 0},
{ 99, 4, 0},
{ 98, 7, 0},
{ 95, 15, 0},
{103, 113, 0}};

float distance(int a,int b)
{
float d;

d=sqrt((x[b][0]-x[a][0])*(x[b][0]-x[a][0])+(x[b][1]-x[a][1])*(x[b][1]-x[a][1]));
return d;
}

void main()
{
int i,j,m,n=1;
float d,min;
printf("Please input d:");
scanf("%f",&d);
printf("\n");
x[0][2]=20+n++; // 最后一位[2]作为标志位,大于20为class!
for(i=1;i<20;i++)
{
min=d;m=i;
for(j=0;j<i;j++)
if(x[j][2]>20 && min>distance(j,i))
{min=distance(j,i);m=j;}
if(min==d)
x[i][2]=20+n++;
else
x[i][2]=x[m][2]-20;
}
for(i=0;i<20;i++)
if(x[i][2]>20)
printf("Cluster center%2d = X[%2d][] = {%3d,%3d,0}\n",x[i][2]-20,i,x[i][0],x[i][1]);
printf("\n");
for(i=0;i<20;i++)
if(x[i][2]<20)
printf("X[%2d][] = {%3d,%3d,0} = Cluster %2d \n",i,x[i][0],x[i][1],x[i][2]);
}

#include "stdio.h"
#include "math.h"

int x[20][3] = {{ 3, 1, 0},
{ 1, 4, 0},
{ 2, 5, 0},
{ 2, 2, 0},
{ 3, 3, 0},
{110, 98, 0},
{100,100, 0},
{ 96,112, 0},
{ 99, 99, 0},
{105,110, 0},
{ 6,101, 0},
{ 1, 94, 0},
{ 7, 95, 0},
{ 2,102, 0},
{ 114, 93, 0},
{101, 1, 0},
{ 99, 4, 0},
{ 98, 7, 0},
{ 95, 15, 0},
{103, 113, 0}};

float distance(int a,int b) //距离函数,求两个点之间的距离,只计算前两维。
{
float d;

d=sqrt((x[b][0]-x[a][0])*(x[b][0]-x[a][0])+(x[b][1]-x[a][1])*(x[b][1]-x[a][1]));
return d;
}

void main()
{
//这个程序是把类的编号放在坐标的第三维,因为坐标的第三维均为0没有用,所以正好利用起来。
//对类的编号从1开始编号,如果类的编号为i(i=1,2,3...),则类中心点的坐标第3维对应存储的数据为20+i。
//对非类中心点的点,其存储的是对应所属类的编号。
//因此,最后打印的时候,根据第3维的数据是否大于20可以判断是否是类的中心点。

int i,j,m,n=1;
float d,min;
printf("Please input d:"); //输入半径d
scanf("%f",&d);
printf("\n");
x[0][2]=20+n++; // 最后一位[2]作为标志位,大于20为class!
for(i=1;i<20;i++)
{
min=d;m=i;
for(j=0;j<i;j++)
if(x[j][2]>20 && min>distance(j,i)) //x[j][2]>20表明x[j]为class的中心,min>distance(j,i)表明i和j的距离比原先的距离还要小。
//此句的目的是把i这个点与原先已经计算出来的class中心分别计算距离,并保存距离的最小值到变量min中,其对应class中心点编号放到m中
{
min=distance(j,i);m=j;
}
if(min==d) //如果此式成立,表明最小距离都比d要大,因此开辟出一个新类。
x[i][2]=20+n++;
else
x[i][2]=x[m][2]-20; //归入已存在类。
}
for(i=0;i<20;i++) //打印所有的类及类的中心点
if(x[i][2]>20)
printf("Cluster center%2d = X[%2d][] = {%3d,%3d,0}\n",x[i][2]-20,i,x[i][0],x[i][1]);
printf("\n");
for(i=0;i<20;i++) //打印所有的非类中心点的点所属的类及这些点的坐标。
if(x[i][2]<20)
printf("X[%2d][] = {%3d,%3d,0} = Cluster %2d \n",i,x[i][0],x[i][1],x[i][2]);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-12-11
这题目也问?

认真看看
对基础帮助很大的
相似回答