Отчеты / ЯП6
.pdfМинистерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Отчет по лабораторной работе №6
по дисциплине «Языки программирования»
Выполнил:
Студент гр. 710-2
_______ _____Кузьмина А.А.
__.04.2022
Принял:
Младший научный сотрудник
Кафедры КИБЭВС
_______ ________Полюга В.А.
___.04.2022
Томск - 2022
2
1 Введение
Цель работы: знакомство с основными концепциями и приемами объектно-ориентированного анализа и проектирования, выработка практических навыков в построении модели предметной области и элементов модели проектирования.
Для работы был взят 5 вариант задания «шифр Хилла».
Для написания программы использовался язык программирования С#.
Среда разработки Microsoft Visual Studio 2019.
3
2 Ход работы
Для реализации шифра Хилла был написан абстрактный класс
HillCypherAbs. Был разработан интерфейс, в котором были заданы виртуальные методы getKeyMatrix и encrypt, отвечающие за перевод кодового слова в матрицу и за шифрование, и функции Algorythm и Show, для инкапсуляции текста и вывода текста на консоль. Код представлен ниже:
abstract class HillCypherAbs
{
public virtual void getKeyMatrix(string key, int[,] keyMatrix)
{
}
public virtual void encrypt(int[,] cipherMatrix, int[,] keyMatrix, int[,] messageVector)
{
}
public abstract string Algorythm();
public void Show()
{
Console.WriteLine($"Зашифрованный текст+ {Algorythm()} ");
}
}
Далее был создан наследуемый класс HillCypher. После этого используется свойство полиморфизма для encrypt, getKeyMatrix и Algorythm в
наследуемом классе HillCypher. Ниже представлен код:
4
public override void getKeyMatrix(string key, int[,] keyMatrix)
{
int k = 0;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
keyMatrix[i, j] = (key[k]) % 65; k++;
}
}
}
public override void encrypt(int[,] cipherMatrix, int[,] keyMatrix,
int[,] messageVector)
{
int x, i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 1; j++)
{
cipherMatrix[i, j] = 0;
for (x = 0; x < 4; x++)
{
cipherMatrix[i, |
j] |
+= |
keyMatrix[i, |
x] |
* |
messageVector[x, j];
}
cipherMatrix[i, j] = cipherMatrix[i, j] % 26;
}
}
}
5
Для класса был прописана функция Algorythm и метод Main. Код с методом Algorythm и Main представлен ниже:
private string ad, bc;
public HillCypher(string message, string key)
{
ad = message; bc = key;
}
public string get_text()
{
return this.ad;
}
public override string Algorythm()
{
int[,] keyMatrix = new int[4, 4]; getKeyMatrix(bc, keyMatrix);
int[,] messageVector = new int[4, 1];
for (int i = 0; i < 4; i++) messageVector[i, 0] = (ad[i]) % 65;
int[,] cipherMatrix = new int[4, 1]; encrypt(cipherMatrix, keyMatrix, messageVector);
String CipherText |
= |
""; |
for (int i = 0; i |
< |
4; i++) |
CipherText += |
(char)(cipherMatrix[i, 0] + 65); |
|
return CipherText; |
|
|
}
}
static void Main(string[] args)
6
{
Console.WriteLine("Введите слово из 4 букв: ");
String message = Console.ReadLine();
Console.WriteLine("Введите ключ из 16 букв: ");
String key = Console.ReadLine();
HillCypherAbs Object = new HillCypher(message , key);
Object.Show();
}}
Рассмотрим основные принципы ООП такие, как наследование, полиморфизм и инкапсуляция:
1. Наследование.
Создаем абстрактный класс HillCypherAbs и у нас появляется возможность создать наследованные классы. После того, как мы укажем методы в абстрактном классе getKeyMatrix, encrypt и функции Show, Algorythm мы можем их использовать в наследуемом классе HillCypherAbs.
Ниже представлен код с использованием наследования:
class HillCypher : HillCypherAbs
{
public override void getKeyMatrix(string key, int[,] keyMatrix)
{
int k = 0;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
keyMatrix[i, j] = (key[k]) % 65; k++;
}
}
}
public override void encrypt(int[,] cipherMatrix, int[,] keyMatrix, int[,] messageVector)
{
int x, i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 1; j++)
{
cipherMatrix[i, j] = 0;
for (x = 0; x < 4; x++)
{
cipherMatrix[i, j] += keyMatrix[i, x] *
messageVector[x, j];
7
}
cipherMatrix[i, j] = cipherMatrix[i, j] % 26;
}
}
}
private string ad, bc;
public HillCypher(string message, string key)
{
ad = message; bc = key;
}
public string get_text()
{
return this.ad;
}
public override string Algorythm()
{
int[,] keyMatrix = new int[4, 4]; getKeyMatrix(bc, keyMatrix);
int[,] messageVector = new int[4, 1];
for (int i = 0; i < 4; i++) messageVector[i, 0] = (ad[i]) % 65;
int[,] cipherMatrix = new int[4, 1]; encrypt(cipherMatrix, keyMatrix, messageVector);
String CipherText |
= |
""; |
for (int i = 0; i |
< |
4; i++) |
CipherText += |
(char)(cipherMatrix[i, 0] + 65); |
|
return CipherText; |
|
|
}
}
2. Полиморфизм.
В абстрактном классе мы указали виртуальные методы encrypt, getKeyMatrix и функции Show, Algorythm. С помощью полиморфизма мы можем переопределить их. Переопределение происходит с помощью модификатора override. Код с использованием полиморфизма представлен ниже:
public override void getKeyMatrix(string key, int[,] keyMatrix)
{
int k = 0;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
keyMatrix[i, j] = (key[k]) % 65; k++;
}
}
}
public override void encrypt(int[,] cipherMatrix, int[,] keyMatrix, int[,] messageVector)
{
int x, i, j;
8
for (i = 0; i < 4; i++)
{
for (j = 0; j < 1; j++)
{
cipherMatrix[i, j] = 0;
for (x = 0; x < 4; x++)
{
cipherMatrix[i, j] += keyMatrix[i, x] *
messageVector[x, j];
}
cipherMatrix[i, j] = cipherMatrix[i, j] % 26;
}
}
}
public override string Algorythm()
{
int[,] keyMatrix = new int[4, 4]; getKeyMatrix(bc, keyMatrix);
int[,] messageVector = new int[4, 1];
for (int i = 0; i < 4; i++) messageVector[i, 0] = (ad[i]) % 65;
int[,] cipherMatrix = new int[4, 1]; encrypt(cipherMatrix, keyMatrix, messageVector);
String CipherText |
= |
""; |
for (int i = 0; i |
< |
4; i++) |
CipherText += |
(char)(cipherMatrix[i, 0] + 65); |
|
return CipherText; |
|
|
}
3. Инкапсуляция.
Инкапсуляция позволяет при необходимости скрыть код и ограничить доступ к коду и данным из других участков кода. Для инкапсуляции используются public свойства и методы объекта, а переменные остаются закрытыми. Код с использованием инкапсуляции представлен ниже:
private string ad, bc;
public HillCypher(string message, string key)
{
ad = message; bc = key;
}
public string get_text()
{
return this.ad;
}
9
Была создана UML-диаграмма классов программы с дополнительными возможными классами. Диаграмма представлена на рисунке 1.
Рисунок 1 – UML-диаграмма.
10
3Заключение
Впроцессе выполнения лабораторной работы были изучены основные концепции и приёмы объектно-ориентированного анализа и проектирования,
выработаны практические навыки в построении модели предметной области и элементов модели проектирования.
Был реализован шифр Хилла с помощью абстрактного класса и его производных классов.
Отчёт был написан согласно ОС ТУСУР 2013.