Шифр Цезаря (Код Цезаря) – приклад на Сі, VB, Delphi, C# – кодування вхідного рядка методом

цезаря

приклад

Розробити програму, що кодує вхідний рядок методом моноалфавітної підстановки, використовуючи«шифр Цезаря». Програма повинна підтримувати введення даних як зі стандартного пристрою, так і з файлу.

Допустимі символи – латинські літери «a»-«z», «A»-«Z», українські літери «а»-«я», «А»-«Я», пробіл. Введення рядка закінчується введенням символу з кодом 13 таблиці ASCII (CARRIAGE RETURN – клавіша Enter).

Якщо програма використовує для перетворення рядок з файлу, то нею має бути створений файл з ім'ям .out.txt, в якому буде записано перетворений рядок.

Якщо програмі було передано хоча б один параметр, то програма повинна використовувати як вхідний рядок (для перетворення) перший рядок з файлу, назва якого задано першим параметром.

Якщо в ліченому з файлу рядку присутні символи з кодами ASCII 0-31, то програма повинна їх попередньо видалити (не з файлу, а з рядка, що аналізується в програмі) перед перетворенням.

Якщо програмі не було передано жодного параметра, вона повинна вивести на дисплей повідомлення«Choose string source: 1 – keyboard, 2 – file.» і чекати введення цифри 1 або 2 зі стандартного пристрою введення (клавіатури) .

Програма повинна закодувати вхідний рядок методом моноалфавітної підстановки, використовуючишифр Цезаря. До коду ASCII кожної літери англійського алфавіту «a»-«z», «A»-«Z» та українського алфавіту «а»-«я », «А»-«Я» додати 3. Якщо код таблиці ASCII, що вийшов, за межі зазначених наборів символів, то вважати, що за останнім символом набору знову слід перший (цикл по кільцю). За кодами, що вийшли, записати перетворений рядок.

Приклад виклику програми з параметром:Prog1.exe my.txt

Визначимо як константи п'ять наборів символів: const char EN[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char en[]="abcdefghijklmnopqrstuvwxyz"; const char pun[]=". !_;()-+%="; const char UA[]="АБВГДЕЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; const char ruw[]="абвгдеёжзийклмнопрстуфхцчшщъыьэюя";

Власне функція «код Цезаря» виглядатиме так:

char CezarCod(const char* aSet, char ch, int sm) < unsigned short p = 0, len = strlen (aSet); char * nch = strchr (aSet, ch); //Покажчик на вихідний символ у наборі

if(nch) p=nch-aSet; //порядковий номер вихідного символу набору else return '\0'; //означає символ не з цього набору

//отримання правильного зміщення яке >=0 і менше len рядка набору if(sm>0) while(sm>=len) sm-=len; else if(sm len)? p-len: p; //завжди позитивно > return aSet[p]; // символ із набору після зміщення. >

Як бачимо, якщо символ належить набору (рядку у першому параметрі), то повертається покажчик новий символ цього набору залежно від величини усунення (негативного чи позитивного – байдуже). Набір закольцований (за межі набору вийти не можна). Функція повертає '\0', якщо символ не належить до набору.

Використовувати функцію в програмі - справа техніки ... Щось на зразок: char newCh = CezarCod (RUW, ch, 3); if(newCh) return newCh;