Napisz aplikację, która wczyta tekst do zaszyfrowania oraz klucz. Tekst i klucz składa się wyłącznie z dużych liter alfabetu łacińskiego, spacji, myślników i liczb. Tekst powinien zostać zaszyfrowany przy pomocy specjalnego hasła.
Hasło tworzy się przy pomocy klucza. Z klucza usuwamy wszystkie znaki nie będące literami oraz znaki, które mają już odpowiednik w części wyrazu przed dana literą czyli klucz TEST KLUCZA zostanie zamieniony na TESKLUCZA. Hasło jest uzupełnione przez kolejne litery alfabetu, które nie występują w kluczu. Przykładowo klucz TEST KLUCZA da hasło: TESKLUCZABDFGHIJMNOPQRWVXY.
Szyfrowanie polega na zamianie litery A na pierwszy znak z hasła, literę B na drugi itd...
Przykładowo szyfrując zdanie TEKST DO ZASZYFROWANIA przy pomocy klucza HASLO MASLO otrzymamy:
Hasło będzie zawsze zawierać wszystkie litery alfabetu, więc ma stałą długość, którą przechowamy w zmiennej stałej key_length:
Szyfrowanie i deszyfrowanie będzie można wykonać przy pomocy tej samej funkcji. Będzie ona przyjmować dwa łańcuchy znaków z czego jeden będzie tekstem do zaszyfrowania, a drugi hasłem.
(2.) Dla każdego znaku z tekstu, (3.) pod warunkiem, że jest dużą literą, (4.) znajdujemy odpowiedni znak w haśle. Odbywa się to poprzez odjęcia od wybranego znaku znak "A".
Prze rozpoczęciem szyfrowania alokujemy pamięć, aby móc wczytać tekst oraz klucz.
(2.) char* text będzie przechowywać tekst do zaszyfrowania. (3.) char* keyword wczyta klucz według, którego powstanie hasło, a (4.) char* key jest to nasz właściwe hasło.
Wczytujemy (5.) tekst oraz (6.) klucz. (7.) W haśle ostatni znak ustawiamy na znak specjalny końca \0. Nie ma to znaczenia na proces ustalania hasła, ale ma na jego wypisywanie na ekran (np. w celach testowych).
Rozpoczynamy proces tworzenia hasła na podstawie klucza. (8.) Zmienna key_i jest zmienną pomocnicza, która podpowiada ile mamy już ustawionych znaków w haśle. (9.) Dla każdego znaku w kluczu: (10.) Zakładamy, że aktualnie sprawdzany znak dodajemy do hasła. (11.) Sprawdzamy czy znak jest literą. Jeśli tak to przechodzimy do (12.), a jeśli nie to znak pomijamy. (12.) Sprawdzamy czy w haśle dotąd ustalonym sprawdzany znak nie występuje. (14.) Jeśli występuje to zmieniamy dodaj na false co oznacza, że nasze przypuszczenie w (10.) było fałszywe i tego znaku nie dodajemy. (18.) Po zakończeniu pętli jeśli mamy dodać to dodajemy i-ty znak do hasła i zwiększamy długość hasła.
Kolejny krok polega na uzupełnieniu hasła brakującymi literami. Algorytm jest bardzo podobny do (9. - 21.) z tą różnicą, że zamiast sprawdzać kolejne znaki z klucza to sprawdzamy kolejne litery alfabetu.
Mając już hasło pozostaje jedynie (33.) wywołać funkcję changeTxt() z odpowiednimi argumentami: text i key oraz (34.) wypisać zaszyfrowany tekst na ekran.
Do deszyfrowania potrzebujemy jednak hasła deszyfrującego, które ma taką samą długość jak hasło. (35.) Deklarujemy nowy łańcuch znaków i (36.) dla każdego znaku z hasła. i-ty znak hasła deszyfrującego wskazuje literę, która była zmieniona przez i-ty znak hasła.
(39.) Wywołujemy ponownie changeTxt() zmieniając hasło na hasło deszyfrujące i (40.) wypisujemy wynik na ekran. (41.) Dealokujemy pamięć, (42.) czekamy na użytkownika i (43.) kończymy program.
Napisz program o podobnym działaniu, który: