Інформація про навчальний заклад

ВУЗ:
Національний технічний університет України Київський політехнічний інститут
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Звіт
Предмет:
Алгоритмізація та програмування

Частина тексту файла (без зображень, графіків і формул):

Національний технічний університет України  «Київський політехнічний інститут імені Ігоря Сікорського» Алгоритмізація та програмування 1: Базові концепції програмування ЗВІТ До модульної контрольної роботи №2 Варіант 3 Дата «15» грудня 2021 Завдання на модульну контрольну роботу: На початку завдання дано зашифроване слово, та початкову матрицю. За допомогою цих даних потрібно розшифрувати дане слово за допомогою шифру Гілла. Результат роботи повинен відобразити: 1.    Обернену матрицю; 2.    Розшифроване повідомлення. Скріншот завдання: / / Хід роботи На початку виконання програми отримується рядок символів(строку): Зашифроване слово та початкова матриця ( матриця-ключ ). Далі проводиться його конвертація у матрицю індексів, згідно англійського алфавіту. Шукається обернена матриця до матриці-ключа та виконується її перетворення до потрібного вигляду. За допомогою множення матриць знаходиться кінцева матриця. Далі за допомогою англійського алфавіту, по індексам букв перетворюємо кінцеву матрицю індексів у матрицю символів і виводимо у консоль кінцеве розшифроване слово. Посилання на Repl.it: https://replit.com/join/molvlvfddn-tr-15fundamient Результати виконання програми: / Код програми: #include <stdio.h> #include <math.h> #define SIZE 2 #define WORDSIZE 4 int main(void) { char arr[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; char originalWord[WORDSIZE] = "dvdz"; char text[SIZE][SIZE] = {{},{}}; int selec = 0; // Перевод зашифрованого слова у матрицю символів while( selec < WORDSIZE) { for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { text[i][j] = originalWord[selec]; selec++; } } } printf("\033[1;31m"); printf("Зашифроване слово: \n"); printf("\033[0m"); for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { printf("%c", text[i][j]); } } printf("\n\n"); int key[SIZE][SIZE] = { {6,9}, {3,5} }; printf("\033[1;31m"); printf("Матриця шифрування: \n"); printf("\033[0m"); for(int i = 0; i < SIZE; i++) { printf("| "); for(int j = 0; j < SIZE; j++) { printf("%d ", key[i][j]); } printf("|\n"); } printf("\n"); int mat[SIZE][SIZE] = {{},{}}; // перетворення матриці символів у матрицю індексів for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { for(int c = 0; c < 26; c++) { if(text[i][j] == arr[c]) { mat[i][j] = c; } } } } int det = key[0][0]*key[1][1]-key[1][0]*key[0][1]; if(det == 0){ printf("\033[1;31m"); printf("EROR: determinant = 0"); printf("\033[0m"); return 0; } else if(det < 0) { det = det + 26; } int obertKey[SIZE][SIZE] = {{},{}}; obertKey[0][0] = key[1][1]; obertKey[0][1] = -key[0][1]; obertKey[1][0] = -key[1][0]; obertKey[1][1] = key[0][0]; // Транспонування матриці ключа int buff = 0; buff = key[0][1]; key[0][1] = key[1][0]; key[1][0] = buff; double obertKey1[SIZE][SIZE]; for(int i = 0; i < SIZE; i++){ for(int j = 0; j < SIZE; j++) { obertKey1[i][j] = (pow(-1, i+j)*key[SIZE-1-i][SIZE-1-j])/det; } } printf("\033[1;31m"); printf("Обернена матриця шифрування: \n"); printf("\033[0m"); for(int i = 0; i < SIZE; i++) { printf("| "); for(int j = 0; j < SIZE;j++) { printf("%.2f ",obertKey1[i][j]); } printf("|\n"); } printf("\n"); for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { if(obertKey[i][j] < 0) obertKey[i][j] = obertKey[i][j] + 26; } } int q = 0; int count = 0; int koef = 0; while((q*det)%26 != 1) { q++; count = q; } koef = count; for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { obertKey[i][j] = (obertKey[i][j]*koef) % 26; } } printf("\033[1;31m"); printf("Обернена матриця перетворена mod26: \n"); printf("\033[0m"); for(int i = 0;i < SIZE; i++) { printf("| "); for(int j = 0; j < SIZE;j++) { printf("%d ",obertKey[i][j]); } printf("|\n"); } printf("\n"); int count1 = 0; int resultMat[SIZE][SIZE] = {{},{}}; // Обрахування кінцевої матриці int count2 = 0; for(int i = 0; i < SIZE; i++) { count2 = 0; for(int k = 0; k < SIZE; k++) { for(int j = 0; j < SIZE; j++) { resultMat[count1][count2] += obertKey[k][j]*mat[i][j]; } count2++; } count1++; } for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { resultMat[i][j] = resultMat[i][j] % 26; } } printf("\033[1;31m"); printf("Кінцева матриця: \n"); printf("\033[0m"); for(int i = 0;i< SIZE; i++) { printf("| "); for(int j = 0; j < SIZE;j++) { printf("%d ",resultMat[i][j]); } printf("|\n"); } printf("\n"); // Перетворення кінцевої матриці, у матрицю сиволів розшифрованого слова char resultWord[SIZE][SIZE] = {{},{}}; for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { for(int q = 0; q < 26; q++) { if(resultMat[i][j] == q) { resultWord[i][j] = arr[q]; } } } } printf("\033[1;31m"); printf("Отримане слово внаслідок розшифрування:\n"); printf("\033[0m"); for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { printf("%c", resultWord[i][j]); } } printf("\n"); } Висновок: Поставлену задачу виконано. Було написано програму для розшифрування шифрів за допомогою методу Гілла.
Антиботан аватар за замовчуванням

03.05.2023 18:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!