⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 y1.cpp

📁 层次聚类算法的c++实现
💻 CPP
字号:
/*Title:学生层次聚类查询系统
 *Author :ZhengNan
 *Date   :2007.5.20
 *class:计算0503
*/
#include<math.h>
#include<string.h>
#include<iostream.h>
#include<malloc.h>
#include<stdio.h>
int T=52;
 struct student
 {
    char na[20];
    float h; // 定义身高
    float l; // 定义头发长度
    int nu ;  //给学生编码
 } ;

  struct  student stu[52]={{"LiYinglong",170,11,1},{"HanLanju",170,40,2},{"Zhaoyujing",162,40,3},{"HeZhongfei",173,13,4},{"JiaoDujuan",150,25,5},{"LiTao",167,1,6},{"MiaoQing" ,165,45,7},
   {"PangJiwei",176,10,8},{"LiXinghui",170,10,9},{"YuHongru",163,45,10},{"WuZhihao",180,10,11},{"LiuZhongyu",172,9,12},{"LinJinteng",176,5,13},{"LvYaoming",170,5,14},{"LiuJin",170,8,15},{"ZhengNan",158,40,16},
   {"LiuGang",177,8,17},{"ChenYunLong",175,10,18},{"XiaBing",175,9,19},{"XieNan",160,42,20},{"TangYuedong",172,15,21},{"PanGuisheng",180,10,22},{"ZuoShanshan",158,30,23},{"LiZhongyi",171,2,24},
   {"ZhangMeng",174,3,25},{"WangMing",165,15,26},{"LiuJia",float(174.5),7,27},{"LiuWeiwei",183,11,28},{"ChenXiaoping",160,25,29},{"WuMinxia",160,15,30},{"XuYuhan",157,39,31},{"GaoRui",155,37,32},{"QiFengjuan",150,20,33},
   {"ZhangXiaoliang",173,5,34},{"GuoJianqi",178,11,35},{"MuZhaoxi",162,10,36},{"LiuJunjie",174,8,37},{"SunShengjing",168,20,38},{"LiYingjie",155,25,39},{"LinJia",float(170.6),12,40},{"XuWenshi",185,10,41},
   {"ChenWeiping",171,10,42},{"YangJingyu",165,8,43},{"ZhouHaibin",178,12,44},{"ZhangJinhu",174,2.5,45},{"WangZhengyong",175,6,46},{"XieFeng",170,10,47},{"YangYang",170,3,48},{"YangWeiliang",180,7,49},
   {"LiuDeli",179,8,50},{"YuPeipei",160,2,51},{"FuLiang",float(176.7),3,52}};

  struct Leizu
  {
    float hight; //代表此类组的H值
    float length; //代表此类组的L值
    int ab[53]; //此类组包含的学生号码
    int o;//记录数组元素个数
  };
struct Leizu lei[53];

void Merge(struct Leizu lei[52])
{   
	float **m;
	m = (float**)malloc((T+1)*sizeof(float*));
	for(int ii = 0; ii < T+1; ii++ )
	{
		m[ii] = (float*)malloc((T+1)*sizeof(float));
	}

      int i,j,i1,j1,st1,st2,p1,p2,p4,p3; //st1,st2为要合并的类别
	  float a,b,c=0,min;
      //建立距离距阵
      for(i=1;i<=T;i++)
      {
        for(j=i;j<=T;j++)
         { 
            a=lei[i].hight -lei[j].hight;
            b=lei[i].length -lei[j].length;
            c=float(sqrt(a*a+b*b));
            m[j][i]=c;
            m[i][j]=c;
         }
      }
      min=m[1][2];
      //查找最小距离类组
      for(i1=1;i1<=T;i1++)
      {
         for(j1=i1+1;j1<=T;j1++)
         {
            if(m[i1][j1]<min)
            {
               min=m[i1][j1];
               st1=i1;
               st2=j1;
            }
         }
      }

     //合并最小距离的类组 
     if(st1>st2)
     {
         p1=st1;
         st2=st1;
         st1=p1;
     }
     p3=lei[st1].o;
     lei[st1].hight=(lei[st1].hight+lei[st2].hight)/2;
     lei[st1].length=(lei[st1].length+lei[st2].length)/2;
     
     
     for(p2=1;p2<=lei[st2].o;p2++)
     {
         p3++;
         lei[st1].ab[p3]=lei[st2].ab[p2];
     }


     lei[st1].o=lei[st1].o+lei[st2].o;
     
	 for(p4=st2;p4<T;p4++) //类组对象调整,后面留出空位
     {
         lei[p4]=lei[p4+1];
     }
	 
}

void main()
{
   int i,n,j,p,x;
   printf("         ************************************************\n");
   printf("                 欢迎进入学生层次聚类信息查询系统\n");
   printf("         ************************************************\n");
   printf("\n请输入你要分成的类别数:\n");
   scanf("%d",&n);

   //初始化类组 
   int k1;
   for(k1=1;k1<=52;k1++)
   {
      lei[k1].hight=stu[k1-1].h;
      lei[k1].length=stu[k1-1].l;
      lei[k1].ab[1]=k1 ;
      lei[k1].o=1;
   }
   if(n==1)
   {  printf("\n第1个类(52个学生元素):\n");
	  for(int u=1;u<=52;u++)
	     printf("%s     ",stu[u-1].na);
   }
  else
  {
	  for(x=1;x<=(52-n);x++)
	  {  
      Merge(lei);
      T=T-1;
	  }
      printf("\n");
   
    //类组元素输出
    for(i=1;i<=n;i++)
	{
     printf("\n第%d个类(%d个学生元素):\n",i,lei[i].o);

      for(j=1;j<=52;j++)
	  {
        p=lei[i].ab[j];
        if(p)
        {
           printf("%s     ",stu[p-1].na);
        }
	  }
	}
  }
  
}













⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -