Program szyfrujący tekst.

0

Napisałem taki sobie algorytm do szyfrowania.
Działa on tak:

  1. Losuje klucz.
  2. Szyfruje podany tekst za pomocą klucza.
  3. Odszyfrowuję zaszyfrowaną wiadomość za pomocą klucza.
    Punkt 1 działa dobrze (punkt) 2 szyfruje pierwszą literę a dla pozostałych daję minusowe wartości
    natomiast (punkt) 3 wyświetla znak '=' dla każdego znaku.

Nie wiem gdzie robię błąd - oto kod:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

char array_of_characters[] = "AaĄąBbCcĆćDdEeĘęFfGgHhIiJjKkLlŁłMmNnŃńOoÓóPpRrSsŚśTtUuWwXxYyZzŹźŻż";

int *Key(int size)
{
  srand( time( NULL ) );// potrzebne do losowania liczb pseudolosowych
  int *array_codes = new int [ size ];
  int x = 1, index = 0, i = 1, checked_index = 0;
  //cout << "Klucz:";
	while(x == 1)
	{
	 array_codes[index] = rand()% 999999;
	 i = 1;
	 checked_index = 0;
	     while(i == 1)
		 {
            if(array_codes[index] == array_codes[checked_index])
		    {
		     array_codes[index] = rand()%999999;//indeks tablicy ma wartość wylooswanej liczby
		    }
			checked_index++;
			if(checked_index >= (size - 1))i = 0;
		 }
	 //cout << " " << array_codes[index];
	 index ++;
	 if(index == (size -1 ))x = 0;
	}
  return array_codes;
}

int *Cypher(char *board, int *code, int number_of_encoded_text)
{
  int checked_mark = 0, comparison_with_an_array_of_characters = 0, index = 0;

  int *An_array_of_character_code = new int [ number_of_encoded_text ];

  while(checked_mark <= (number_of_encoded_text - 1))
  {
        while(comparison_with_an_array_of_characters <= (number_of_encoded_text - 1))
        {   
        if(board[checked_mark] == array_of_characters[comparison_with_an_array_of_characters]) An_array_of_character_code[checked_mark] = code[comparison_with_an_array_of_characters];        
        comparison_with_an_array_of_characters++;
	}
   checked_mark++;
  }
  
return An_array_of_character_code;
}

char *Decoding(char *array_of_characters, int *array_codes, int *array_ciphers )
{
   int size_an_array_of_character_code = sizeof(array_of_characters)/sizeof(int);
   int size_array_codes = sizeof(array_of_characters)/sizeof(char);
   char *decoded_message = new char [ size_array_codes ];
   
   bool x = 1, y = 1;
   int index_code = 0, index = 0;

   while(x <= (size_an_array_of_character_code - 1))
   {    
	index = 0;
        while(y <= (size_array_codes - 1))
        {
	if(array_ciphers[index_code] == array_codes[index])decoded_message[index_code] = array_of_characters[index];
	index++;
	}
        index_code++;
   }
   return decoded_message;
}

void main()
{   
	char text[] = "AaBb"; // TEKST DO ZAKODOWANIA

	int size_array_of_characters = sizeof(array_of_characters)/sizeof(char);
	int size_text = sizeof(text)/sizeof(char);

	int *array_of_encoded_characters = new int [size_array_of_characters - 1];
        int *tablica = new int [size_array_of_characters-1];
	char *decoded_message = new char [ size_text];

	int index = 0, i = 0, x = 0, y = 0;

	cout << "Ilosc kodowanych znakow " << (size_array_of_characters - 1) << endl;
        tablica = Key(size_array_of_characters);

	cout << endl << "Klucz:" << endl;
	while(i <= (size_array_of_characters ))
	{
        if(i == 10 || i == 20 || i == 30 || i == 40 || i == 50 || i == 60 || i == 70)cout << endl;
	cout << tablica[i] << endl;
	i++;
	}
	cout << endl << "Koniec klucza "<< endl << endl;
	//////////////////////////////////////////////
	array_of_encoded_characters = Cypher(text, tablica, (size_text - 1));
	while(x <= (size_text - 2))
	{
	if(x == 10 || x == 20 || x == 30 || x == 40 || x == 50 || x == 60 || x == 70)cout << endl;
	cout << array_of_encoded_characters[x] << endl;
	x++;
	}
	cout << endl;
	//////////////////////////////////////////////
	cout << endl << "Wiadomosc to:" << endl;
	decoded_message = Decoding(array_of_characters, tablica, array_of_encoded_characters);
	while(y <= (size_text - 2))
	{
	cout << decoded_message[y] << endl;
	y++;
	}
	//////////////////////////////////////////////
	cout << endl;
        delete[]array_of_encoded_characters;
	delete[]tablica;
	delete[]decoded_message;
	system("pause");
}
0

