szyfr cezara, biblioteka vector

0

Witam. W pliku mam w każdym wierszu: słowo, spacja i drugie słowo. np

ZAWISLAK EFBNXQFP
KRASZEWSKI XENFMRJFXV
WARDA OSJVS

Drugie słowo jest szyfrogramem pierwszego (kazda litera przesunieta o okreslona ilosc miejsc w tabeli ASCII)
W pliku niektore szyfrogramy sa niepoprawne, moje zadanie to znalezc te niepoprawne szyfrogramy i je wypisac.

Program sie kompiluje, jednak wypisuje wszystkie wyrazy z pliku zamiast tylko tych niepoprawnych.
Pracuje tylko na nr 65-90 ASCII (duze litery alfabetu ang)
Reszta w komentarzach

    string wyraz, szyfr;
    char litera_wyraz, litera_szyfr;
    int numer_wyraz, numer_szyfr;
    vector <int> tab;
    int roznica;


    while(plik3>>wyraz>>szyfr)
    {
        for(int i=0; i<wyraz.size()-1; i++)
        {
            litera_wyraz = wyraz[i];
            litera_szyfr = szyfr[i];
            numer_wyraz = int(litera_wyraz);
            numer_szyfr = int(litera_szyfr);
            roznica = numer_szyfr - numer_wyraz; //sprawdzam roznice miedzy nr ascii litery szyfru, a zwyklego wyrazu
            if(roznica<0) roznica += 26; //jesli wieksza jest zwykla litera, to znaczy, ze szyfr sie zapetlil (np z 90 do 68), dodaje 26
            tab.push_back(roznica);
        }

        for(int j=1; j<tab.size(); j++)
        {
            if(tab[j]=!tab[j-1])
               {
                    cout<<wyraz; //jesli roznica z j wyrazu jest rozna niz z wyrazu j-1, to znaczy, ze niepoprawnie zaszyfrowano, wypisuje ten niepoprawny wyraz i koncze
                    break;
               }
        }

        tab.clear();
        cout<<endl;
0

Podziel ten kod na mniejsze fragmenty, bo wygląda bardzo źle i źle się go analizuje.

Jedyne co musisz zrobić to wczytać ciągi do dwóch zmiennych, porównać długość ciągów i jeśli są tej samej długości, obliczyć różnicę kodów pierwszych znaków, tę różnicę wykorzystać do odkodowania szyfrogramu i na koniec porównać zawartości ciągów ze sobą, co da ostateczny wynik – prawidłowy szyfrogram lub nie.

Z pięć funkcji się przyda.

0

Dlugosci ciagow sa te same z definicji (zapomnialem podac)
Ja zapisuje w tablicy roznice wszystkich znakow w pierwszej petli, a w drugiej sprawdzam czy obecna roznica jest rozna od poprzedniej.
Jezeli jest rozna, wypisuje wyraz i koncze petle.
ps: mialo byc w "newbie", nie wiem czy przenosic

1

Możesz zrobić w ten sposób, że obliczysz różnicę kodów pierwszej pary znaków i w pętli dla pozostałych sprawdzisz czy różnice są takie jak dla pierwszych. Przy pierwszej napotkanej niezgodności przerywasz pętlę i zwracasz false, a poza pętlą true.

Przyda Ci się funkcja przyjmująca dwa znaki i zwracająca inta, do obliczania różnicy kodów znaków, a także druga, przyjmująca dwa ciągi znaków do sprawdzenia. Druga zawiera właściwą pętlę i korzysta z tej pierwszej.

Nie potrzebujesz żadnej dodatkowej tablicy – poprawność różnicy obliczaj w pętli w locie, bo szyfrogram odszyfrowany i tak nie jest Ci do niczego potrzebny.

0

Masz rację. Niemniej chciałem przećwiczyć dynamiczne tablice z biblioteki <vector>, bo przeczytałem na tym forum, że do matury się przydadzą i im wcześniej się ich nauczę tym lepiej. Mój sposób też wydaję się poprawny i nie wiem czemu źle wyświetla wyrazy :/

1

Jeśli koniecznie chcesz użyć vectorów to sobie je upchnij, ale najpierw spraw, aby program zaczął działać prawidłowo. Zacznij od nowa, pisz kod metodą top-down – łatwiej będzie ogarnąć całość.

0

Poddaje sie. Wstyd przyznac, ale funkcji jeszcze nie stosuje. Mam duzo innych rzeczy do powtorki przed matura, a nie wymagaja ode mnie stosowania funkcji. Chociaz zdaje sobie sprawe, ze od ich nie uciekne. Ucialem zbedne tablice tak, jak zaproponowales i dalem dodatkowa zmienna roznica_pom. Nadal nie wiem gdzie lezy blad. Program wypluwa nie te wyrazy co trzeba, czasem zostawia pusty wiersz, czasem wypisuje ten sam wyraz kilka razy.

ZMIENNE:

    string wyraz;
    string szyfr;
    char litera_wyraz;
    char litera_szyfr;
    int numer_wyraz;
    int numer_szyfr;
    int roznica = 0;
    int roznica_pom = 0;

PROGRAM:

  while(plik3>>wyraz>>szyfr)
    {
        for(int i=0; i<wyraz.size(); i++)
        {
            roznica_pom = roznica;
            litera_wyraz = wyraz[i];
            litera_szyfr = szyfr[i];
            numer_wyraz = int(litera_wyraz);
            numer_szyfr = int(litera_szyfr);
            roznica = numer_szyfr - numer_wyraz;
            if(roznica<0) roznica += 26;
            if(roznica!=roznica_pom) cout<<wyraz;
        }
        cout<<endl;
    }
1

W pseudokodzie, główna część wygląda tak:

fstream input;
string word, crypto;

while(input >> word >> crypto)
{
  int diff = charsDiff(word[0], crypto[0]);
  
  for(int i = 1; i < word.length; i++)
    if(charsDiff(word[i], crypto[i]) != diff)
    {
      cout << word << "\n";
      break;
    }
}

a funkcja zwracająca różnicę kodów znaków tak:

int charsDiff(char A, char B)
{
  int diff = int(A) - int(B);
  return diff < 0 ? diff + 26 : diff;
}

Spróbuj w ten sposób – przystosuj ten pseudokod do C++.

0

Super jest to podejscie. Bardzo przejrzyste i logiczne :)
Chociaz ciezko mi bedzie sie przestawic i go nauczyc. Program smiga jak nalezy.
Ale ten moj blad nie bedzie mi dawal spokoju dzisiaj :P Dziekuje bardzo!

ps: w profesjonalnej developerce nie uzywa sie w ogole j.polskiego w programach?

0
Joff3R napisał(a):

ps: w profesjonalnej developerce nie uzywa sie w ogole j.polskiego w programach?

Nom. Jeśli użyjesz języka innego niż angielski to ograniczysz zrozumienie kodu do wąskiego grona tych, którzy ten język znają (czyli wyłącznie do Polaków i tych, którzy j. polski rozumieją).

Angielski natomiast znają prawie wszyscy, więc każdy może ten kod zrozumieć. ;)

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