描述以下代码的逻辑结构：#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//定义球队的结构体
typedef struct team
{
    char name[20];    //姓名
    double score[3];   //3组积分
    double dist[3];   //存放一个点到三个中心点的距离
    int id;           //用于表示该队属于哪一簇
}TEAM;
TEAM T[15];

//定义中心点的结构体
typedef struct center
{
    double a;
    double b;
    double c;
}CENTER;
CENTER C[3];


void js_dist(TEAM T[],CENTER C[]);
void xz_center(TEAM T[]);
void js_center(TEAM T[],CENTER XC[]);
void compare(TEAM T[]);
void shuchu(TEAM T[]);

int i_jix;    //定义全局变量表示是否继续聚类

int main()
{
    FILE *fp;
    int i;
    char filename[100];

    sprintf(filename,".\\data1.txt");
    fp=fopen(filename,"r");
    if(fp == NULL)   //打开文件出错
    {
        printf("打开文件data1失败！");
        exit(0);
    }
    while(!feof(fp))  //读取数据并保存到数组中
        {
            for(i=0;i<15;i++)
            {
                fscanf(fp,"%s %lf %lf %lf",T[i].name,&T[i].score[0],&T[i].score[1],&T[i].score[2]);
            }
        }
    for(i=0;i<15;i++)
        {
            printf("%s\t\t %lf\t %lf\t %lf\t\n",T[i].name,T[i].score[0],T[i].score[1],T[i].score[2]);
        }
    printf("\n");

    //规格化数据
    //找到每一年的最大值和最小值
    int j;
    double max,min;
    double maxx[3],minn[3];

    for(j=0;j<3;j++)
    {
        max=min=T[0].score[j];
        for(i=0;i<15;i++)
        {
            if(T[i].score[j]>max)
                max=T[i].score[j];
            maxx[j]=max;
            if(T[i].score[j]<min)
                min=T[i].score[j];
            minn[j]=min;
        }
    }
    //映射
    for(i=0;i<15;i++)
    {
        for(j=0;j<3;j++)
        {
            T[i].score[j]=(T[i].score[j]-minn[j])/(maxx[j]-minn[j]);
            //T[i].score[j] =(int)((T[i].score[j] * 100) + 0.5) / 100.0;
            //float b =(int)((b * 100) + 0.5) / 100.0;
        }
    }
    printf("映射后的结果：\n");
    for(i=0;i<15;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%lf\t",T[i].score[j]);
        }
        printf("\n");
    }
    printf("\n");

    //即将这15支球队分成三个集团。
    //抽取日本、巴林和泰国的值作为三个簇的种子
    //即初始化三个簇的中心
    CENTER C[3]={{T[1].score[0],T[1].score[1],T[1].score[2]},
                        {T[12].score[0],T[12].score[1],T[12].score[2]},
                        {T[9].score[0],T[9].score[1],T[9].score[2]}
                       };
    i_jix=1;
    while(i_jix==1)
    {
        js_dist(T,C);    //计算每个数据对象到聚类中心的距离
        xz_center(T);     //将每支球队分到最近的簇
        js_center(T,C);   //计算簇的新中心

        js_dist(T,C);   //用调整后的中心点再次计算距离D
        compare(T);    //比较结果有无变化
    }

    shuchu(T);

    return 0;
}

//计算每个数据对象到聚类中心的距离
void js_dist(TEAM T[],CENTER C[])
{
    int i;
    for(i=0;i<15;i++)
    {
        T[i].dist[0]=sqrt(pow((T[i].score[0]-C[0].a),2)+pow((T[i].score[1]-C[0].b),2)+pow((T[i].score[2]-C[0].c),2));
        T[i].dist[1]=sqrt(pow((T[i].score[0]-C[1].a),2)+pow((T[i].score[1]-C[1].b),2)+pow((T[i].score[2]-C[1].c),2));
        T[i].dist[2]=sqrt(pow((T[i].score[0]-C[2].a),2)+pow((T[i].score[1]-C[2].b),2)+pow((T[i].score[2]-C[2].c),2));
    }
}

//将每支球队分到最近的簇
void xz_center(TEAM T[])
{
    int i,j;
    double min;
    for(i=0;i<15;i++)
    {
        min=T[i].dist[0];
        for(j=0;j<3;j++)
        {
            if(T[i].dist[j]<min)
            {
                min=T[i].dist[j];
                T[i].id=j;
            }
        }
    }
}

//计算簇的新中心
void js_center(TEAM T[],CENTER C[])
{
    int i,count0=0,count1=0,count2=0;
    for(i=0;i<3;i++)
    {
        C[i].a=0;
        C[i].b=0;
        C[i].c=0;
    }
    for(i=0;i<15;i++)
    {
        if(T[i].id==0)      //C[0]代表；A簇
        {
            C[0].a+=T[i].score[0];
            C[0].b+=T[i].score[1];
            C[0].c+=T[i].score[2];
            count0++;
        }

        if(T[i].id==1)      //C[1]代表；B簇
        {
            C[1].a+=T[i].score[0];
            C[1].b+=T[i].score[1];
            C[1].c+=T[i].score[2];
            count1++;
        }

        if(T[i].id==2)      //C[2]代表；C簇
        {
            C[2].a+=T[i].score[0];
            C[2].b+=T[i].score[1];
            C[2].c+=T[i].score[2];
            count2++;
        }
    }
    C[0].a=C[0].a/count0;
    C[0].b=C[0].b/count0;
    C[0].c=C[0].c/count0;

    C[1].a=C[1].a/count1;
    C[1].b=C[1].b/count1;
    C[1].c=C[1].c/count1;

    C[2].a=C[2].a/count2;
    C[2].b=C[2].b/count2;
    C[2].c=C[2].c/count2;

}

void compare(TEAM T[])
{
    i_jix=0;
    int i,j,temp;
    double min1;
    for(i=0;i<15;i++)
    {
        min1=T[i].dist[0];
        temp=0;
        for(j=0;j<3;j++)
        {
            if(T[i].dist[j]<min1)
            {
                min1=T[i].dist[j];
                temp=j;
            }
        }
        if(T[i].id != temp)   //若存在不相同的，则退出循环，并标记i_jix=1
        {
            i_jix=1;
            break;
        }
    }

}

void shuchu(TEAM T[])
{
    int i;
    printf("一：");
    for(i=0;i<15;i++)
    {
        if(T[i].id==0)
        {
            printf("%s,",T[i].name);
        }
    }
    printf("\n二：");
    for(i=0;i<15;i++)
    {
        if(T[i].id==1)
        {
            printf("%s,",T[i].name);
        }
    }
    printf("\n三：");
    for(i=0;i<15;i++)
    {
        if(T[i].id==2)
        {
            printf("%s",T[i].name);
        }
    }

}