原创 树状数据检索的C语言实现

2011-3-22 16:26 1880 9 9 分类: MCU/ 嵌入式

#define  GATE_SIZE   1    //门牌号 2^0
#define  UNIT_SIZE   256    //单元号 2^8
#define  BUILD_SIZE   65526   //楼号   2^16
#define  COMMUNITY_SIZE  16777216  //小区   2^24

 int i,j;
 bool ExitFlag = 0;
 unsigned int tmpproperty = 0;
 METER tmpMeter;
 for (i = 0; i < g_arrMeter.GetSize(); i++)
 {
  tmpMeter = g_arrMeter.GetAt(i);
  tmpMeter.Property = 0;
 }

 typedef struct
 {
  char name1[60];   //小区名字
  char name2[12];   //楼号
  char name3[12];   //单元号
  char name4[12];   //门牌号
  int  num;    //序号
 }ADDRESS;
 ADDRESS tmpAddr;
 CArray<ADDRESS,ADDRESS>  StructAddr;

 StructAddr.RemoveAll();
//小区号
 tmpMeter = g_arrMeter.GetAt(0);  //第一家
 sprintf(tmpAddr.name1,tmpMeter.CommunityName);
 tmpAddr.num = COMMUNITY_SIZE;
 StructAddr.Add(tmpAddr);
 tmpMeter.Property += tmpAddr.num;
 
 for (i = 1; i < g_arrMeter.GetSize(); i++)  
 {
  ExitFlag = 0;
  tmpMeter = g_arrMeter.GetAt(i);
  for (j=0; j<StructAddr.GetSize(); j++)
  {
   tmpAddr = StructAddr.GetAt(j);
   if (strcmp(tmpMeter.CommunityName,tmpAddr.name1) == 0) //相同,即存在
   {
    ExitFlag = 1;
    tmpMeter.Property += tmpAddr.num;
    break;
   }
  }
  if (!ExitFlag)  //新的,需添加
  {
   sprintf(tmpAddr.name1,tmpMeter.CommunityName);
   tmpAddr.num += COMMUNITY_SIZE;
   StructAddr.Add(tmpAddr);
   tmpMeter.Property += tmpAddr.num;
  }
 }
 TCHAR T_name[60];
 for (i=0; i<StructAddr.GetSize(); i++)//保存一份完整的小区信息,全局调用
 {
  tmpAddr = StructAddr.GetAt(i);
  CharToTChar(tmpAddr.name1,T_name,60);
  m_COMMUNITY.AddString(LPCTSTR(T_name));
 }
 //楼号
 StructAddr.RemoveAll();
 tmpMeter = g_arrMeter.GetAt(0);  //第一家
 sprintf(tmpAddr.name2,tmpMeter.BuildNo);
 tmpAddr.num = BUILD_SIZE;
 StructAddr.Add(tmpAddr);
 tmpMeter.Property += tmpAddr.num;
 for (i = 1; i < g_arrMeter.GetSize(); i++)  
 {
  ExitFlag = 0;
  tmpMeter = g_arrMeter.GetAt(i);
  for (j=0; j<StructAddr.GetSize(); j++)
  {
   tmpAddr = StructAddr.GetAt(j);
   if (strcmp(tmpMeter.BuildNo,tmpAddr.name2) == 0) //楼号相同,判断小区号是否相同
   {
    if (strcmp(tmpMeter.CommunityName,tmpAddr.name1) == 0) //小区也相同,则确定,是同一栋楼
    {
     ExitFlag = 1;
     tmpMeter.Property += tmpAddr.num;
     break;
    }
   }
  }
  if (!ExitFlag)  //新的,需添加
  {
   sprintf(tmpAddr.name2,tmpMeter.BuildNo);
   tmpAddr.num += BUILD_SIZE;
   StructAddr.Add(tmpAddr);
   tmpMeter.Property += tmpAddr.num;
  }
 }
 //单元号
 StructAddr.RemoveAll();
 tmpMeter = g_arrMeter.GetAt(0);  //第一家
 sprintf(tmpAddr.name3,tmpMeter.UnitNo);
 tmpAddr.num = UNIT_SIZE;
 StructAddr.Add(tmpAddr);
 tmpMeter.Property += tmpAddr.num;
 for (i = 1; i < g_arrMeter.GetSize(); i++)
 {
  ExitFlag = 0;
  tmpMeter = g_arrMeter.GetAt(i);
  for (j=0; j<StructAddr.GetSize(); j++)
  {
   tmpAddr = StructAddr.GetAt(j);
   if (strcmp(tmpMeter.UnitNo,tmpAddr.name3) == 0)  //单元号相同,需向上依次判断楼号、小区号,以确定是否是同一单元
   {
    if (strcmp(tmpMeter.BuildNo,tmpAddr.name2) == 0) //楼号相同,判断小区号是否相同
    {
     if (strcmp(tmpMeter.CommunityName,tmpAddr.name1) == 0) //小区也相同,则确定,是同一
     {
      ExitFlag = 1;
      tmpMeter.Property += tmpAddr.num;
      break;
     }
    }
   }
  }
  if (!ExitFlag)  //新的,需添加
  {
   sprintf(tmpAddr.name2,tmpMeter.BuildNo);
   tmpAddr.num += UNIT_SIZE;
   StructAddr.Add(tmpAddr);
   tmpMeter.Property += tmpAddr.num;
  }
 }

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条