Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Krisstoof

Program c++ zawiesza się

Polecane posty

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;
}

Link do komentarza
Udostępnij na innych stronach

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 do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...