Poprawiłem funkcję kodującą i teraz działa lepiej ale czasami wywala jakieś minusowe wartości nie wiem dlaczego.

int *Cypher(char *board, int *code, int number_of_encoded_text)
{
  int checked_mark = 0, comparison_with_an_array_of_characters = 0;

  int *An_array_of_character_code = new int [ number_of_encoded_text ];

  while(checked_mark <= (number_of_encoded_text -1))
  {
   comparison_with_an_array_of_characters = 0;
        while(comparison_with_an_array_of_characters <= (number_of_encoded_text - 1))
        {   
	  if(board[checked_mark] == array_of_characters[comparison_with_an_array_of_characters]) An_array_of_character_code[checked_mark] = code[comparison_with_an_array_of_characters];  
         comparison_with_an_array_of_characters++;
	}
   cout << "Nr. spr. znaku to: " << checked_mark << " " << An_array_of_character_code[checked_mark] << endl;
   checked_mark++;
  }
  
return An_array_of_character_code;
}
0

BreakPoint i locals (do wyświetlenia zmiennych)

1

Kolego, nie przesadzasz z długością nazw zmiennych?

1

Może są długie ale przynajmniej wiem o co w nich chodzi.
Staram się tak nazywać zmienne, aby same "opisywały swoje przeznaczenie".

0

Debugger nie wykazał mi nic prócz ostrzeżeń dotyczących '<=' w pętli while().

0

Debugger nie wykazał mi nic prócz ostrzeżeń dotyczących '<=' w pętli while().

To może użyj go tak jak trzeba, śledząc linia po linii wykonywanie kodu?

0

Podaj przykład wejścia, dla którego dostajesz ujemne liczby na wyjściu. Tak na szybko, nie widzę błędu w tej funkcji.

0

Debuggerem sprawdziłem tak jak mówisz jednak dla pewności sprawdzę to jeszcze raz.

Jak wpisałem te znaki:

  • AaĄąBbCcĆćDdEeĘęFfGgHhIiJjKkLlŁłMmNnŃńOoÓóPpRrSsŚśTtUuWwXxYyZzŹźŻż
    to dla tych zaczął liczby ujemne sypać:
  • NnŃńOoÓóPpRrSsŚśTtUuWwXxYyZzŹźŻż

Ale tak to zależy od wiadomości czasami nawet wszystkie są ujemne.

0

Nikt nie może pomóc ???

0

Odświeżam

0

Zapomnij. Nikt tego spaghetti nie tknie nawet patykiem. Pogódź się z tym. Skasuj tą abominację i napisz od nowa. Tym razem z głową, porządnie i testując...

1

IMO ten kod wcale nie jest brzydki. Przeciwnie, jest ładny. Tyle wszyscy narzekają że ludzie nazywają zmienne int u, v, g, tu przychodzi ktoś z długimi nazwami zmiennych (ok, trochę ZA długimi. np. comparison_with_an_array_of_characters to zła nazwa - przede wszystkim dlatego ze nic nie mówi. No i wcięcia trochę nie te, pewnie owoc pracy z Dev-em) a wszyscy to nazywają abominacją :(

Zaraz spróbuję poprawić kod na bardziej klasycznie wyglądający, zobaczymy co wtedy ;]

edit:

char *Decoding(char *array_of_characters, int *codes, int *array_ciphers ) {
   int size_an_array_of_character_code = sizeof(array_of_characters)/sizeof(int);

Coś mi się wydaje że o to chodzi...

sizeof(array_of_characters) to wcale nie wielkość tablicy (nawet mimo że zmienna ma w nazwie array ;) ) - to wielkość wskaźnika na Twojej architekturze. Stała.

edit 2 btw. moja wersja funkcji Cypher (poprawiłem ją zanim doszedłem do Decoding gdzie na początku na ten kwiatek trafiłem:

int *Cypher(char *board, int *code, int textLen)
{
    int *character_codes = new int[textLen];
 
    for (int i = 0; i < textLen; i++) {
        for (int j = 0; j < textLen; j++) { // Tutaj też niezbyt różowo - powinna być to długość tablicy array_of_characters (nazwy nie zdążyłem zmienić)
            if(board[i] == array_of_characters[j]) {
                character_codes[i] = code[j];
            }
        }
    }
    return character_codes;
}
0

Zapomnij. Nie będę pisał tego od nowa, nie trzeba dotykać tego patykiem - wystarczy klawiaturę. Pogódź się z tym. Nie będę pisał tej pseudo - abominacji od nowa. Wszystko rozrysowałem i napisałem z głową i nie testując. :)

Wiem, że są długie ale możecie podać własne substytuty dla tych zmiennych.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.