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

📄 gridctrldemodlg.cpp

📁 一个用于地板厂家将不同长度的地板装箱的自动配比程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	 m_Gre.SetRowCount (1);
	 m_index3=0;
     int divi;
	 switch (m_way)
	 {
	 case 1:  divi=1200; break;
	 case 2:  divi=1000; break;
	 case 3:  divi=900;  break;
	 }
	UpdateData(true);
   long totalnum=0;
  gg=(long*)malloc((m_total+1)*sizeof(long));
  sl=(long*)malloc((m_total+1)*sizeof(long));

  //read data
	long val;
  	for (int row = 1; row <=m_total; row++)
		{ 
		   for(int col=0;col<2;col++)
		   {
		    GV_ITEM Item;
			Item.mask = GVIF_TEXT|GVIF_FORMAT;
			Item.row = row;
			Item.col = col;
		   m_GridCtrl.GetItem(&Item);
		   val=atoi(Item.szText);
		   if(col==0)
		       gg[row]=val;
		   else
		   {
			   sl[row]=val;
		       totalnum+=val;
		   }
		   }
		}
	   
//start compute

	//define var
	m_palcount=1;
    long  maxpal;
    int len1,len2,len3,count;
    typedef struct Node2 {
		         long gg1,gg2;
				 long con;
                 struct Node2 *next;
	}Node2,*PNode2;
    typedef struct Node3 {
		         long gg1,gg2,gg3;
				 long con;
                 struct Node3 *next;
	}Node3,*PNode3;

	PNode2 p2,h2;
	PNode3 p3,h3;

	//the virtual number of pal
	 maxpal=totalnum/34;

	//Init link
	 h2=(PNode2)malloc(sizeof(Node2));
	 h2->next=NULL;
	 h3=(PNode3)malloc(sizeof(Node3));
	 h3->next=NULL;

    //find 2 blocks
	 for(len1=1500;len1>divi;len1-=50)
	 {
	   len2=m_len-len1;
	   if((sl[find(len1)]<=0)||(sl[find(len2)]<=0)) continue;
	   count=sl[find(len1)]-sl[find(len2)];
       if(count<0)
	   {
	      // insert node
		  p2=(PNode2)malloc(sizeof(Node2));
		  p2->gg1=len1;
		  p2->gg2=len2;
		  p2->con=sl[find(len1)];
		  p2->next=h2->next;
		  h2->next=p2;
		  //change data 
		  sl[find(len1)]=0;
		  sl[find(len2)]=(-count);
		  m_palcount++;
	   }
	   else
	   {
	   // insert node
		  p2=(PNode2)malloc(sizeof(Node2));
		  p2->gg1=len1;
		  p2->gg2=len2;
		  p2->con=sl[find(len2)];
		  p2->next=h2->next;
		  h2->next=p2;
		  //change data 
		  sl[find(len2)]=0;
		  sl[find(len1)]=count;
		  m_palcount++;
	   }
	 }

   // find 3 blocks
long min,left;
for(len1=divi;len1>=600;len1-=50)
{
	if(sl[find(len1)]<=0) continue;
	left=m_len-len1;
	for(len2=left-300;len2>=300;len2-=50)
	 {
	   len3=left-len2;
	   if((sl[find(len2)]<=0)||(sl[find(len3)]<=0)) continue;
	   if((find(len1)==find(len2))&&(find(len1)==find(len3))) 
		      min=sl[find(len1)]/3;
         else if(find(len1)==find(len2))
			      min=findmin(sl[find(len1)]/2,sl[find(len2)]/2,sl[find(len3)]);
	    else  if(find(len1)==find(len3))
			 min=findmin(sl[find(len1)]/2,sl[find(len2)],sl[find(len3)]/2);
		 else  if(find(len2)==find(len3))
			 min=findmin(sl[find(len1)],sl[find(len2)]/2,sl[find(len3)]/2);
		 else
		  min=findmin(sl[find(len1)],sl[find(len2)],sl[find(len3)]);
	   if(min<=0) continue;   
		// insert node
		  p3=(PNode3)malloc(sizeof(Node3));
		  p3->gg1=len1;
		  p3->gg2=len2;
		  p3->gg3=len3;
		  p3->con=min;
		  p3->next=h3->next;
		  h3->next=p3;
             //change data 
		     sl[find(len1)]-=min;
		     sl[find(len2)]-=min;
			 sl[find(len3)]-=min;
	  		  m_palcount++;

	 }//for
}//for

	//write the result
   
   	m_Gr.SetRowCount(m_palcount+6);
	
	        //write the 1 bar
	         m_Gr.SetBkColor (50);
			 m_Gr.SetGridColor (90);
			 for( int i=0;i<2;++i)
			  for(int j=0;j<5;j++)
			  {
				  m_Gr.SetItemBkColour (m_index+i,j,65535);
			      m_Gr.SetItemFgColour (m_index+i,j,100);
			  }
			 m_Gr.SetItemText (m_index,2,"含有1块的条");
			 m_index++;
			 m_Gr.SetItemText (m_index,0,"标准条编号");
			 m_Gr.SetItemText (m_index,1,"规格1");
			 m_Gr.SetItemText (m_index,2,"数量");
			 m_index++;
			 m_Gr.SetItemText (m_index,0,"T11");
			 m_Gr.SetItemText (m_index,1,"1800");
			 GV_ITEM Item;
			Item.mask = GVIF_TEXT|GVIF_FORMAT;
			Item.row = m_index;
			Item.col =2;
			Item.szText.Format("%ld",sl[find(1800)]);
			m_Gr.SetItem(&Item);
          
			//write the 2 bar
		     m_index++;
			 for(i=0;i<2;++i)
			  for(int j=0;j<5;j++)
			  {
				  m_Gr.SetItemBkColour (m_index+i,j,45535);
			      m_Gr.SetItemFgColour (m_index+i,j,500);
			  }
	   		 m_Gr.SetItemText (m_index,2,"含有2块的条");
			 m_index++;
	    	 m_Gr.SetItemText (m_index,0,"标准条编号");
			 m_Gr.SetItemText (m_index,1,"规格1");
			 m_Gr.SetItemText (m_index,2,"规格2");
			 m_Gr.SetItemText (m_index,3,"数量");

	for (row = 1,p2=h2->next; p2; p2=p2->next,row++)
		{ 
		 m_index++;
		 for(int col=0;col<4;col++)
		   {
		    switch (col)
			{
			case 0: val=row;break;
			case 1: val=p2->gg1; break;
			case 2: val=p2->gg2; break;
			case 3: val=p2->con; break;
			}
			
			GV_ITEM Item;
			Item.mask = GVIF_TEXT|GVIF_FORMAT;
			Item.row = m_index;
			Item.col = col;
			if(col==0)
			Item.szText.Format("T2%ld",val);
			else
				Item.szText.Format("%ld",val);
			m_Gr.SetItem(&Item);
		 }
		}

	//write the 3 bar
		     m_index++;
			 for( i=0;i<2;++i)
			  for(int j=0;j<5;j++)
			  {
				  m_Gr.SetItemBkColour (m_index+i,j,95535);
			      m_Gr.SetItemFgColour (m_index+i,j,65535);
			  }
	   		 m_Gr.SetItemText (m_index,2,"含有3块的条");
			 m_index++;
	    	 m_Gr.SetItemText (m_index,0,"标准条编号");
			 m_Gr.SetItemText (m_index,1,"规格1");
			 m_Gr.SetItemText (m_index,2,"规格2");
			 m_Gr.SetItemText (m_index,3,"规格3");
			 m_Gr.SetItemText (m_index,4,"数量");

	for (row = 1,p3=h3->next; p3; p3=p3->next,row++)
		{ 
		 m_index++;
		 for(int col=0;col<5;col++)
		   {
		    switch (col)
			{
			case 0: val=row;break;
			case 1: val=p3->gg1; break;
			case 2: val=p3->gg2; break;
			case 3: val=p3->gg3; break;
			case 4: val=p3->con; break;
			}
			
			GV_ITEM Item;
			Item.mask = GVIF_TEXT|GVIF_FORMAT;
			Item.row = m_index;
			Item.col = col;
			if(col==0)
			Item.szText.Format("T3%ld",val);
			else
				Item.szText.Format("%ld",val);
			m_Gr.SetItem(&Item);
		 }
		}

	m_Gr.AutoSize ();

