Jump to content
Krisstoof

Program c++ zawiesza się

Recommended Posts

Mam problem z programem, gdyż przy niektórych danych się zawiesza. Nie wiem co powoduje ten problem. A także czy ma ktoś pomysł jak skrócić program, bo szyfr i deszyfr zawierają to samo, a nie wiem jak dać drugą funkcję pod to samo.

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

// definicje elementów Enigmy
void nap(){
cout << "Wybierz opcje: " << endl;
cout << "[1] Szyfrowanie" << endl;
cout << "[2] Deszyfrowanie" << endl;
cout << "[3] Wyczysc ekran" << endl;
}

string szyfr()
{
string rotory[3] = {"CKMELGDJVZNTOWYHXUSPAIBRFQ",
"YDFWJLUBRTXVZNPEIHGAKMCSQO",
"NKAFMTDQPXEGOWYHZUSVLIJRCB"};
string pe = "SZYFR";// przestawienie
string refl = "YRUHQSLDPXNGOKMIEBFZCWVJAT";// odwrocenie
string la = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int rtr[3],i,j,k,n,c;
bool ruch;
string sr,sl;

cout << "Podaj kolejnosc ustawienia 3 rotorow(od 1-3): ";// odczytujemy konfigurację rotorów
cin >> n;
for(i = 2; i >= 0; i--)
{
rtr[i] = (n % 10) - 1; // numer pierścienia na i-tej pozycji
n /= 10;
}
cout << "Podaj pierwsze 3 litery rotorow: ";// odczytujemy położenia początkowe rotorów
cin >> sr;
for(i = 0; i < sr.length(); i++)
sr[i] = toupper(sr[i]);

cout << "Podaj pary liter ktore chcesz ze soba zamienic: ";
cin >> sl;// odczytujemy stan łącznicy wtyczkowej
for(i = 0; i < sl.length(); i++) sl[i] = toupper(sl[i]);

for(i = 0; i < sl.length() - 1; i += 2)
{
la[sl[i] - 65] = sl[i + 1];
la[sl[i + 1] - 65] = sl[i];
}
cout << "Wpisz slowo ktore chcesz zaszyfrowac/deszyfrowac: ";
cin.ignore(256,'\n');// odczytujemy szyfrogram
getline(cin,sl);
for(i = 0; i < sl.length(); i++) sl[i] = toupper(sl[i]);
for(i = 0; i < sl.length(); i++)// szyfrujemy/rozszyfrowujemy szyfrogram
{
for(ruch = true, j = 2; ruch && (j >= 0); j--)// najpierw ruch rotorów
{
ruch = (sr[j] == pe[rtr[j]]);
sr[j] = 65 + (sr[j] - 64) % 26;
}
c = sl[i];// pobieramy znak szyfrogramu
c = la[c - 65];// przechodzimy przez łącznicę wtyczkową

for(j = 2; j >= 0; j--)// przechodzimy przez rotory w kierunku do bębna odwracającego
{
k = sr[j] - 65;
c = rotory[rtr[j]][(c - 65 + k) % 26];
c = 65 + (c - 39 - k) % 26;
}

c = refl[c - 65];// przechodzimy przez bęben odwracający

for(j = 0; j < 3; j++)// wracamy ścieżką powrotną
{
k = sr[j] - 65;
c = 65 + (c - 65 + k) % 26;
for(n = 0; rotory[rtr[j]][n] != c; n++);
c = 65 + (26 + n - k) % 26;
}

c = la[c - 65];// przechodzimy przez łącznicę wtyczkową
sl[i] = c;// uaktualniamy szyfrogram
}
cout << sl << endl << endl;// wyświetlamy szyfrogram
}
int main()
{
nap();
int opcja;
do{
cin >> opcja;
switch(opcja){
case 1:
szyfr();
cout << "A teraz wybierz [2] by deszyfrowac tekst: " ;
break;

case 2:
szyfr();
break;
case 3:
system("cls");
nap();

}
} while (opcja<4 && opcja!=0);
cout << ",, System shutting down ''" << endl;

system("pause");
return EXIT_SUCCESS;
}

Edited by packman88
Link to comment
Share on other sites

Wypadałoby pomyśleć o formatowaniu kodu - to, co wrzuciłeś, wygląda paskudnie. Raz robisz za dużo wcięć, innym razem wcale. Z nawiasami klamrowymi jest jeszcze gorzej - niestosowanie ich w przypadku, gdy w pętli czy instrukcji warunkowej mamy tylko jedną linię kodu to strzelanie sobie w łeb. Zakładając, że posprzątałeś w swojej implementacji, masz już dziurkę w głowie. Zrób ładnie a zobaczysz. smile_prosty.gif

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...