In.Close();
Out.close();
switch (message)
{
case WM_COMMAND:
switch (wParam)
{
case IDOK:
EndDialog(hDlg,TRUE);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return FALSE;
}
LRESULT CALLBACK DESHIFR_PLEYFER(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int i=0, j=0, dlina=0, K1=0, K2=0, x=0 ;
char A[100]= "HARPSICODBEFGKLMNQTUVWXYZ", *S="X", Z[5], Z1[5],Z2[5], TEXT[100] ;
char file2[20]="D:\\shifr2.txt";
char file1[20]="D:\\deshifr.txt";
Ifstream In;
ofstream Out;
In.Open(file1);
Out.open(file2);
while(!In.eof())
{
In>>TEXT[i];
i++;
}
TEXT[i-1]='\0';
dlina=strlen(TEXT);
i=0;
while(i!=dlina)
{
Z[0]=TEXT[i];
Z[1]='\0';
K1=INDEX(Z,A) ;
Z[0]=TEXT[i+1];
Z[1]='\0';
K2=INDEX(Z,A) ;
//Находится в одной строке
if(K1/10==K2/10)
{ if((K1%10)==0)
{
TEXT[i]=A[(K1/10)*5+4];
TEXT[i+1]=A[(K2/10)*5+(K2%10)-1];
}
else
{ if((K2%10)==0)
{ TEXT[i]=A[(K1/10)*5+(K1%10)-1];
TEXT[i+1]=A[(K2/10)*5+4];
}
else
{ TEXT[i]=A[(K1/10)*5+(K1%10)-1];
TEXT[i+1]=A[(K2/10)*5+(K2%10)-1];
}
}
}
else
{ //Находится в одном столбце
if(K1%10==K2%10)
{ if((K1/10)==0)
{
TEXT[i]=A[(K1%10)+20];
TEXT[i+1]=A[(K2%10)+(K2/10)*5-5];
}
else
{ if((K2/10)==0)
{
TEXT[i]=A[(K1/10)*5+(K1%10)-5];
TEXT[i+1]=A[(K2%10)+20];
}
else
{
TEXT[i]=A[(K1%10)+(K1/10)*5-5];
TEXT[i+1]=A[(K2%10)+(K2/10)*5-5];
}
}
}
else
{ if((K1/10)<(K2/10))
{ TEXT[i]=A[(K1/10)*5+(K2%10)];
TEXT[i+1]=A[(K2/10)*5+(K1%10)];
}
else
{ TEXT[i+1]=A[(K2/10)*5+(K1%10)];
TEXT[i]=A[(K1/10)*5+(K2%10)];
}
}
}
i=i+2;
}
dlina=strlen(TEXT);
Z[0]=TEXT[dlina];
Z[1]='\0';
if(strcmp(Z,S)==0)
TEXT[dlina]='\0';
dlina=strlen(TEXT);
for(i=1;i<dlina;i++)
{
Z[0]=TEXT[i];
Z[1]='\0';
Z1[0]=TEXT[i];
Z1[1]='\0';
Z2[0]=TEXT[i];
Z2[1]='\0';
if((strcmp(Z,S)==0)&&(strcmp(Z1,Z2)==0))
{ for(j=i;j<dlina;j++)
TEXT[j]=TEXT[j+1];
TEXT[dlina]='\0';
dlina=strlen(TEXT);
}
}
for(i=0;i<dlina;i++)
Out<<TEXT[i];
In.Close();
Out.close();
switch (message)
{
case WM_COMMAND:
switch (wParam)
{
case IDOK:
EndDialog(hDlg,TRUE);
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return FALSE;
}
void fun( vector<Simbol> &general, vector<Simbol> &right )
{
int max=0;
vector<Simbol>::iterator iter = right.begin();
for(int i=0; i<right.size(); i++)
{
if(right[i].kol > max)
{
max = right[i].kol;
iter += i;
}
}
vector <Simbol> left(1);
left[0].c = (*iter).c;
left[0].kol = (*iter).kol;
right.erase(iter);
int min_raz, sum_l, sum_r, raz;
do
{
sum_l = 0; sum_r =0;
for( i = 0; i < right.size(); i++)
sum_r += right[i].kol;
for( i = 0; i < left.size(); i++)
sum_l += left[i].kol;
min_raz = abs(sum_r - sum_l - 2 * right[0].kol );
iter = right.begin();
for( i = 1; i< right.size(); i++)
{
raz = abs(sum_r - sum_l - 2 * right[i].kol );
if( raz < min_raz)
{
min_raz = raz;
iter = right.begin();
iter+=i;
}
}
if(min_raz < abs(sum_l - sum_r) )
{
left.push_back(*iter);
right.erase(iter);
}
}while( abs(sum_l - sum_r) > min_raz );
for( i = 0; i < right.size(); i++ )
{
for( int j = 0; j < general.size(); j++ )
{
if( right[i].c == general[j].c )
general[j].code.push_back(0);
}
}
for( i = 0; i < left.size(); i++ )
{
for( int j = 0; j < general.size(); j++ )
{
if( left[i].c == general[j].c )
general[j].code.push_back(1);
}
}
if( 1< right.size() )
fun(general, right);
if( 1 < left.size() )
fun(general, left);
}
