 
        
        4сем / tp_lab5_Zhovtyak
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
| доц., канд. техн. наук | 
 | 
 | 
 | А. В. Аграновский | 
| должность, уч. степень, звание | 
 | подпись, дата | 
 | инициалы, фамилия | 
| ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №5 | 
| СМЕШАННЫЕ АЛГОРИТМЫ 2 | 
| по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ | 
| 
 | 
РАБОТУ ВЫПОЛНИЛ
| СТУДЕНТ ГР. № | 4016 | 
 | 
 | 
 | Жовтяк М.О. | 
| 
 | 
 | 
 | подпись, дата | 
 | инициалы, фамилия | 
Санкт-Петербург 2022
Вариант 15 (15 задание)
Постановка задачи
Дана функция:
F(x)
= 
 *
* 
 ,
где
,
где  
 и x
= 0.1, 0.2…0.9.
и x
= 0.1, 0.2…0.9.
Конечная цель программы – вычислить значение данной функции.
Входные данные: дробное число x, которое находится в пределах от 0.1 до 0.9 с шагом 0.1; и целое число K.
Выходные данные: вычисленное значение функции, выраженное в плавающем числе.
Дополнительные требования к программе не были выявлены.
Математическая модель
Дробное число x находится в пределах от 0.1 до 0.9 с шагом 0.1 согласно заданию.
Целое число K является целым числом и больше либо равно 1, так как является верхней границей суммирования в функции.
В функции присутствуют синусы и косинусы, поэтому в программы импортируются соответственные функции из библиотеки math. Также функция содержит последовательную сумму, поэтому в программе будет применен цикл for.
Описание разработанной программы
Первым делом, программа с помощью функций input_K и input_x принимает входные данные для работы. Эти значения проверяются на соответствие заданным условиям, описанным в математической модели. Основная часть программы оформлена в отдельной функции LAB5_VAR15. Согласно заданию, необходимо вычислить значение функции. Вычисление функции разделено на две логические части: сначала вычисляется дробь, в которой присутствуют синусы и косинусы; потом вычисляется последовательная сумма, оформленная в виде цикла согласно заданию. Эти две части умножаются и результат, округленный до двух знаков после запятой (для простоты чтения и сравнения в тесте), выводится в качестве выходного значения.
Таблица 1 демонстрирует список используемых переменных.
Таблица 1 - Описание переменных
| Имя переменной | Тип переменной | Назначение переменной | 
| K | int | Параметр заданной функции | 
| x | float | Параметр заданной функции | 
| num | int(1) и float(2) | Промежуточная переменная для записи K (1) и x (2) | 
| f | float | Вычисление дробной части функции | 
| s | float | Вычисление части функции с последовательной суммой | 
| a | float | Один из параметров последовательной суммы | 
| r | float | Переменная, хранящая итоговый результат | 
Описание алгоритма работы программы представлено в виде блок схемы на рисунке 1.
 
