diff --git a/TEMA9/Mod0.py b/TEMA9/Mod0.py new file mode 100644 index 0000000..3d6f8fb --- /dev/null +++ b/TEMA9/Mod0.py @@ -0,0 +1,11 @@ +# Модуль 0 +import Mod2 +import matplotlib.pyplot as plt + +sps1, sps2 = Mod2.read_file() +plt.plot(sps1) +plt.title('График sps1') +plt.grid(True) +plt.show() + + diff --git a/TEMA9/Mod1.py b/TEMA9/Mod1.py new file mode 100644 index 0000000..5c9a574 --- /dev/null +++ b/TEMA9/Mod1.py @@ -0,0 +1,38 @@ +# Модуль 1 +import math + +def func1(t1, t2): + """Объединяет два кортежа и сортирует""" + sps1 = [] + sps2 = [] + for x in t1: + sps1.append(x) + sps2.append(1) + for x in t2: + sps1.append(x) + sps2.append(2) + spis3 = list(zip(sps1, sps2)) + spis3.sort(key=lambda x: x[0]) + sps1_sorted = [x[0] for x in spis3] + sps2_sorted = [x[1] for x in spis3] + return sps1_sorted, sps2_sorted + +def func2(spis): + """Вычисляет статистики списка""" + sred = sum(spis) / len(spis) + mini = min(spis) + maxi = max(spis) + spis_sorted = sorted(spis) + n = len(spis_sorted) + if n % 2 == 1: + med = spis_sorted[n // 2] + else: + med = (spis_sorted[n // 2 - 1] + spis_sorted[n // 2]) / 2 + + if len(spis) > 1: + kv_sum = sum((x - sred) ** 2 for x in spis) + std = math.sqrt(kv_sum / (len(spis) - 1)) + else: + std = 0 + + return sred, mini, maxi, med, std diff --git a/TEMA9/Mod2.py b/TEMA9/Mod2.py new file mode 100644 index 0000000..8de3b8e --- /dev/null +++ b/TEMA9/Mod2.py @@ -0,0 +1,31 @@ +# Модуль 2 +import pickle +import os +import Mod1 + +def read_file(): + while True: + file_name = input("Введите имя файла: ") + if os.path.exists(file_name): + break + print("Файл не найден! Попробуйте снова.") + with open(file_name, 'rb') as f: + KRT1, KRT2 = pickle.load(f) + sps1, sps2 = Mod1.func1(KRT1, KRT2) + print("SPS1:", sps1) + print("SPS2:", sps2) + sred, mini, maxi, med, std = Mod1.func2(sps1) + print('Статистики SPS1:') + print("Среднее:" ,sred) + print("Минимум:", mini) + print("Максимум:", maxi) + print("Медиана:", med) + print("Ст.отклонение:", std) + with open('Res22.txt', 'w') as f: + f.write("sps1 sps2\n") + for i in range(len(sps1)): + f.write(str(sps1[i])) + f.write(' ') + f.write(str(sps2[i])) + f.write('\n') + return sps1, sps2 diff --git a/TEMA9/Res22.txt b/TEMA9/Res22.txt new file mode 100644 index 0000000..f98bc7a --- /dev/null +++ b/TEMA9/Res22.txt @@ -0,0 +1,81 @@ +sps1 sps2 +20 1 +20 2 +21 1 +21 1 +21 2 +21 2 +25 1 +25 1 +25 1 +25 1 +25 1 +25 2 +25 2 +25 2 +25 2 +25 2 +26 1 +26 1 +26 2 +26 2 +29 1 +29 2 +30 1 +30 1 +30 2 +30 2 +31 1 +31 1 +31 1 +31 1 +31 1 +31 2 +31 2 +31 2 +31 2 +31 2 +32 1 +32 1 +32 2 +32 2 +34 1 +34 1 +34 1 +34 1 +34 2 +34 2 +34 2 +34 2 +36 1 +36 2 +37 1 +37 2 +38 1 +38 1 +38 1 +38 1 +38 2 +38 2 +38 2 +38 2 +39 1 +39 2 +40 1 +40 2 +42 1 +42 1 +42 2 +42 2 +43 1 +43 1 +43 2 +43 2 +44 1 +44 1 +44 2 +44 2 +45 1 +45 1 +45 2 +45 2 diff --git a/TEMA9/Ris2.png b/TEMA9/Ris2.png new file mode 100644 index 0000000..deca07b Binary files /dev/null and b/TEMA9/Ris2.png differ diff --git a/TEMA9/input.bin b/TEMA9/input.bin new file mode 100644 index 0000000..7750dcb Binary files /dev/null and b/TEMA9/input.bin differ diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..8e2c48f --- /dev/null +++ b/TEMA9/test.md @@ -0,0 +1,129 @@ +# Тест по Модулю 3 +Таболин Иван, А-01-23 +Вариант 10 +## Задание +1) Создайте модуль М1, содержащий две функции: + - функция 1: аргументы - два кортежа с целочисленными элементами, не обязательно одинаковой длины; в функции должен быть составлены два списка: SPS1 с элементами из двух входных кортежей, причем элементы SPS1 должны быть упорядочены по возрастанию величины, а также список SPS2 с элементами, равными 1 или 2, причем значение 1 берется в том случае, если соответствующий элемент в SPS1 взят из первого кортежа, а значение 2 - если из второго; + - функция 2: аргумент - числовой список; по этому списку в функции должны быть вычислены среднее, наименьшее и наибольшее значения, медиана и оценка стандартного отклонения, +2) Создайте еще один модуль М2, в котором должны выполняться операции: + - запрашивается и вводится имя бинарного файла с данными; проверяется наличие файла и при отсутствии - повторение запроса; + - из указанного файла считываются два кортежа: KRT1 и KRT2. + - применяется функция 1 к этим двум кортежам и отображаются полученные списки; + - применяется функция 2 к списку SPS1 и отображаются результаты расчета; + - в текстовый файл с именем Res22.txt записываются результаты расчета по функции 1 так, чтобы в каждой строке был один элемент из SPS1 и один элемент из SPS2, разделенные пробелом. +3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика полученный из функции 1 список SPS1. +4) Подготовьте бинарный файл с двумя кортежами, содержащими, соответственно, 40 и 50 случайных целочисленных элементов из диапазона значений от 20 до 45. Проверьте работу программы с этими данными. +## Решение +Модуль 1 +```py +# Модуль 1 +import math + +def func1(t1, t2): + """Объединяет два кортежа и сортирует""" + sps1 = [] + sps2 = [] + for x in t1: + sps1.append(x) + sps2.append(1) + for x in t2: + sps1.append(x) + sps2.append(2) + spis3 = list(zip(sps1, sps2)) + spis3.sort(key=lambda x: x[0]) + sps1_sorted = [x[0] for x in spis3] + sps2_sorted = [x[1] for x in spis3] + return sps1_sorted, sps2_sorted + +def func2(spis): + """Вычисляет статистики списка""" + sred = sum(spis) / len(spis) + mini = min(spis) + maxi = max(spis) + spis_sorted = sorted(spis) + n = len(spis_sorted) + if n % 2 == 1: + med = spis_sorted[n // 2] + else: + med = (spis_sorted[n // 2 - 1] + spis_sorted[n // 2]) / 2 + + if len(spis) > 1: + kv_sum = sum((x - sred) ** 2 for x in spis) + std = math.sqrt(kv_sum / (len(spis) - 1)) + else: + std = 0 + + return sred, mini, maxi, med, std +``` +Модуль 2 +```py +# Модуль 2 +import pickle +import os +import Mod1 + +def read_file(): + while True: + file_name = input("Введите имя файла: ") + if os.path.exists(file_name): + break + print("Файл не найден! Попробуйте снова.") + with open(file_name, 'rb') as f: + KRT1, KRT2 = pickle.load(f) + sps1, sps2 = Mod1.func1(KRT1, KRT2) + print("SPS1:", sps1) + print("SPS2:", sps2) + sred, mini, maxi, med, std = Mod1.func2(sps1) + print('Статистики SPS1:') + print("Среднее:" ,sred) + print("Минимум:", mini) + print("Максимум:", maxi) + print("Медиана:", med) + print("Ст.отклонение:", std) + with open('Res22.txt', 'w') as f: + f.write("sps1 sps2\n") + for i in range(len(sps1)): + f.write(str(sps1[i])) + f.write(' ') + f.write(str(sps2[i])) + f.write('\n') + return sps1, sps2 +``` +Модуль 0 +```py +# Модуль 0 +import Mod2 +import matplotlib.pyplot as plt + +sps1, sps2 = Mod2.read_file() +plt.plot(sps1) +plt.title('График sps1') +plt.grid(True) +plt.show() +``` +Генерация входных данных +```py +import pickle +import random as rn +krt1=tuple(rn.randint(20,45) for _ in range(40)) +krt2=tuple(rn.randint(20,45) for _ in range(50)) +file=open('input.bin','wb') +pickle.dump((krt1,krt1),file) +file.close() +``` +Выполнение +```py +import Mod0 +Введите имя файла: input.txt +Файл не найден! Попробуйте снова. +Введите имя файла: input.bin +SPS1: [20, 20, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 36, 36, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45] +SPS2: [1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2] +Статистики SPS1: +Среднее: 33.375 +Минимум: 20 +Максимум: 45 +Медиана: 33.0 +Ст.отклонение: 7.171277096157519 +``` +![График sps1](Ris2.png)