Опрацювання рядкових даних
ПРАКТИЧНА РОБОТА 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. Випробуйте програму, проаналізуйте її роботу для різних значень зсуву (див. рисунок).
Зробіть висновок: як організувати опрацювання даних рядкового типу.