Do szyfrowania będziemy potrzebowali klawiaturę z klasycznych telefonów, która poglądowo wygląda tak:
1 | 2 abc | 3 def |
4 ghi | 5 jkl | 6 mno |
7 pqrs | 8 tuv | 9 wxyz |
* | 0 _ | # |
Chcąc z klawiatury napisać literę k należało nacisnąć przycisk z 5 2 razy. Szyfrowanie opiera się właśnie na metodzie wpisywania. Każdą literę szyfrujemy jako dwie cyfry rozdzielone przecinkiem. Pierwsza cyfra to cyfra występująca na danym przycisku, a druga cyfr to ile razy taki przycisk należy nacisnąć. Kolejne znaki oddzielamy średnikiem. Zakładamy, że podkreślnik to przycisk 0, znak 1, a spacja to przycisk 1, znak 1.
Przykładowo szyfrując wyraz informacja: szukamy i, znajduje się pod przyciskiem z cyfrą 4 i jest trzecią literą, więc zapisujemy jako 4,3. Czynność powtarzamy dla każdej litery:
Litera | i | n | f | o | r | m | a | c | j | a |
---|---|---|---|---|---|---|---|---|---|---|
Szyfrogram | 4,3 | 6,2 | 3,3 | 6,3 | 7,3 | 6,1 | 2,1 | 2,3 | 5,1 | 2,1 |
Teraz odczytując kolejne zaszyfrowane znaki i oddzielając średnikiem odczytujemy szyfrogram 4,3;6,2;3,3;6,3;7,3;6,1:2,1;2,3;5,1;2,1.
Chcąc odszyfrować należy pamiętać, że bierzemy każdą parę cyfr rozdzieloną przecinkiem i pierwsza cyfra wskaże nam na który przycisk patrzymy, a druga cyfra, którą n-tą cyfrę mamy wybrać. Przykładowo mając 2,3 patrzymy na przycisk o numerze 2 i wybieramy 3 literę.
Do przechowywania wyglądu klawiatury nie będziemy używać tablic, ani funkcji switch - wystarczy nam zwykłe pojedyncze słowo. Zakładamy, że znaki grupujemy według cyfry występującej na danym klawiszu. Następnie sortujemy grupy według ich "numeru". Kolejne grupy rozdzielamy średnikiem:
Takie rozwiązanie pozwoli nam na proste wyszukiwanie znaku na klawiaturze i jeśli zajdzie potrzeba to zamiana małych liter z klawiatury na duże, aby i te móc zaszyfrować:
Na wejściu otrzymujemy ciąg złożonych z małych litera alfabetu łacińskiego, znaki spacji oraz podkreślnika. Nasze zadanie polega na zaszyfrowaniu wprowadzonego tekstu zgodnie szyfrem komórkowym i wypisanie go na wyjście.
Przykładowo dla danych:
otrzymamy:
Nasza funkcja będzie przyjmowała dwa argumenty: keyboard - ciąg znaków opisujący jak wygląda znak oraz txt - tekst, który mamy zaszyfrować:
(2.) Wyliczamy długość tekstu wynikowego i (3.) alokujemy pamięć pod wynik.
(4.) Dla każdego znaku rozpoczynamy szyfrowanie. (5.) Deklarujemy zmienne pomocnicze, które pomogą zapamiętać gdzie został odnaleziony i-ty znak na klawiaturze. (6.) Wyszukiwanie znaku prowadzimy, aż na j-tym miejscu znajdziemy żądany znak. (7.) Jeśli podczas przeszukiwania znajdziemy średnik to znaczy, że (8.) mamy nową grupę i (9.) pozycje liczymy od nowa. Jeśli jednak znak nie jest średnikiem to (11.) zwiększamy pozycję pos znaku w grupie. (13.) Na koniec każdej iteracji zwiększamy j o jeden.
Wszystkie wyliczone wartości odpowiednio zapisujemy w tablicy wynik: (15.) Numer grupy (począwszy od zera), (16.) przecinek, (17.) Numer pozycji znaku w grupie (począwszy od jeden) oraz (18.) znak rozdzielający średnik. Po zaszyfrowaniu ostatniego znaku: (20.) Dopisujemy znak \0 oraz (21.) zwracamy wynik.
Podczas deszyfrowania również przyjmiemy tylko dwa argumenty: keyboard - ciag znaków opisujący jak wygląda znak oraz txt - tekst, który mamy zaszyfrować:
Deszyfrowanie rozpoczynamy od (2.) obliczenia długości tekstu wynikowego oraz alokacji pamięć pod tekst jawny.
(4.) Dla każdego znaku obliczamy w której grupie group i na jakiej pozycji pos znajduje się znak. (5.) Deklarujemy też sgroup, spos, sj, które pomogą nam sprawdzić właściwości aktualnie przeglądanego znaku na klawiaturze. (6.) Tym razem przeszukujemy klawiaturę aż numer grupy i pozycja znalezionego znaku odpowiada tym odczytanym z szyfrogramu.
(16.) Odpowiedni znak przepisujemy do wynik. (18.) Dopisujemy znak \0 i (19.) zwracamy wynik.
Funkcja main(), która przetestuje działanie programu wygląda następująco:
Napisz kod klawiatury, która będzie szyfrować nie tylko małe znaki alfabetu łacińskiego, ale również cyfry.
Przykładowo dla danych:
Napisz funkcję, która przy pomocy domyślnej klawiatury zaszyfruje i odszyfruje duże i małe litery. Zakładamy, że cyfry użyte do szyfrowania małych liter są dalej rozdzielone przecinkiem, ale cyfry zaszyfrowanych dużych liter będą rozdzielone kropką.
Przykładowo dla danych: