# Тест по модулю 3, вариант 16 ## 1. Задание Создайте модуль М1, содержащий две функции: - функция 1: аргументы - имя бинарного файла, содержащего кортеж KRT с элементами-отсчетами некоторого сигнала и числовой параметр Т; в функции должны вводиться данные из файла, вычисляться и возвращаться список SPS, элементы которого определяются по правилу: SPS[0] равен среднему значению по кортежу, SPS[i]=(KRT[i]+SPS[i-1]*T)/(1+T) (для i от 1 до длины KRT); - функция 2: аргумент - список SPS1 с числовыми значениями; по нему рассчитывается и возвращается среднее значение приращений SPS[i]-SPS[i-1] для i от 1 до длины списка. ## Решение ```py import pickle def func1(filename, T): fp = open(filename, 'rb') KRT = pickle.load(fp) fp.close() SPS = [] SPS.append(sum(KRT) / len(KRT)) for i in range(1, len(KRT)): v = (KRT[i] + SPS[i-1] * T) / (1 + T) SPS.append(v) return SPS def func2(SPS1): prirash = [] for i in range(1, len(SPS1)): inc = SPS1[i] - SPS1[i-1] prirash.append(inc) if prirash: return sum(prirash) / len(prirash) else: return 0.0 ``` ## 2. Задание Создайте еще один модуль М2, в котором должны выполняться операции: - запрашивается и вводится имя бинарного файла с данными; проверяется наличие файла и при отсутствии - повторение запроса; - запрашивается значение параметра Т (проверить Т>0); - вызывается функция 1 и отображаются результаты ее работы; - применяется функция 2 со списком, полученным из функции 1, и отображается результат ее работы. ## Решение ```py import os import M1 def M2_main(): while True: fname = input("Введите имя файла: ") if not fname.endswith('.bin'): fname = fname + '.bin' if os.path.exists(fname): print("Файл найден") break else: print("Файл не найден, попробуйте еще раз") while True: try: T = float(input("Введите T (больше 0): ")) if T > 0: break else: print("T должен быть больше 0") except: print("Введите число") SPS = M1.func1(fname, T) print("\nРезультаты (первые 5 значений):") for i in range(min(5, len(SPS))): print(f"SPS[{i}] = {SPS[i]}") if len(SPS) > 5: print("...") print(f"SPS[{len(SPS)-1}] = {SPS[-1]}") sred = M1.func2(SPS) print(f"\nСреднее приращение: {sred}") return SPS ``` ## 3. Задание Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика полученный из функции 1 список, а также выводит этот список в бинарный файл с именем RES77.bin. ## Решение ```py import pickle import matplotlib.pyplot as plt import M2 def main(): print("Начало работы") SPS = M2.M2_main() if SPS: fp = open('RES77.bin', 'wb') pickle.dump(SPS, fp) fp.close() print("Сохранено в RES77.bin") plt.plot(SPS) plt.title("График SPS") plt.show() print("Конец работы") if __name__ == "__main__": main() ``` ## 4. Задание Подготовьте 2 файла с исходными данными: первый - со 40 значениями : 0,0,1,1,1,:, второй - с 40 отсчетами синусоидального сигнала с некоторым периодом и амплитудой. ## Решение ```py import pickle import math KRT1 = [] for i in range(40): if i % 5 == 0 or i % 5 == 1: KRT1.append(0) else: KRT1.append(1) KRT1 = tuple(KRT1) fp = open('data1.bin', 'wb') pickle.dump(KRT1, fp) fp.close() KRT2 = [] for i in range(40): x = 10 * math.sin(2 * math.pi * i / 8) + 5 KRT2.append(x) KRT2 = tuple(KRT2) fp = open('data2.bin', 'wb') pickle.dump(KRT2, fp) fp.close() ```