📄 gridctrldemodlg.cpp
字号:
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 + -