|
|
|
| Здравствуйте уважаемые гуру форума.
Столкнулся с задачей написать программу которая шифрует/расшифровывает текст закодированный решёткой Кардано.
Вот ссылка на сам алгоритм
http://school-555.narod.ru/kript/3.htm
Я решил поворачивать на 180 гр. Так как на я просто не додумался как сделать .
Вот что получилось у меня на данный момент :
#include <vcl.h>
#pragma hdrstop
#pragma argsused
#include <iostream.h>
int main(int argc, char* argv[])
{
int i1=0,j1=0,i=0,j=0,m=0,p=8,n=4;
int z=0;
char fraza[16];
char slovo[4][4]={
{'0','1','0','0'},
{'1','0','0','0'},
{'0','1','0','0'},
{'0','0','0','1'}
};
cout<<"Kluch : ";
cout<<"\n";
for(i1=0;i1<4;i1++)
{
cout<<"\n";
for(j1=0;j1<4;j1++)
{
cout<<slovo[i1][j1];
cout<<" ";
}
}
cout<<"\n";
cout<<"Enter text max 16 - ";
cin>>fraza;
cout<<"\n";
cout<<"Enter complete";
cout<<"\n";
for(i1=0;i1<4;i1++)
{
for(j1=0;j1<4;j1++)
{
if (slovo[i1][j1]=='1')
{
slovo[i1][j1]=fraza[m];
m++;
}
else
{}
}
}
cout<<"\n";
cout<<"vivod soderzgimogo : ";
cout<<"\n";
for(i1=0;i1<4;i1++)
{
cout<<"\n";
for(j1=0;j1<4;j1++)
{
cout<<slovo[i1][j1];
cout<<" ";
}
}
cout<<"\n";
m=4;
for (i=0;i<4;i++)
{
z=0;
for (j=0;j<4;j++)
{
if (slovo[i][j]!='0'&&z!=1)
{
n=4;
z++;
switch(j)
{
case 0:slovo[i][n-1]=fraza[m];m++;cout<<"z0";
break;
case 1:slovo[i][n/2]=fraza[m]; m++; cout<<"z1";
break;
case 2:slovo[i][n/2-1]=fraza[m]; m++;cout<<"z2";
break;
case 3:slovo[i][0]=fraza[m]; m++; cout<<"z3";
break;
}
}
else{cout<<"else";}
}
}
cout<<"\n\n";
cout<<"\n";
cout<<"vivod soderzgimogo : ";
cout<<"\n";
for(i1=0;i1<4;i1++)
{
cout<<"\n";
for(j1=0;j1<4;j1++)
{
cout<<slovo[i1][j1];
cout<<" ";
}
}
cout<<"\n";
m=4;
for (i=0;i<4;i++)
{
z=0;
for (j=0;j<4;j++)
{
if (slovo[i][j]==fraza[m]&&z!=1)
{
n=4;
z++;
switch(i)
{
case 0:slovo[n-1][j]=fraza[p];p++;m++;cout<<"z0";
break;
case 1:slovo[n/2][j]=fraza[p]; p++;m++; cout<<"z1";
break;
case 2:slovo[n/2-1][j]=fraza[p]; p++;m++;cout<<"z2";
break;
case 3:slovo[0][j]=fraza[p]; p++;m++; cout<<"z3";
break;
}
}
else{cout<<"else";}
}
}
cout<<"\n";
cout<<"vivod soderzgimogo : ";
cout<<"\n";
for(i1=0;i1<4;i1++)
{
cout<<"\n";
for(j1=0;j1<4;j1++)
{
cout<<slovo[i1][j1];
cout<<" ";
}
}
cout<<"\n";
char response;
cin>>response;
return 0;
}
//--------------------------------------------------------------------------- |
здесь много лишнего промежуточный вывод содержимого массива и прочее.
У меня получилость записать первые 4 буквы в квадрат, отразить на 180 и записать ещё 4
это вот этот кусок
cout<<"Enter text max 16 - ";
cin>>fraza;
cout<<"\n";
cout<<"Enter complete";
cout<<"\n";
for(i1=0;i1<4;i1++)
{
for(j1=0;j1<4;j1++)
{
if (slovo[i1][j1]=='1')
{
slovo[i1][j1]=fraza[m];
m++;
}
else
{}
}
}
cout<<"\n";
cout<<"vivod soderzgimogo : ";
cout<<"\n";
for(i1=0;i1<4;i1++)
{
cout<<"\n";
for(j1=0;j1<4;j1++)
{
cout<<slovo[i1][j1];
cout<<" ";
}
}
cout<<"\n";
m=4;
for (i=0;i<4;i++)
{
z=0;
for (j=0;j<4;j++)
{
if (slovo[i][j]!='0'&&z!=1)
{
n=4;
z++;
switch(j)
{
case 0:slovo[i][n-1]=fraza[m];m++;cout<<"z0";
break;
case 1:slovo[i][n/2]=fraza[m]; m++; cout<<"z1";
break;
case 2:slovo[i][n/2-1]=fraza[m]; m++;cout<<"z2";
break;
case 3:slovo[i][0]=fraza[m]; m++; cout<<"z3";
break;
}
}
else{cout<<"else";}
}
} |
но дальше начались проблемы .
Алгоритм громоздкий и не совершенный. Поэтому дальше писать нет смысла .
Может быть кто сталкивался с подобной задачей, можете подсказать способы решения.
Или возможно кто то может подсказать как "поварачивать" двумерный массив на 90 градусов поочерёдно записывая в него данные.
Вообщем пишите любые советы. надеюсь на помощь. | |
|
|