Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

6.2 KiB

Тест по Модулю 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

# Модуль 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

# Модуль 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

# Модуль 0
import Mod2
import matplotlib.pyplot as plt

sps1, sps2 = Mod2.read_file()
plt.plot(sps1)
plt.title('График sps1')
plt.grid(True)
plt.show()

Генерация входных данных

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()

Выполнение

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