Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z szyfrowaniem

Ostatnio zmodyfikowano 2015-10-27 18:32
Autor Wiadomość
em_en
Temat założony przez niniejszego użytkownika
Problem z szyfrowaniem
» 2015-10-26 23:51:12
Witam,
Mój problem polega na tym, że napisałem program, który ma za zadanie szyfrować i deszyfrować,który niestety nie działa tak jak należy - przypisuje inne znaki niż powinien. Nie widzę tutaj żadnego błędu, więc postanowiłem zwrócić się po pomoc do Was :)
Kod dostępny jest tutaj: http://cpp.sh/6cvk
P-139233
michal11
» 2015-10-27 01:31:46
Pomijając fatalny kod, to powinieneś dać else ify a nie same ify. Gdy przykładowo jako tekst wpiszesz 'a' to najpierw jest to zamieniane na 'q' a później, w tym samym obiegu pętli, to 'q' jest zamieniane na 'j' ponieważ po 1 zmianie sprawdzanie kolejnych możliwości nie jest przerywane.
P-139235
carlosmay
» 2015-10-27 01:34:08
Wyniki są nieprawidłowe, niektóre litery zamieniasz kilka razy w jednym cyklu pętli.
Nie zrealizujesz tego w ten sposób.

a -> q -> j
a jest zamieniane w q, później jedziesz dalej i trafiasz if'a z 'q' i buch nieplanowana zamiana.

C/C++
if( text.at( i ) == ' ' ) { text.at( i ) = ' '; continue; } // spacja
if( text.at( i ) == 'a' ) { text.at( i ) = 'q'; continue; } //  1
if( text.at( i ) == 'b' ) { text.at( i ) = 'w'; continue; } //  2
if( text.at( i ) == 'c' ) { text.at( i ) = 'e'; continue; } //  3
 po znalezieniu i zamianie litery przeskocz resztę kodu w pętli i zacznij nowy cykl.
P-139236
em_en
Temat założony przez niniejszego użytkownika
» 2015-10-27 17:06:23
Wielkie dzięki za odpowiedź i wyjaśnienie co zrobiłem źle, dopisanie wszędzie "continue;" załatwiło sprawę. :)

Natomiast mam pytanie do michal11 - może jakieś konkrety, a nie tylko suche zdanie jak "zupa jest obrzydliwa". Jeśli już mówisz, że kod jest taki fatalny to może powiedz co z nim nie tak? Jestem początkujący (co można zauważyć po tak prostym błędzie jaki zrobiłem z tymi warunkami) i moje kody to nie dzieła sztuki, ale każda sensowna wskazówka jest mile widziana
P-139247
michal11
» 2015-10-27 17:53:16
Ok, przede wszystkim zmienne globalne których nie powinieneś używać, praktycznie nigdy. Stąd prosty wniosek, że twoje funkcje powinny przyjmować argumenty. W ogóle cały pomysł na szyfrowane, a raczej jego wykonanie jest złe, trudne do utrzymania i niejasne. Jeżeli już chcesz mieć takie szyfrowanie gdzie z góry masz przypisaną jedną literę do drugiej ( co też nie jest dobrym pomysłem) to zamiast dziesiątek ifów lepiej zrobić sobie jakiś kontener z parami liczb (np.
vector < pair < char, char > >
 gdzie na początku programu będziesz do niego wpisywał te twoje pary znaków. To ci da 2 korzyści, każdą parę liter będziesz miał w 1 miejscu zamiast w 4 (szczególnie przydatne jeżeli nagle będziesz chciał zmienić przypisanie liter) oraz znacząco uprości kod. Dodatkowo nie ma potrzeby sprawdzania zarówno liter małych jak i wielkich (w ifach), jeżeli chcesz zachować wielkość liter to wystarczy dodać jakąś flagę która po szyfrowaniu/deszyfrowaniu będzie zmieniała literę na taką jaka była wcześniej. Podsumowując moim zdaniem powinno to wyglądać mniej więcej tak:

szyfrowanie:
1. dla każdego znaku w tekście
2. sprawdź czy aktualny znak jest wielką literą, jeżeli tak to zapiszą tą informację
3. znajdź w kontenerze parę liter
4. zamień aktualna literę na małą
5. przypisz pod aktualny znak literę z pary
6. jeżeli zapisałeś informację, że trzeba zmienić literę to ja zamień na wielką

analogicznie będzie dla deszyfrowania tylko będziesz znajdował parę liter w kontenerze patrząc na drugą a nie pierwszą i przypisywał do aktualnej pierwszą.

Przydadzą ci się funkcje z pliku cctype w szczególności isupper(), toupper().

Dodam jeszcze, że uważam rozwiązanie z continue za raczej słabe, powinno to być else if a najlepiej switchem.
P-139251
em_en
Temat założony przez niniejszego użytkownika
» 2015-10-27 18:32:50
P-139259
« 1 »
  Strona 1 z 1