ГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., канд. техн. наук |
|
|
|
А. В. Аграновский |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №7 |
ПОСТРОЕНИЕ ГРАФИКОВ |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
Жовтяк М.О. |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Вариант 15 (15 задание)
Постановка задачи
Постройте график, на котором изображены окружности разного радиуса и цвета, используя библиотеку графического вывода mathplotlib и библиотеку математических функций numpy.
Конечная цель программы – вывод графика, на котором изображены окружности разного радиуса и цвета.
Ограничение на входные данные – количество окружностей должно быть больше 0 и быть целым число, координаты и радиус – числа.
Дополнительные требования к программе не были выявлены.
Математическая модель
Ось абсцисс – значение координаты x, ось ординат – значение координат y. Координаты – это центр окружности и уже от неё, согласно выбранному радиусу, строится окружность со случайным цветом.
Описание разработанной программы
Первым делом, программа запрашивает разрешение на автоматическую генерацию. Это было сделано для быстрой проверки работы программы. Если пользователь согласится, то программа быстро создаст случайное количество окружностей и выведет их на график. Если - нет, тогда программа запросит количество окружностей, которое он хочет построить, в функции filling(). После этого в цикле программа через пробел просит координаты x, y и радиус каждой окружности. Эти данные передаются в основную программу LAB7_VAR15(), в которую заносятся данные всех окружностей и выводится график, а также проводится проверка на соответствие данных.
Таблица 1 демонстрирует список используемых переменных.
Таблица 1 - Описание переменных
Имя переменной |
Тип переменной |
Назначение переменной |
mx |
List |
Массив, хранящий координаты x окружностей |
my |
List |
Массив, хранящий координаты y окружностей |
mr |
List |
Массив, хранящий радиусы окружностей |
n |
Int |
Количество окружностей |
q |
Str |
Строковое переменная, значение которого выполняет автоматическую генерацию |
x |
Float |
Промежуточная переменная для записи координаты x окружности |
y |
float |
Промежуточная переменная для записи координаты y окружности |
r |
float |
Промежуточная переменная для записи радиуса окружности |
colors |
list |
Массив для доступных цветов окружности |
Описание алгоритма работы программы представлено в виде блок схемы на рисунке 1.
Рисунок 1 – Блок-схема алгоритма
Вычислительная сложность реализованного алгоритма в нотации O() является линейной O(n), что означает, что вычислительная сложность алгоритма зависит от входных значений линейно. Это связано с возможностью самостоятельного ввода массивов. При использовании более большого количества значений массивов программе будет нужно больше времени на реализацию.
Код программы:
import random
import matplotlib.pyplot as plt
# заполнение данных об окружностях
def filling():
mx, my, mr = [], [], []
while True:
try:
n = int(input('Введите целое количество кругов: '))
if n < 1:
n = str(n) / 2
break
except:
print('Введенное число должно быть целым и больше 1!')
for i in range(n):
while True:
try:
x, y, r = input('Введите координаты x и y, радиус окружности r через пробел: ').split()
x, y, r = float(x), float(y), float(r)
mx.append(x), my.append(y), mr.append(r)
break
except:
print('Неверный ввод. Повторите еще раз!')
return mx, my, mr, n
#основная функция
def LAB7_VAR15(mx, my, mr, n, q):
try:
# проверка на соответствие данных
if len(mx) != n and len(my) != n and len(mr) != n:
return 'error'
colors = ['red', 'blue', 'yellow', 'green', 'purple', 'brown', 'pink', 'orange']
# задание параметров графика
ax = plt.gca()
ax.set_xlabel('Координата x')
ax.set_ylabel('Координата y')
plt.title('Окружности с разными радиусами и цветами')
#автоматическая генерация
if q == 'yes':
for i in range(random.randint(10, 20)):
circle = plt.Circle((random.randint(1, 50), random.randint(1, 50)), radius=random.randint(1, 5),
color=random.choice(colors), ec='black', fill=True,
alpha=0.5)
ax.add_patch(circle)
#ручная генерация
else:
for i in range(n):
circle = plt.Circle((mx[i], my[i]), radius=mr[i], color=random.choice(colors), ec='black', fill=True,
alpha=0.5)
ax.add_patch(circle)
plt.axis('scaled')
plt.show()
plt.cla()
return 'good'
except:
return 'error'
#TEST_LAB7_VAR15()
mx, my, mr, n = [], [], [], 0
q = ''
# запрос на автоматическую генерацию
while q != 'yes' and q != 'no':
q = input('(Для преподавателя) Выполнить автоматическую генерацию ? (yes/no): ')
if q == 'no':
mx, my, mr, n = filling()
LAB7_VAR15(mx, my, mr, n, q)
Описание тестового набора
Таблица 2 представляет собой описание всех тестовых случаев.
Таблица 2 - Описание тестового набора
Описание тестового случая |
Входные данные |
Ожидаемые результаты |
Результат теста |
Тест на неправильный ввод параметров окружностей |
mx = ['world', 2], my = [3, 4], mr = ['hello', 7], n = 2, q = 'no' |
'error' |
Пройден |
Тест на неправильный ввод количества окружностей |
mx = [1, 2], my = [3, 4], mr = [5, 7], n = 3, q = 'no' |
'error' |
Пройден |
Листинг тестовых сценариев:
#тестовая функция
def TEST_LAB7_VAR15():
if LAB7_VAR15(['world', 2], [3, 4], ['hello', 7], 2, 'no') == 'error':
print('Тест на неправильный ввод параметров окружностей пройден')
else:
print('Тест на неправильный ввод параметров окружностей не пройден')
if LAB7_VAR15([1, 2], [3, 4], [5, 7], 3, 'no') == 'error':
print('Тест на неправильный ввод количества окружнсотей пройден')
else:
print('Тест на неправильный ввод количества окружностей не пройден')
Результат работы тестов до написания основной программы представлен на рисунке 2. После написания работы программы на рисунке 3.
Рисунок 2 – Работа теста, до написания основного кода
Рисунок 3 – Работа теста, после написания основного кода
Пример работы программы, где пользователь вводит все данные правильно на рисунке 4.
Рисунок 4 – Пример работы с правильным вводом
На рисунке 5 представлены всевозможные ошибки пользователя. Наглядно показано, что программа заставляет пользователя вводить данные, подходящие под параметры задачи, подсказывает, как правильно ввести данные.
Рисунок 5 – Пример работы с неверными вводами
На рисунке 6 изображена автоматическая генерация окружностей на графике.
Рисунок 6 – Пример работы с автоматической генерацией
Выводы:
В процессе выполнения данной лабораторной работы были изучены и выполнены следующие этапы:
1) Постановка задачи. Разделил программы на чёткие этапы для более удобного просмотра кода и работы кода с помощью простых действий. Ввёл ограничения на ввод данных и рассчитал возможные завершения программы.
2) Математическая модель. Написал код с помощью математических действий, разделив задачу на простые математические действия в цикле.
3) Описание разработанной программы. По коду программы построил блочную модель программы. Выбрал наиболее подходящий способ написания кода с помощью массивов. Изучил библиотеки для построения графиков matplotlib и numpy.
Благодаря данной работе закрепил свои навыки программирования, построения алгоритма решения задачи, разбив ее на несколько этапов, укрепил навыки работы с условными конструкциями. Также закрепил применение метода Test-Driven-Development.