МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Институт математики и информационных систем
Факультет автоматики и вычислительной техники
Кафедра систем автоматизации управления
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ PYTHON. РЕАЛИЗАЦИЯ ШИФРА A1Z26
Пояснительная записка Отчёт по дисциплине
«Учебная практика»
ТПЖА 090302.024 ПЗ
Разработал студент гр. ИТб-1302-01-00 ___________/ Мотошков Д.А./
(подпись)
Руководитель работы ___________/ Родионов К.В./
(подпись)
Работа защищена с оценкой «______________» «__»__________2020 г. Киров 2020
Утверждаю
| Зав. каф.
| САУ
|
|
| наименование
|
|
| Ланских Ю.В.
| подпись
| Ф.И.О.
| «
| 06
| »
| июля
| 20
| 20
| г.
|
ЗАДАНИЕ
на практику
по дисциплине
Учебная практика полное название дисциплины
Студенту
Мотошкову Д.А.
, обучающемуся по образовательной программе
09.03.02 – Информационные системы и технологии
полное название направления подготовки (специальности)
первый очная
курс обучения форма обучения
Индивидуальные задания, выполняемые в период практики:
| 1. Выполнить обучающие задания, приведённые в методических указаниях, для ознакомления с методами работы с языком Python.
| 2. Реализовать криптографический алгоритм (Шифр A1Z26) при помощи языка Python, не используя библиотечные функции связанные непосредственно с шифрованием. Разработанная программа должна осуществлять шифрование и дешифрование текста в соответствии с вариантом. В приложении должна быть возможность ввода текста (вручную или загрузка из файла – на усмотрение разработчика), ключа (если этого требует алгоритм) и зашифрованного текста.
|
1. Исходные данные:
| Язык программирования Python, шифр A1Z26
|
| 2. Основные разделы:
| Обзор среды программирования Spyder и введение в Python
| Алгоритм k-means
| Алгоритм k-NN
| Шифр A1Z26
| 3. График выполнения:
| Раздел №1 с 6.07.2020 по 07.07.2020
| Раздел №2 с 08.07.20 по 09.07.20
| Раздел №3 с 10.07.20 по 11.07.20
| Раздел №4 с 12.07.20 по 16.07.20
| Представить выполненную работу по практике на проверку не позднее:
|
| 16.07.20
|
|
| Дата
|
Руководитель работы
|
|
|
| Родионов К.В.
|
| 06.07.20
|
|
| Подпись руководителя
|
| Ф.И.О. руководителя
|
| Дата
| Задание принял
|
|
|
| Мотошков Д.А.
|
| 06.07.20
|
|
| Подпись обучающегося
|
| Ф.И.О. обучающегося
|
| Дата
| Реферат Мотошков Д.А. Программирование на языке Python: ТПЖА.090302.024 ПЗ: Учебная практика / ВятГУ, каф. САУ; рук. К.В. Родионов. – Киров, 2020. ПЗ 22 с., 5 рис., 2 источника, 5 прил.
ПРОГРАММИРОВАНИЕ, PYTHON, ПЕРЕМЕННЫЕ, ФУНКЦИИ, ШИФРОВАНИЕ.
Объект исследования и разработки – язык программирования Python.
Цель работы – изучить среду программирования Python и разработать программу, осуществляющую шифрование и дешифрование текста.
В соответствии с заданием и исходными данными было разработано приложение и описаны результаты полученной программы. Был реализован один из криптографических алгоритмов (шифр A1Z26) при помощи языка Python.
Содержание
Введение 3 1 Обзор среды программирования и введение в Python 4
1.1 Python 4
1.2 Преимущества и недостатки Python 5
2 Практическое изучение языка Python 8
2.1 Алгоритм k-means 8
2.2 Алгоритм k_NN 9
2.3 Математическая статистика 9
2.4 Шифр A1Z26 11
Вывод 13
Приложение А (справочное) Листинг реализации алгоритма k-means 14
Приложение Б (справочное) Листинг реализации алгоритма k_NN 15
Приложение В (справочное) Листинг Математическая статистика 17
Приложение Г (справочное) Листинг реализации шифра A1Z26 20
Приложение Д (справочное) Библиографический список 21
Введение 5
#run.py 17
import numpy as np import matplotlib.pyplot as plt from k_means import kmeans X = np.array([ [4, 4], [3, 3], [5, 3], [2, 3], [5, 5], [3, 2], [2, 4], [4, 5], [5, 4], [2, 2]]) m, n= X.shape ans = kmeans(2, X) print(ans) plt.plot(X[:,0], X[:,1], 'bx', ans[:,0], ans[:,1], 'r*', markersize=20) plt.grid() plt.show() 17
Введение Учебная практика дает студентам получить новые практические и теоретические знания, которые могут помочь в дальнейшем учебном процессе.
На этой практике будет изучен язык программирования Python, ориентированный на повышение производительности разработчика и читаемости кода.
Целью учебной практики является изучение основ языка программирования Python путем разработки приложений и реализации криптографического алгоритма.
Python – высокоуровневый язык программирования, используемый в различных сферах IT для разработки приложений самого разнообразного назначения.
1 Основы Python и обзор среды программирования
Различные языки программирования обычно доминируют в какой-то отрасли, для работы в которой они хорошо подходят. Но это не значит, что программист ограничен использовать строго определённый инструмент, поэтому любой язык общего назначения, такой как Python, может применять для создания чего-угодно.
Но данный язык имеет несколько различных сред разработки, например PyCharm, PyDev, Geany и Spyder.
1.1 Python
Python – современный язык программирования высокого уровня. Он представляет собой интерпретируемый объектно-ориентированный язык и интерактивную среду для разработки программ. С его помощью можно разрабатывать приложения с графическим интерфейсом, работать с базами данных, создавать Web-сайты. Python может использоваться для написания прикладных приложений, машинного обучения и многого другого.
Язык программирования Python обладает ясным и понятным синтаксисом и хорош для программирования математических вычислений. Python реализован практически во всех операционных системах и большинство его модулей распространяется бесплатно.
Python начал разрабатываться во второй половине 80-х гг. прошлого века. Автором Питона стал программист из Нидерландов по имени Гвидо ван Россум. Изначально язык должен был стать объектно-ориентированным. Фактически, это был язык сценариев (скриптовый язык). В феврале 1991 года Россум опубликовал исходный код языка в одной из новостных групп.
Основными факторами успеха Python стали удачный выбор места презентации в популярном и массовом профессиональном сообществе в сочетании с действительно простым кодом и широкими возможностями.
Впоследствии Гвидо создал специализированный портал PEP, где идет регулярное обсуждение по развитию и улучшению продукта. В 2008 года появилось большое обновление языка – Python 3.0. В этой версии были устранены многие ключевые недоработки в архитектуре ядра. Что было важно – новая версия продукта сохранила полную совместимость с более старыми вариантами.
Описания типов переменных в Python нет. Это означает, что при присваивании переменной значения интерпретатор автоматически относит переменную к одному из типов данных.
Python содержит такие структуры данных как:
1) Список (list) – похожи на одномерные массивы (список, включающий списки – многомерный массив).
2) Кортеж (tuple) – неизменяемый список.
3) "Массивы" в Python могут содержать данные любого типа, то есть в одном массиве может могут находиться числовые, строковые и другие типы данных [1].
1.2 Преимущества и недостатки Python
Рассмотрим преимущества и недостатки языка программирования Python:
1) В Python не надо заранее объявлять тип переменной, что очень удобно при разработке
2) Хорошая поддержка модульности. Вы можете легко написать свой модуль и использовать его в других программах.
3) Встроенная поддержка Unicode в строках. В Python необязательно писать всё на английском языке, в программах вполне может использоваться ваш родной язык.
4) Поддержка объектно-ориентированного программирования. При этом его реализация в Python является одной из самых понятных.
5) Автоматическая сборка мусора, отсутствие утечек памяти.
6) Интеграция с C/C++, если возможностей Python недостаточно.
7) Понятный синтаксис, способствующий ясному отображению кода. Система функций позволяет создавать код, в котором будет легко разобраться другому человеку в случае необходимости. Также вы сможете научиться читать программы и модули, написанные другими людьми.
8) Огромное количество модулей Python3. В некоторых случаях для написания программы достаточно найти подходящие модули и правильно их скомбинировать. Таким образом, можно работать с уже готовыми элементами, выполняющими различные действия.
2 Практическое изучение языка Python
Язык Python на сегодняшний день считается самым универсальным языком программирования. Используя Python, можно программировать почти все. На нём активно программирует большинство IT-компаний.
2.1 Алгоритм k-means
Предположим, требуется сформировать две группы студентов (УТ-11 и УТ-12) для обучения на специальности. Известны оценки абитуриентов за тесты по физике и математике. Требуется реализовать алгоритм k-means, с помощью которого выделить два кластера, описывающих формируемые группы студентов.
Алгоритм k-means:
1. Задается количество кластеров k, которые требуется обнаружить.
2. Центры кластеров изначально инициализируются случайным образом.
3. Каждый из объектов приписывается к ближайшему кластеру.
4. На основании объектов, вошедших в каждый кластер, центры кластеров пересчитываются.
5. Шаги 3 и 4 повторяются до тех пор, пока центры кластеров не стабилизируются, то есть на очередной итерации объекты будут принадлежать тем же кластерам, что и до этого.
Листинг программы представлен в приложении А.
Результат работы программы предоставлен на рисунке 1.
Рисунок 1– решение первого задания 2.2 Алгоритм k_NN
В задании по введенным данным роста и веса определить к какому виду относится особь. Каждый вид характеризуется определенным средним значением роста и веса.
В основе kNN лежит следующее правило: объект считается принадлежащим тому классу, к которому относится большинство его ближайших соседей. Под «соседями» здесь понимаются объекты, близкие к исследуемому в том или ином смысле. Для применения метода kNN в пространстве признаков объектов должна быть введена некоторая функция расстояния. Работа программы – классификация особей с помощью реализованного алгоритма предоставлена на рисунке 2.
Рисунок 2 – решение второго задания
Листинг программы представлен в приложении Б.
2.3 Математическая статистика
В задании нужно выполнить несколько заданий представленных ниже:
1) Создать в Python переменную, массив, матрицу с заданными, случайными целочисленными, нулевыми, единичными значениями.
2) Импортировать переменную (матрицу) из текстового структурированного файла (файл создать вручную: разделители столбцов – пробелы).
3) Загрузить одномерные данные из каталога data/1D из файла с расширением .mat согласно варианту. Оценить параметры одномерной случайной величины. Команды сохранить в скрипт.
4) Вывести графики одномерных случайных величин и их плотности распределения. Команды сохранить в скрипт. Подобрать вид распределения одномерной случайной величины и его параметры. На одном графике отобразить случайную величину, уровень среднего значения и дисперсию.
5) Построить и вывести на графике автокорреляцию заданной одномерной случайной величины. Команды сохранить в скрипт.
6) Импортировать из каталога data/NDфайл *.mat с многомерными данными согласно варианта. Первые 5 столбцов считать входными значениями, последний 6 столбец – выходная величина, для которой требуется установить зависимость от входных величин.
7) Построить матрицу корреляции для всех входных и выходных величин. Сделать выводы о зависимости/независимости выходной величины от каждой из входных компонент. Отобразить точечный график для случайных величин, коэффициент корреляции для которых по модулю больше 0.8.
На рисунке 3 представлены графики, которые были получены по окончанию выполнения задания, а на рисунке 4 представлен результат работы программы.
Листинг программы представлен в приложении В.
Рисунок 3 – Графики, полученные в ходе работы
Рисунок 4 – Результат работы программы
2.4 Шифр A1Z26
Задание: Реализовать криптографический алгоритм (Шифр A1Z26) при помощи языка Python, не используя библиотечные функции связанные непосредственно с шифрованием. Разработанная программа должна осуществлять шифрование и дешифрование текста в соответствии с вариантом. В приложении должна быть возможность ввода текста (вручную или загрузка из файла – на усмотрение разработчика), ключа (если этого требует алгоритм) и зашифрованного текста.
Шифр подстановки— это метод шифрования, в котором элементы исходного открытого текста заменяются зашифрованным текстом в соответствии с некоторым правилом. Элементами текста могут быть отдельные символы (самый распространённый случай), пары букв, тройки букв, комбинирование этих случаев и так далее.
Шифрование/дешифрование исходных данных
Алгоритм шифрования: каждая буква заменяется своим порядковым номером в алфавите.
Процесс расшифрования: нужно прописывать цифры таким образом, чтобы они были отделены друг от друга чертой, дефисом или пробелом, главное, чтобы не были слитные цифры.
Листинг индивидуального задания представлен в приложении Г.
Номера букв латинского алфавита представлены на рисунке 5.
Рисунок 5 – Нумерация латинского алфавита
Вывод
Данная практическая работа сыграла огромную роль в приобретении практических навыков. В ходе выполнения практики был изучен такой язык программирования, как Python. Он оказался прост в применении и понимание, что облегчило выполнение практической работы. Также были закреплены все полученные теоретические знания по изученной дисциплине, что пригодится в дальнейшем.
В ходе летней учебной практики были выполнены следующие задачи:
1) Ознакомление со средой разработки.
2) Изучение базовых возможностей языка программирования Python.
3) Изучение алгоритмов k-means, k_NN, основные программные свойства и методы Математической статистики.
4) Разработка криптографического алгоритма шифрования.
5) Повторение основ оформления научно-исследовательских работ в соответствии с СТП ВятГУ 101-2004 [2].
Приложение А
(справочное)
Листинг алгоритма k-means
# k_means.py
import numpy as np
def dist(A, B):
V = A - B
V2 = np.power(V, 2)
r = np.sqrt(np.sum(V2))
return r
def class_of_each_point(X, centers):
m = len(X)
k = len(centers)
distances = np.zeros((m, k))
for i in range(m):
for j in range(k):
distances[i, j] = dist(centers[j], X[i])
return np.argmin(distances, axis=1) def kmeans(k, X): m, n = X.shape curr_iteration = prev_iteration = np.zeros(m) centers = np.random.random((k, n))
centers = centers * (np.max(X, axis=0) - np.min(X, axis=0)) + + np.min(X, axis=0)
curr_iteration = class_of_each_point(X, centers) while True:
prev_iteration = curr_iteration
for i in range(k):
sub_X = X[curr_iteration == i, :]
if len(sub_X) > 0:
centers[i, :] = np.mean(sub_X, axis=0)
curr_iteration = class_of_each_point(X, centers)
if np.all(prev_iteration == curr_iteration):
break return centers
#run.py import numpy as np import matplotlib.pyplot as plt from k_means import kmeans
X = np.array([ [4, 4], [3, 3], [5, 3], [2, 3], [5, 5], [3, 2], [2, 4], [4, 5], [5, 4], [2, 2]])
m, n= X.shape ans = kmeans(2, X) print(ans) plt.plot(X[:,0], X[:,1], 'bx', ans[:,0], ans[:,1], 'r*', markersize=20) plt.grid() plt.show()
Приложение Б
(справочное)
Листинг алгоритма k_NN # kNN.py import numpy as np
import math def k_nearest(X, k, obj): Xn = X[:, 0:-1]
Xnstd = np.std(Xn,axis=0)
Xn = (Xn-Xnmean)/Xnstd
objn = (obj-Xnmean)/Xnstd
dist_arr =[dist(x, objn) for x in Xn]
dist_arr =np.argsort(dist_arr)
nearest_classes = X[dist_arr[:k], -1]
unique, counts = np.unique(nearest_classes, return_counts=True)
object_class = unique[np.argmax(counts)] return object_class
def dist(p1, p2):
return math.sqrt(sum((p1 - p2)**2))
# run.py import numpy as np from kNN import k_nearest X = np.array([ [33, 21, 1], [43, 13, 1], [18, 22, 1], [38, 34, 1], [62, 118, 2], [59, 137, 2], [95, 131, 2], [83, 110, 2], [185, 155, 3], [193, 129, 3], [164, 135, 3], [205, 131, 3], [145, 55, 4], [168, 35, 4], [135, 47, 4], [138, 66, 4] ])
height = int(input("Введите рост:")) weight = int(input("Введите вес:"))
obj = np.array([height, weight])
k = 3 object_class = k_nearest(X, k, obj)
monkeys = {1: 'lemur', 2: 'schimpanze', 3: 'gorilla', 4: 'orangutan'} print(monkeys[object_class])
Приложение В
(справочное)
Листинг Математическая статистика #script.py import numpy as np
import matplotlib.pyplot as plt
import scipy.io
import pprint
def task_1():
a = 10
print(a)
b = [1, 2, 3]
print(b)
c = np.array([[1, 2, 3], [4, 5, 6]])
print(c)
d = np.random.randint(2, 6, (5, 5))
print(d)
e = np.zeros((2, 2))
print(e)
f = np.ones((2, 3))
print(f) def task_2():
array = np.loadtxt('C:/Users/m0t0s/test.txt', dtype=np.int32)
pprint.pprint(array) def task_3():
data=scipy.io.loadmat ('C:/Users/m0t0s/Practice_Day_Three_Edition/data/1D/var5.mat')
data = data['n']
print(np.max(data))
print(np.min(data))
print(np.median(data))
print(np.mean(data))
print(np.var(data))
print(np.std(data)) return data def task_4(data):
plt.plot(data)
plt.show()
mean = np.mean(data) * np.ones(len(data))
var = np.var(data) * np.ones(len(data))
plt.plot(data, 'b-', mean, 'r-', mean-var, 'g--', mean+var, 'g--')
plt.grid()
plt.show()
plt.hist(data, bins=20)
plt.grid()
plt.show() def autocorrelate(a):
n = len(a)
cor = []
for i in range(n//2, n//2+n):
a1 = a[:i+1] if i< n else a[i-n+1:]
a2 = a[n-i-1:] if i< n else a[:2*n-i-1]
cor.append(np.corrcoef(a1, a2)[0, 1])
return(cor) def task_5(data):
print(data.shape)
data = np.ravel(data)
print(data.shape) # (1000, )
cor = autocorrelate(data)
plt.plot(cor)
plt.show()
def task_67():
data = scipy.io.loadmat
('C:/Users/m0t0s/Practice_Day_Three_Edition/data/ND/var3.mat')
data = data['mn']
n = data.shape[1]
corr_matrix = np.zeros((n,n))
for i in range(n):
for j in range(n):
column1 = data[:,i]
column2 = data[:,j]
corr_matrix[i, j] = np.corrcoef(column1, column2)[0, 1]
np.set_printoptions(precision=2)
print(corr_matrix)
plt.plot(data[:, 2], data[:, 5], 'b.')
plt.grid()
plt.show()
if __name__ == '__main__':
print('Задание #1')
task_1()
print('Задание #2')
task_2()
print('Задание #3')
data = task_3()
print('Задание #4')
task_4(data)
print('Задание #5')
task_5(data)
print('Задание #6 и #7')
task_67() Приложение Г
(справочное)
Листинг Шифра A1Z26
def A1Z26_code(codestring): rezult = "" codestring = codestring.lower() codestring = "".join(codestring.split()) for x in range(0, len(codestring)): char = ord(codestring[x]) - 96 if char > 0 and char <= 26: rezult += str(char) + " " return rezult
def A1Z26_decode(decodestring):
rezult = "" data = decodestring.split()
for char in data: char = chr(int(char) + 96) rezult += char return rezult
select= input("Введите 0 если хотите зашифровать или 1 для расшифровки:")
if select == '0': codestring = input("Введите текст на английском, цифры и пробелы будут проигнорированы:") print("Результат шифрования:") print(A1Z26_code(codestring)) if select == '1': decodestring = input("Введите зашифрованную фразу разделяя цифры пробелами:") print("Результат расшифровки:") print(A1Z26_decode(decodestring)) Приложение Д
(справочное)
Библиографический список 1) Доля П.Г. Введение в научный Phyton [Текст]: учебное пособие/П.Г. Доля – Харьков: Харьковский Национальный Университет, 2016. – 43с.
2) СТП ВятГУ 101-2004 Общие требования к оформлению текстовых документов// Киров: ВятГУ, 2004.
|