
4сем / tp_lab4_Zhovtyak
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., канд. техн. наук |
|
|
|
А. В. Аграновский |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №4 |
СМЕШАННЫЕ АЛГОРИТМЫ |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4016 |
|
|
|
Жовтяк М.О. |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Вариант 15 (5 задание)
Постановка задачи
Даны две последовательности по N целых чисел в каждой.
Конечная цель программы – найти наименьшее среди тех чисел первой последовательности, которые не входят во вторую последовательность. При этом считается, что хотя бы одно такое число есть.
Входные данные представлены в виде целого числа N, которое является количеством элементов в каждой последовательности, а также два списка с разным наполнением.
Дополнительные требования к программе не были выявлены.
Математическая модель
Задание не требует математических формул. Для решения задачи достаточно использовать лишь циклы, где список итерируется по заданному условию. Количество элементов в списке должно быть хотя бы равно 2 или больше.
Описание разработанной программы
Первым делом, программа с помощью функций filling_n и filling_l принимает входные данные для работы. Основная часть программы оформлена в отдельной функции LAB4_VAR15. Согласно заданию, нужно найти минимальное число из тех чисел первого списка, которые не входят в число второго списка. Для этого каждый элемент первого списка будет проверяться на то, есть ли он во втором списке. Если такого нет, то он будет добавляться в отдельно созданный список. После этого в этом третьем списке будет находиться минимальный элемент. Этот минимальный элемент является выходной информацией.
Таблица 1 демонстрирует список используемых переменных.
Таблица 1 - Описание переменных
Имя переменной |
Тип переменной |
Назначение переменной |
n |
int |
Количество элементов в списке |
L1 |
List |
Первая последовательность чисел |
L2 |
List |
Вторая последовательность чисел |
num |
Int |
Промежуточная переменная для записи n |
a |
Int |
Промежуточная переменная для записи элементов последовательностей |
spisok |
List |
Последовательность, хранящая элементы первой последовательности, которые не входят во вторую |
k |
Int |
Количество элементов последовательности, исполняемое в основной функции |
Описание алгоритма работы программы представлено в виде блок схемы на рисунке 1.
Рисунок 1 – Блок-схема алгоритма
Вычислительная сложность реализованного алгоритма в нотации O() является константной (O(n)).
Код программы:
# filling of sequence
def filling_l(l):
for i in range(n):
while True:
try:
a = int(input("Enter the integer for sequence: "))
except:
print("Error. You must enter the integer.")
continue
l.append(a)
break
# setting the number of elements in sequence
def filling_n():
while True:
try:
num = int(input("Enter the n integer: "))
except:
print("Error. You must enter the integer")
continue
return num
#main function
def LAB4_VAR15(list1, list2, k):
spisok =[]
try:
for i in range(k):
if list1 [i] not in list2:
spisok.append(list1[i])
spisok.sort()
print(spisok[0])
return spisok[0]
except:
return "error"
#TEST_LAB4_VAR15()
n = 1
l1 = []
l2 = []
n = filling_n()
while n < 2:
print('n must be 2 or higher')
n = filling_n()
print('Working with first sequence.')
filling_l(l1)
print('Working with second sequence.')
filling_l(l2)
LAB4_VAR15(l1, l2, n)
Описание тестового набора
Таблица 2 представляет собой описание всех тестовых случаев. Входные данные представляют собой такой набор: первый список – первая последовательность чисел, второй список – вторая последовательность чисел, третья переменная – число n (количество элементов списков).
Таблица 2 - Описание тестового набора
Описание тестового случая |
Входные данные |
Ожидаемые результаты |
Результат теста |
Положительные целые числа |
[1, 2, 3], [1, 5, 4], 3 |
2 |
"Positive integer test passed" |
Отрицательные целые числа |
[-1, -2, -3], [-1, -5, -4], 3 |
-3 |
"Negative integer test passed" |
Количество элементов меньше 2 |
[1, 2, 3], [1, 5, 4], 0 |
“error” |
"n >= 2 test passed" |
Один элемент – строчное выражение |
[1, "hello", 3], [1, "world", 4], 0 |
“error” |
"String-element test passed" |
Листинг тестовых сценариев:
# test function
def TEST_LAB4_VAR15():
if LAB4_VAR15([1, 2, 3], [1, 5, 4], 3) == 2:
print("Positive integer test passed")
else:
print("Positive integer test not passed")
if LAB4_VAR15([-1, -2, -3], [-1, -5, -4], 3) == -3:
print("Negative integer test passed")
else:
print("Negative integer test not passed")
if LAB4_VAR15([1, 2, 3], [1, 5, 4], 0) == "error":
print("n >= 2 test passed")
else:
print("n >= 2 test not passed")
if LAB4_VAR15([1, "hello", 3], [1, "world", 4], 0) == "error":
print("String-element test passed")
else:
print("String-element test not passed")
Результат работы тестов до написания основной программы представлен на рисунке 2. После написания работы программы на рисунке 3.
Рисунок 2 – Работа теста, до написания основного кода
Рисунок 3 – Работа теста, после написания основного кода
Пример работы программы, где пользователь вводит все данные правильно на рисунке 4.
Рисунок 4 – Пример работы с правильным вводом
На рисунке 5 представлены всевозможные ошибки пользователя: где он вводит n меньше 2 и иное от int значение, где он вводит в список в качестве элемента строковое и дробное значения. Наглядно показано, что программа заставляет пользователя вводить данные, подходящие под параметры задачи, указывает, как правильно ввести данные.
Рисунок 5 – Пример работы с неверными вводами
Выводы:
В процессе выполнения данной лабораторной работы были изучены и выполнены следующие этапы:
1) Постановка задачи. Разделил программы на чёткие этапы для более удобного просмотра кода и работы кода с помощью простых действий. Ввёл ограничения на ввод данных и рассчитал возможные завершения программы.
2) Математическая модель. Написал код с помощью математических действий, разделив задачу на простые математические действия в цикле.
3) Описание разработанной программы. По коду программы построил блочную модель программы. Выбрал наиболее подходящий способ написания кода с помощью циклов.
Благодаря данной работе закрепил свои навыки программирования, построения алгоритма решения задачи, разбив ее на несколько этапов, укрепил навыки работы с условными конструкциями. Также закрепил применение метода Test-Driven-Development.