Рисунок 1 – Блок-схема алгоритма
Вычислительная сложность реализованного алгоритма в нотации O() является линейной (O(n)).
Код программы:
from math import sin, cos
# задача K
def input_K():
while True:
try:
num = int(input("Введите K: "))
except:
print("Ошибка. K - целое число")
continue
return num
# задача x
def input_x():
while True:
try:
num = float(input("Введите x: "))
except:
print("Ошибка. x - число")
continue
return num
#основная функция
def LAB5_VAR15(x, K):
# проверка входимых значений
try:
if K < 1 and not K.isdigit():
return "error"
if x == 0.1 or x == 0.2 or x == 0.3 or x == 0.4 or x == 0.5 or x == 0.6 or x == 0.7 or x == 0.8 or x == 0.9:
pass
else:
return "error"
except:
return "error"
try:
# вычисление дроби
f = (sin(x)+2)/(3+cos(x))
# вычисление последовательной суммы
s = 0
for i in range(K+1):
if x <= 0.5:
a = 2 * i
else:
a = i / 2
s += a * (x**i)
return round(f*s, 2)
except:
return "error"
#TEST_LAB5_VAR15()
x = input_x()
while x != 0.1 and x != 0.2 and x != 0.3 and x != 0.4 and x != 0.5 and x != 0.6 and x != 0.7 and x != 0.8 and x != 0.9:
print('Ошибка. x принадлежит от 0.1 до 0.9 с шагом 0.1')
x = input_x()
K = input_K()
if K < 1:
print('Ошибка. K >= 1')
K = input_K()
r = LAB5_VAR15(x, K)
print(r)
Описание тестового набора
Таблица 2 представляет собой описание всех тестовых случаев. Входные данные представляют собой такой набор: первый список – первая последовательность чисел, второй список – вторая последовательность чисел, третья переменная – число n (количество элементов списков).
Таблица 2 - Описание тестового набора
| Описание тестового случая | Входные данные | Ожидаемые результаты | Результат теста | 
| Правильное вычисление и ввод данных | x=0.1, K=2 | 0.13 | "Тест 1 пройден" | 
| Неправильный ввод x | x=2, K=2 | ‘error | "Тест 2 пройден" | 
| Неправильный ввод K | x=0.1, K=-1 | ‘error’ | "Тест 3 пройден" | 
| Входные данные – строковые значения | x=’hello’, K=’world’ | ‘error’ | "Тест 4 пройден" | 
| Правильное вычисление и ввод данных (вторая проверка) | x=0.5, K=5 | 2.28 | "Тест 5 пройден" | 
Листинг тестовых сценариев:
# тестовая функция
def TEST_LAB5_VAR15():
if LAB5_VAR15(0.1, 2) == 0.13:
print("Тест 1 пройден")
else:
print("Тест 1 не пройден")
if LAB5_VAR15(2, 2) == 'error':
print("Тест 2 пройден")
else:
print("Тест 2 не пройден")
if LAB5_VAR15(0.1, -1) == 'error':
print("Тест 3 пройден")
else:
print("Тест 3 не пройден")
if LAB5_VAR15('hello', 'world') == 'error':
print("Тест 4 пройден")
else:
print("Тест 4 не пройден")
if LAB5_VAR15(0.5, 5) == 2.28:
print("Тест 5 пройден")
else:
print("Тест 5 не пройден")
Результат работы тестов до написания основной программы представлен на рисунке 2. После написания работы программы на рисунке 3.
 
Рисунок 2 – Работа теста, до написания основного кода
 
Рисунок 3 – Работа теста, после написания основного кода
Пример работы программы, где пользователь вводит все данные правильно на рисунке 4.
 
Рисунок 4 – Пример работы с правильным вводом
На рисунке 5 представлены всевозможные ошибки пользователя: где он вводит x не в заданном диапазоне и иное от float значение, где он вводит в K не целое число и целое число меньше 1. Наглядно показано, что программа заставляет пользователя вводить данные, подходящие под параметры задачи, указывает, как правильно ввести данные.
 
Рисунок 5 – Пример работы с неверными вводами
Выводы:
В процессе выполнения данной лабораторной работы были изучены и выполнены следующие этапы:
1) Постановка задачи. Разделил программы на чёткие этапы для более удобного просмотра кода и работы кода с помощью простых действий. Ввёл ограничения на ввод данных и рассчитал возможные завершения программы.
2) Математическая модель. Написал код с помощью математических действий, разделив задачу на простые математические действия в цикле.
3) Описание разработанной программы. По коду программы построил блочную модель программы. Выбрал наиболее подходящий способ написания кода с помощью циклов.
Благодаря данной работе закрепил свои навыки программирования, построения алгоритма решения задачи, разбив ее на несколько этапов, укрепил навыки работы с условными конструкциями. Также закрепил применение метода Test-Driven-Development.
