Kod rozwijanych kwadratów
Kod był wyświetlany 1432 razy.
    /*
Name: Kod rozwijanych kwadratów
Copyright: GPL GNU
Author: Przemyslaw Sierocinski
Date:01-05-09 14:25
Description:
Jedna z metod szyfrowania jest znana pod nazwą \\\"kod rozwijanych kwadratów\\\".
Metoda ta szyfruje wiadomość umieszczając jej poszczególne znaki wiersz po
wierszu w kwadratowej macierzy o nieparzystej liczbie wierszy, a następnie
odczytując je zgodnie z ruchem wskazówek zegara w rozwijanej spirali kwadratowej
rozpoczynającej się w środku macierzy.

Jeśli wiadomość nie posiada wymaganej ilości znaków, w celu zapełnienia całej
macierzy, to brakujące literki zastępuje się znakiem gwiazdki(*).

Poniżej dwie kwadratowe macierze o rozmiarze 5x5 pokazujące
kolejność wprowadzania znaków do macierzy oraz kolejność ich wyprowadzania.
Zwróć uwagę, że wyprowadzanie znaków rozpoczyna się dokładnie w środku macierzy,
następnie biegnie w prawo, a później spiralnie dookoła
zgodnie z ruchem wskazówek zegara:

WPROWADZENIE: WYPROWADZENIE:

1 2 3 4 5 21 22 23 24 25
6 7 8 9 10 20 7 8 9 10
11 12 13 14 15 19 6 1 2 11
16 17 18 19 20 18 5 4 3 12
21 22 23 24 25 17 16 15 14 13

Rozszyfrowana wiadomość nie może zawierać końcowych znaków gwiazdki,
które zostały użyte w procesie szyfrowania.
Program kontynuuje odczytywanie wierszy wejściowych i wykonywanie operacji
aż do napotkania operacji innej niż SZYFROWANIE lub ROZSZYFROWYWANIE.
*/

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int bok,i,j,k,srodek,odleglosc,dlugosc;
string opcja,ciag;
char **macierz;

wprowadzenie_danych:
cout<<"\n\n\tWybierz operacje S - SZYFROWANIE";
cout<<"\n\n\t                 R - ROZSZYFROWYWANIE): ";
getline(cin,opcja);

if(opcja.compare("S")==0)
{
           cout<<"\n\tPodaj ciag do zaszyfrowania:\n\t";
           getline(cin,ciag);
           dlugosc=ciag.length();
           bok=(int)sqrt(dlugosc);          //wyznacz bok kwadratu
           if(bok*bok!=dlugosc)             //jezeli zabrakloby miejsca
           bok++;                                 //powieksz bok o jeden
           if(bok%2==0)                           //jezeli bok jest parzysty
           bok++;                                 //to zwieksz bok o jeden

           macierz=new char*[bok];            //dynamiczna tablica dwuwymiarowa
           for(i=0;i<bok;i++)
           {
           macierz[i]=new char[bok];
           for(j=0;j<bok;j++)
           macierz[i][j]='*';                 //wyczysc zawartosc gwiazdkami
           }

           srodek=bok/2;                      //wyznacz wspolrzedne srodka
           macierz[srodek][srodek]=ciag[0];   //daj pierwszy element w srodek
           odleglosc=1;                       //odleglosc elementow od srodka
           k=1;
           while(k<dlugosc)           //dopuki zostalo cos do umieszczenia
           {
           /*Przesuwamy sie w dol */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)             //jezeli to juz wszystko
           break;                           //to przerwij
           macierz[srodek+odleglosc][srodek+i]=ciag[k]; //daj element na miejsce
           k++;
                                                    }
           /*Przesuwamy sie w lewo */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)
           break;
           macierz[srodek-i][srodek+odleglosc]=ciag[k];
           k++;
                                                    }
           /*Przesuwamy sie do gory */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)
           break;
           macierz[srodek-odleglosc][srodek-i]=ciag[k];
           k++;
                                                   }
           /*Przesuwamy sie w prawo */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)
           break;
           macierz[srodek+i][srodek-odleglosc]=ciag[k];
           k++;
                                                   }
           odleglosc++;             //odleglosc od srodka sie zwieksza
           }

           cout<<"\n\tCiag \""<<ciag<<"\" po zaszyfrowaniu:\n\t";
           for(j=0;j<bok;j++)
           {
                             for(i=0;i<bok;i++)
                             {
                             if(macierz[i][j]!='*')
                             cout<<macierz[i][j];
                                                 }
                             }
           goto wprowadzenie_danych;
           }

else if(opcja.compare("R")==0)
{
     cout<<"\n\tPodaj ciag do odszyfrowania:\n\t";
     getline(cin,ciag);
     dlugosc=ciag.length();
     bok=(int)sqrt(dlugosc);
     if(bok*bok!=dlugosc)
     bok++;
     if(bok%2==0)
     bok++;
     macierz=new char*[bok];
     for(i=0;i<bok;i++)
     {
     macierz[i]=new char[bok];
     for(j=0;j<bok;j++)
     macierz[i][j]=0;
                            }
     char *wynik=new char[dlugosc];  //tablica na wyniki
     for(i=0;i<dlugosc;i++)
     wynik[i]=0;
     srodek=bok/2;

     /* "Inteligentne" uzupalnianie gwiazdkami */
     /* (po spirali od prawego gornego rogu) */
     if(dlugosc<bok*bok)
     {
     k=bok*bok-dlugosc;
     /* Przesuwamy sie w lewo */
     for(i=bok-1;i>0;i--)
     {
     if(k==0)            //jezli juz nie ma wolnych miejsc
     break;              //to przerwij operacje
     macierz[i][0]='*';  //dopelniaj matryce gwiazdkami
     k--;
         }
     /* Przesuwamy sie w dol */
     for(i=0;i<bok-1;i++)
     {
     if(k==0)
     break;
     macierz[0][i]='*';
     k--;
         }
     /* Przesuwamy sie w prawo */
     for(i=0;i<bok-1;i++)
     {
     if(k==0)
     break;
     macierz[i][bok-1]='*';
     k--;
                           }
     /* Przesuwamy sie do gory */
     for(i=bok-1;i>1;i--)
     {
     if(k==0)
     break;
     macierz[bok-1][i]='*';
     k--;
     }
     }

     /* Przepisanie ciagu do macierzy */
     j=0;k=0;
     for(i=0;i<dlugosc;k++)  //dopuki wszystkie znaki nie zostana przepisane
     {
          if(k==bok)       //kiedy wiersz jest pelny
          {
                    k=0;
                    j++;   //to przechodz do nizszego
                        }
          if(macierz[k][j]!='*')  //jezeli miejsce nie jest juz zajete
          {
          macierz[k][j]=ciag[i];  //przepisuj znaki do matrycy
          i++;
          }
          }

     wynik[0]=macierz[srodek][srodek];
     k=1;
     odleglosc=1;

     while(k<dlugosc)
           {
           /*Przesuwamy sie w dol */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)
           break;
           wynik[k]=macierz[srodek+odleglosc][srodek+i];
           k++;
                                                    }
           /*Przesuwamy sie w lewo */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)
           break;
           wynik[k]=macierz[srodek-i][srodek+odleglosc];
           k++;
                                                    }
           /*Przesuwamy sie do gory */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)
           break;
           wynik[k]=macierz[srodek-odleglosc][srodek-i];
           k++;
                                                   }
           /*Przesuwamy sie w prawo */
           for(i=0-odleglosc+1;i<odleglosc+1;i++)
           {
           if(k==dlugosc)
           break;
           wynik[k]=macierz[srodek+i][srodek-odleglosc];
           k++;
                                                   }
           odleglosc++;             //odleglosc od srodka sie zwieksza
           }

           cout<<"\n\tCiag \""<<ciag<<"\" po odszyfrowaniu:\n\t";
           for(i=0;i<dlugosc;i++)
           cout<<wynik[i];
           cout<<endl;

     goto wprowadzenie_danych;
     }

else
system("pause");
return 0;
}
    
Pobierz plik tekstowy
Administrator WJL
PHP&SQL coded by NOVA-IT