Szyfr Cezara.

0

Pytanie czemu s[i] + p daje jakieś dziwne wyniki.

Dla przykładu
s[i] = 'A' czyli 65
p (przesuniecie) = 3
czyli :

powinno być 65+3 = 68...a wychodzi 'A' + 3 = 187 ?

Widziałem już parę przykładów ale wolę po swojemu to napisać...

string szyfruj(string s,int p)
{
    string wynik = "";

    for (int i = 0; i < s.length(); ++i)
    {
        if (s[i] + p > 'z')
        {
            wynik += static_cast<int>(s[i]) + p - 58;
            //cout << "\n" << static_cast<int>(s[i]) + p << " ";
        }
        else
            wynik += static_cast<int>(s[i]) + p;
    }
    return wynik;
}
0

Dla A działa u mnie dobrze, ale skąd wiozłeś to 58? Bo ta część nie chce działać, nawet jak małe litery daję. Swoją drogą dla pewności zamiast tworzyć nowego stringa (chyba są jakieś problemy z przeciążeniem +) , modyfikował bym dostarczonego i jego zwrócił. I tak kopia do funkcji idzie

0

w sumie to taka pierwsza myśl - nie testowana ale zamysł taki :

ostatnią literą jest z - 122, pierwszą A - 65

to jak dodamy np. 122 + 3 to wyjdzie poza 'alfabet'. Dlatego 122 + 3 - 58 = 67

Pomijając już problem to w sumie jak powinien wyglądać uzupełniony szyfr Cezara ?

Przecież nie możemy zaokrąglać tylko od A do z...na komputerze istnieją inne znaki np. spacje,kropki czy nawet liczby...jeśli już to dać przedział 0-255 ? Z drugiej strony zaszyfrowany zwykły tekst będzie pełen takich 'krzako-znaków'. W sumie nie dotyczy to tylko tego algorytmu ale i całej kryptografii...

I jeszcze pytanie, np. tablica ascii podzielona jest na dwie części 0-127 i 128-255. Z czego ta druga zależna jest od danego kodowania ? np. znak euro powinien być pod numerem 128 a w konsoli wyskakuje całkiem inny znak.

0
    for (int i = 0; i < s.length(); ++i) wynik+=isalpha(s[i])?(char)('A'+(toupper(s[i])-'A'+p)%26):s[i];
0

Akurat 58 to dwukropek, odejmował bym raczej ilość liter w angielskim alfabecie czyli 26.

ps a co z dużymi literami? Nie są w ASCII obok małych, więc wymagają osobnego potraktowania dla "przewyższania Z".

1 użytkowników online, w tym zalogowanych: 0, gości: 1