Problem z programem szyfrującym szyfrem Vigenera w c++?


(karton16) #1

Mam taki dziwny problem z tym programem:

#include

#include

#include

#include

#include 

using namespace std;

char b;

int i ,j, a=26;

bool prawda;

string alfabet="abcdefghijklmnopqrstuvwxyz";

ifstream plik;

ofstream plik2;

char t[26][26];

char znak,;

int indexi,indexj,dl;

string klucz;

main()

{

       plik.open("jawny.txt");

       plik2.open("szyfrogram.txt");

       if(plik.good()and plik2.good())

       {


       for(i=25;i>=0;i--)

       {

                        for(j=0;j<26;j++)

                        {

                                         t[25-i][j]=alfabet[a%26];

                                         a++;

                                         }

                                         a++;

                                         }


                                         cout <<"podaj klucz >>";

                                         cin >> klucz;


                                        while(!plik.eof())

                                        {

                                                          dl= klucz.length();

                                                           for(int j = 0; j <= dl; j++)

                                                                       {

                                                       plik >>znak;

                                                       for(int i = 0; i<26;i++)

                                                       {

                                                               if(znak == t[i][0])

                                                               {

                                                                      indexi = i; 

                                                                       }

                                                                       }



                                                                               for(int k = 0; k < 26;k++)


                                                                               {

                                                                                 if(klucz[j]==t[0][k])

                                                                                 {

                                                                                                      indexj = k;


                                                                                                      }  

                                                                                   }


                                                                                   }

                                                                                   plik2 << t[indexi][indexj];





                                                          }







                                            plik.close();

                                            plik2.close();

                                            }

                                            getch();

                                            }

Otóż według mnie program powinien szyfrowa prawidło, a jednak coś jest zle.


(Frankfurterium) #2

Ja tam się na C++ nie wyznaję, ale generalnie określenie " dziwny problem (...) coś jest zle" zbyt konkretne nie jest i wiele nie mówi. Dużo łatwiej będzie namierzyć błąd, kiedy określisz, czy program się wysypuje (jeśli tak, to gdzie i jaki rzuca komunikat) albo dlaczego wyniki nie spełniają twoich oczekiwań (jakie być powinny, a jakie są).

Umiejętność raportowania błędów to dla programisty dosyć ważna sprawa.


(Sawyer47) #3

Po bardzo pobieżnym przejrzeniu kodu:

-


(etam) #4

Będę ci to powtarzał do znudzenia: bledy-programie-napisanym-t530536.html#p3318123


(karton16) #5

Po prostu podczas szyfrowania tekst jawny np o długości 8 wyrazów, z kluczem tajne. Po działaniu programu uzyskuję błędną szyfrację o długości 5 znaków. W tym właśnie polega mój problem. Bibliotek używam standardowych. Wiem, że zamiast tego wystarczy tylko biblioteka iostream i fstream oraz stdio.h


(karton16) #6

No to może inaczej

#include

#include

#include

#include

#include 

using namespace std;


int main()

{


char b;

int i ,j, a=26;

bool prawda;

string alfabet="abcdefghijklmnopqrstuvwxyz";

ifstream plik;

ofstream plik2;

char t[26][26];

char znak;

int indexi,indexj,dl;

string klucz;


       plik.open("jawny.txt");

       plik2.open("szyfrogram.txt");

       if(plik.good()and plik2.good())

       {


       for(i=25;i>=0;i--) /* W tych dwóch pętlach for jest tworzona tablica Vigenera*/

       {

                        for(j=0;j<26;j++)

                        {

                                         t[25-i][j]=alfabet[a%26];

                                         a++;

                                         }

                                         a++;

                                         }


                                         cout <<"podaj klucz >>"; /*Tutaj pobierany jest klucz od urzytkownika*/

                                         cin >> klucz;


                                        while(!plik.eof())

                                        {

                                                          dl= klucz.length(); /*Pobieranie długości klucza*/

                                                           for(int j = 0; j <= dl; j++)/*Petla przetwarzająca klucz*/

                                                                       {

                                                       plik >>znak;

                                                       for(int i = 0; i<26;i++) /*Pętla szukająca pozycji litery tekstu jawnego pionowo w tablicy vigenera*/

                                                       {

                                                               if(znak == t[i][0])

                                                               {

                                                                      indexi = i;

                                                                       }

                                                                       }



                                                                               for(int k = 0; k < 26;k++) /*Pętla szukająca pozycji litery z klucza poziomo w tablicy vigenera*/


                                                                               {

                                                                                 if(klucz[j]==t[0][k])

                                                                                 {

                                                                                                      indexj = k;


                                                                                                      } 

                                                                                   }


                                                                                   }

                                                                                   plik2 << t[indexi][indexj];





                                                          }







                                            plik.close();

                                            plik2.close();

                                            }

                                            getch();

                                           return 0;

                                            }

Jeśli powtarzam hasło to proszę o pokazanie fragmentu kodu, w którym jest to powtórzenia, bo ja kombinuję na wszystkie sposoby i nic nie wychodzi.

W tym momencie szyfruje już tylko dwa znaki

-- Dodane 19.05.2013 (N) 15:12 --

Bardzo proszę o pomoc, gdyż ten program na jutro potrzebuję, a nie wiem gdzie zrobiłem błąd