Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Алгоритмізація та програмування 1: Базові концепції програмування
ЗВІТ
До модульної контрольної роботи №2
Варіант 7(3)
Дата «15» грудня 2021
Завдання:
/
Результат:
/
Висновок: було створено програму, яка розшифровує слово, що зашифроване методом Хілла.
https://replit.com/join/ltvtyoviig-vladsosiedskii
Код програми:
//15.12.2021 МКР2 ТР-15 Сосєдський Владислав
#include<stdio.h>
#include<math.h>
#define SIZE 2
int main(void){
int mat[SIZE][SIZE] = {6, 9, 3, 5};
int word[4]; //dvdz
float determinant = 0;
int i, j;
double invers[SIZE][SIZE], invers2[SIZE][SIZE];
char charr[26] = {'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'};
int n[26] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};
printf("\nВведіть 4 літери латинецею: ");
char charWord[4];
for (i=0; i<4; i++){
scanf("%c", &charWord[i]);
for(j=0;j<26;j++){
if(charWord[i] == charr[j]){
word[i] = j;
}
}
}
printf("Дано ключ матриці:");
for(i = 0; i < SIZE; i++){
printf("\n");
for(j = 0; j < SIZE; j++)
printf("%d\t", mat[i][j]);
}
determinant = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
if (determinant == 0){
printf("\nДетермінант дорівнєю 0, обчислення неможливе \n");
}
else {
printf("\nДетермінант: %f", determinant);
printf("\nОбернена матриця: ");
invers[0][0]=mat[1][1]/determinant;
invers[1][1]=mat[0][0]/determinant;
invers[0][1]=-mat[0][1]/determinant;
invers[1][0]=-mat[1][0]/determinant;
invers2[0][0]=mat[1][1];
invers2[1][1]=mat[0][0];
invers2[0][1]=-mat[0][1];
invers2[1][0]=-mat[1][0];
for(i = 0; i < SIZE; i++){
printf("\n");
for(j = 0; j < SIZE; j++){
printf("%.2f\t", invers[i][j]);
}
}
}
int reverse[SIZE][SIZE];
int t=0;
for(int i = 0;i<SIZE;i++){
for(int j = 0;j<SIZE;j++){
if(invers[i][j]>0 && (round(invers[i][j]) == invers[i][j])){
}
else{
if(invers[i][j]<0 && (round(invers[i][j]) == invers[i][j])){
invers[i][j]=invers[i][j]+26;
break;
}
if(round(invers[i][j]) != invers[i][j]){
for(int k=1;round(invers[i][j]) != invers[i][j];k++){
invers[i][j]= ((invers2[i][j]+26*k)/determinant);
}
}
}
}
}
for(i = 0; i < SIZE; i++){
for(j = 0; j < SIZE; j++){
reverse[i][j] = invers[i][j];
reverse[i][j] = reverse[i][j]%26;
}
}
printf("\nОбернена матриця з натуральними числами:");
for(i = 0; i < SIZE; i++){
printf("\n");
for(j = 0; j < SIZE; j++){
printf("%i\t", reverse[i][j]);
}
}
int mat21[SIZE][1], mat22[SIZE][1];
mat21[0][0]=(reverse[0][0]*word[0]+reverse[0][1]*word[1])%26;
mat21[1][0]=(reverse[1][0]*word[0]+reverse[1][1]*word[1])%26;
mat22[0][0]=(reverse[0][0]*word[2]+reverse[0][1]*word[3])%26;
mat22[1][0]=(reverse[1][0]*word[2]+reverse[1][1]*word[3])%26;
printf("\nЧисла отримані пілся множення: %i %i %i %i", mat21[0][0], mat21[1][0], mat22[0][0], mat22[1][0]);
printf("\nРозшифроване слово: ");
for(i = 0; i < SIZE; i++){
for(j = 0; j < 1; j++){
int k = mat21[i][j];
for(j = 0; j < 1; j++){
printf("%c",charr[k]);
}
}
}
for(i = 0; i < SIZE; i++){
for(j = 0; j < 1; j++){
int k = mat22[i][j];
for(j = 0; j < 1; j++){
printf("%c",charr[k]);
}
}
}
return 0;
}