//开始打成小包

  			 
m_baoc=1;
       m_Grb.SetRowCount (++m_baoc);
	      //write title 
           for(i=0;i<2;++i)
			  for(int j=0;j<3;j++)
			  {
				  m_Grb.SetItemBkColour (m_index2+i,j,65535);
			      m_Grb.SetItemFgColour (m_index2+i,j,100);
			  }
			 m_Grb.SetItemText (m_index2,0,"小包解决");
			 m_Grb.SetItemText (m_index2,1,"方案");
			 m_index2++;
			 m_Grb.SetItemText (m_index2,0,"包种类编号");
			 m_Grb.SetItemText (m_index2,1,"数量");
			 m_Grb.SetItemText (m_index2,2,"包内详情");
            m_Grb.AutoSize ();

		
			//compute total cocunt of 1 2 3

            m_to1=sl[find(1800)];
			m_to2=0;
			for(p2=h2->next;p2;p2=p2->next)  m_to2+=p2->con;
	        m_to3=0;
			for(p3=h3->next;p3;p3=p3->next)  m_to3+=p3->con;
	

            //begin to alloc
            
			int t2,t3,in;
			CString tit;
			// the way of T2*8+T3*6
			for(p2=h2->next,t2=1;p2;p2=p2->next,t2++)
			{
			   int con2=p2->con/8;
			   p2->con-=(con2*8);
               if(con2<=0) continue;
			   for(p3=h3->next,t3=1;p3;p3=p3->next,t3++)
			   {
			     int con3=p3->con/6;
				 if (con3==0) continue;
				 if(con2>con3)
				 {
				    //change data
					 con2-=con3;
					p3->con-=(con3*6);
					//write the result
                    m_Grb.SetRowCount (++m_baoc);
                    m_index2++;
					//write
					GV_ITEM Item;
		        	Item.mask = GVIF_TEXT|GVIF_FORMAT;
		        	Item.row = m_index2;
			        Item.col = 0;
			       	Item.szText.Format("B%ld",m_baoc-2);
					tit=Item.szText;
					m_Grb.SetItem(&Item);
					Item.col = 1;
			       	Item.szText.Format("%ld",con3);
					m_Grb.SetItem(&Item);
					Item.col = 2;
			       	Item.szText.Format("T2%d×8+T3%d×6",t2,t3);
					m_Grb.SetItem(&Item);
                    m_Grb.AutoSize ();

					//try to write to detial grid
				
					for(i=0;i<6;++i)
						for(int j=0;j<2;++j)
							ar[i][j]=0;
			    	 in=0;
					ar[in][0]=p2->gg1;
		            ar[in++][1]=8;
					ar[in][0]=p2->gg2;
		            ar[in++][1]=8;

					ar[in][0]=p3->gg1;
		            ar[in++][1]=6;
					ar[in][0]=p3->gg2;
		            ar[in++][1]=6;
					ar[in][0]=p3->gg3;
		            ar[in++][1]=6;

                   this->WriteDetail (tit);
			
				 }
				 else
				 {
				  //change data
					 p3->con-=(con2*6);
					//write the result
                    m_Grb.SetRowCount (++m_baoc);
                    m_index2++;
					//write
					GV_ITEM Item;
		        	Item.mask = GVIF_TEXT|GVIF_FORMAT;
		        	Item.row = m_index2;
			        Item.col = 0;
			       	Item.szText.Format("B%ld",m_baoc-2);
					tit=Item.szText;
					m_Grb.SetItem(&Item);
					Item.col = 1;
			       	Item.szText.Format("%ld",con2);
					m_Grb.SetItem(&Item);
					Item.col = 2;
			       	Item.szText.Format("T2%d×8+T3%d×6",t2,t3);
					m_Grb.SetItem(&Item);
                    m_Grb.AutoSize ();
					con2=0;

					//try to write to detial grid
				
					for(i=0;i<6;++i)
						for(int j=0;j<2;++j)
							ar[i][j]=0;
			    	in=0;
					ar[in][0]=p2->gg1;
		            ar[in++][1]=8;
					ar[in][0]=p2->gg2;
		            ar[in++][1]=8;

					ar[in][0]=p3->gg1;
		            ar[in++][1]=6;
					ar[in][0]=p3->gg2;
		            ar[in++][1]=6;
					ar[in][0]=p3->gg3;
		            ar[in++][1]=6;
					WriteDetail (tit);

					break;
				 }
			   }//for
              p2->con+=con2*8;
			}

			// the way of T1*4+T3*10
			
			   int con1=m_to1/4;
			   if(con1>0)
			   {
			   sl[find(1800)]-=con1*4;
               for(p3=h3->next,t3=1;p3;p3=p3->next,t3++)
			   {
			     int con3=p3->con/10;
				 if (con3==0) continue;
				 if(con1>con3)
				 {
				    //change data
					 con1-=con3;
					p3->con-=(con3*10);
					//write the result
                    m_Grb.SetRowCount (++m_baoc);
                    m_index2++;
					//write
					GV_ITEM Item;
		        	Item.mask = GVIF_TEXT|GVIF_FORMAT;
		        	Item.row = m_index2;
			        Item.col = 0;
			       	Item.szText.Format("B%ld",m_baoc-2);
					tit=Item.szText;
					m_Grb.SetItem(&Item);
					Item.col = 1;
			       	Item.szText.Format("%ld",con3);
					m_Grb.SetItem(&Item);
					Item.col = 2;
			       	Item.szText.Format("T11×4+T3%d×10",t3);
					m_Grb.SetItem(&Item);
                    m_Grb.AutoSize ();

					//try to write to detial grid
				
					for(i=0;i<6;++i)
						for(int j=0;j<2;++j)
							ar[i][j]=0;
			    	in=0;
					ar[in][0]=1800;
		            ar[in++][1]=4;
				
					ar[in][0]=p3->gg1;
		            ar[in++][1]=10;
					ar[in][0]=p3->gg2;
		            ar[in++][1]=10;

⌨️ 快捷键说明

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