Опрацювання рядкових даних

ПРАКТИЧНА РОБОТА 16


Завдання:
скласти програму шифрування повідомлення шифром Цезаря.

Обладнання: комп’ютер із середовищем програмування Python.

Давньоримський імператор Юлій Цезар був першим, про кого відомо, що він придумав власне шифр. Абетка розміщується на колі за годинниковою стрілкою (при цьому в українському алфавіті після А йде Б, а після Я — А). Для шифрування кожна літера в тексті замінюється літерою, віддаленою від неї по колу на задане число позицій за годинниковою стрілкою.

Отже, якщо вибрано зсув на 3, то замість і-тої використовується (і + 3)-тя літера. Розшифрування виконується у зворотному порядку: беруть літеру, розміщену на задане число позицій проти годинникової стрілки.
На початку шифрування вибирають значення зсуву — ціле число k. Для того щоб імітувати зсув по колу на k, літера з номером n замінюється на літеру з номером new_n, що обчислюється за формулою
new_n = (n+k)% len(alphabet),
де alphabet — рядок, що містить всі літери алфавіту.

Хід роботи

Під час роботи за комп’ютером дотримуйтеся правил безпеки.

1. Завантажте програму Python IDLE і створіть нове вікно.

2. Створіть змінну alphabet, у якій зберігатиметься рядок, що містить літери українського алфавіту й апостроф.
alphabet = "'абвгґдеєжзиіїйклмнопрстуфхцчшщьюя"

3. Програма запитує, яку дію слід виконати — зашифрувати чи розшифрувати повідомлення.
Запишіть команду введення значення для змінної vidp:
vidp = input('Зашифрувати – 1, розшифрувати – 2 ')

4. Шифрування відкритого повідомлення оформте у вигляді функції shifr(), а розшифровування — deshifr().
Запишіть команду розгалуження, яка викликає потрібну функцію залежно від вибору користувача / користувачки:
if vidp == '1': shifr()
else: deshifr()

5. Опишіть функцію shifr().
Створіть потрібні змінні:
     code = '' # Змінна для збереження зашифрованого тексту
     vidkr = input('Уведіть відкрите повідомлення: ')
     k = int(input('Уведіть значення зсуву: ')) 

6. Запишіть команду циклу для заміни символів рядка vidkr:
     for bukva in vidkr:                                     # Переглядаються символи рядка vidkr
          if bukva in alphabet:                           # Якщо символ є в рядку alphabet,
               n = alphabet.find(bukva)              # обчислюється індекс символу в рядку alphabet
               new_k = (n+k)%len(alphabet)    # до індексу додається значення зсуву
               code += alphabet[new_k]             # до рядка code додається символ alphabet[new_k]
          else:                                                          # Якщо символ відсутній у рядку alphabet,
     code += bukva                                            # символ додається до рядка code без змін 

7. Запишіть команду виведення зашифрованого повідомлення.

8. Опишіть функцію deshifr().
Для розшифрування до програми: уводиться значення змінної code (зашифроване повідомлення); створюється змінна vidkr для збереження розшифрованого; переглядаються символи рядка vidkr; якщо символ є в рядку alphabet, визначається індекс символу в рядку alphabet та обчислюється нове значення індексу за формулою
new_k = (n–k)%len(alphabet)
(після цього символ alphabet[new_k] додається до рядка vidkr; якщо символ відсутній у рядку alphabet, він додається до vidkr без змін); виводиться значення змінної vidkr (розшифроване повідомлення). 

9. Збережіть файл із назвою Pract16

10. Випробуйте програму, проаналізуйте її роботу для різних значень зсуву (див. рисунок).


Зробіть висновок: як організувати опрацювання даних рядкового типу.