Archiwum dla październik, 2006

19
paź

Czasoniewstrzymywacz

Tym razem prosta klasa, służąca do pomiaru czasu wykonywania jakiś instrukcji, algorytmów etc:

class timer
{
      public:
             timer();
             ~timer();
             void start();
             void stop();
             double getDiffTime() const;
      private:
              void setDiff( clock_t);
              clock_t startTime;
              double diffTime;
};

timer::timer()
{

}

timer::~timer()
{

}

void timer::start()
{
     startTime = clock();
}

void timer::stop()
{
     clock_t stopTime = clock();
     setDiff( stopTime );
}

void timer::setDiff( clock_t time )
{
     diffTime = ( (double) ( time - startTime ) ) / CLOCKS_PER_SEC ;
}

double timer::getDiffTime() const
{
         return diffTime;
}

Komentarza raczej nie wymaga zbyt wielkiego. Zastosowałem typ clock_t, który trzeba podzielić przez stałą CLOCKS_PER_SEC aby otrzymać czas w sekundach.

12
paź

Szyfr Cezara czyli jak nie szyfrować.

Szyfr Cezara, stosowany prze Juliusza Cezara do szyfrowania swoich listów jest bardzo prosty, ale i przy tym w zasadzie nieskuteczny. Choć podobno Rosjanie jeszcze na początku XX wieku korzystali w wojsku z tego szyfru, ze względu na jego prostotę :)

Algorytm jest wręcz banalny, opiera się na przesunięciu o 3 każdej litery alfabetu. Gdy szyfrujemy przesuwamy “w prawo”, gdy deszyfrujemy “w lewo”. Zapis matematyczny:

1. E(p) = ( p + 3 ) mod k
2. D(p) = ( p- 3 ) mod k

Gdzie k jest ilością liter danego alfabetu a p aktualnie szyfrowaną literą. Zgodnie z oryginalnym szyfrem, nie szyfrujemy cyfr i innych znaków ( co oczywiście ułatwia deszyfrację ) . Oto kod szyfrowania w C++:

string cezarEncode( string text )
{
    const unsigned int CEZAR_SHIFT = 3;
    const unsigned int ALPHABET_SIZE = 26;
    string result = "";
    unsigned int length = text.length();
    for ( int i(0); i < length; ++i )
    {
        // 65 is ASCII code of A, 90 is ASCII code of Z
        if ( text[i] >= 65 && text[i] <= 90 )
            result += ( text[i] - 65 + CEZAR_SHIFT ) % ALPHABET_SIZE + 65;
        // 97 is ASCII code of a, 122 is ASCII code of z
        else if ( text[i] >= 97 && text[i] <= 122 )
            result += ( text[i] - 97 + CEZAR_SHIFT ) % ALPHABET_SIZE + 97;
        else
            result += text[i];
    }
    return result;
}

Deszyfrowanie:

string cezarDecode( string text )
{
       const unsigned int CEZAR_SHIFT = 3;
       const unsigned int ALPHABET_SIZE = 26;
       string result = "";
       unsigned int length = text.length();
       for ( int i(0); i <   length; ++i )
       {
           // 65 is ASCII code of A, 90 is ASCII code of Z
            if ( text[i] >= 65 && text[i] <= 90 )
                result += ( text[i] - 65 - CEZAR_SHIFT ) % ALPHABET_SIZE + 65;
            // 97 is ASCII code of a, 122 is ASCII code of z
            else if ( text[i] >= 97 && text[i] <= 122 )
                   result += ( text[i] - 97 - CEZAR_SHIFT ) % ALPHABET_SIZE + 97;
            else
                result += text[i];
       }

       return result;
}
I na tym koniec