# Индивидуальное контрольное задание по теме 9 ## Задание: 1) Создайте модуль М1, содержащий две функции: - функция 1: аргументы - список или кортеж Х с элементами - отсчетами некоторого сигнала и числовой параметр Т; в функции создается новый список Х1 с элементами, значения которых определяются по значениям элементов из Х по правилу: X1[i]=T, если X[i]>T; X1[i]=-T, если X[i]<-T; в остальных случаях X1[i]=X[i]; - функция 2: аргумент - список или кортеж ХХ ; в функции должно подсчитываться число элементов, удовлетворяющих неравенству XX[i]>XX[i-1]. 2) Создайте еще один модуль М2, в котором должны выполняться операции: - запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса; - из файла считывается список Х; - запрашивается значение параметра Т с проверкой Т>0; - с помощью функции 1 производится преобразование сигнала с записью его в новый список; отображается результат; - с новому списку применяется функция 2 и отображается результат; - преобразованный сигнал записывается в бинарный файл Res55.bin. 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика исходный и преобразованный сигнал. 4) Для проверки программы создайте 2 текстовых файла: в первый запишите 40 отсчетов синусоидального сигнала с периодом 9 и амплитудой 3.5 ; во второй - случайный, нормально распределенный сигнал с математическим ожиданием, равным 5, и стандартным отклонением, равным 7. При запуске программы с первым файлом задайте Т=2.5, со вторым - Т=6. ## Решение: - M1: ``` >>>def function_1(X, T): X1 = [] for value in X: if value > T: X1.append(T) elif value < -T: X1.append(-T) else: X1.append(value) return X1 >>>def function_2(XX): count = 0 for i in range(1, len(XX)): if XX[i] > XX[i-1]: count += 1 return count ``` - M2: ``` >>>import M1 >>>def main(): print("=== Обработка сигнала ===") while True: filename = input("Введите имя файла: ") try: file = open(filename, 'r') file.close() break except: print(f"Файл '{filename}' не найден. Попробуйте еще.") print(f"Чтение файла {filename}...") X = [] file = open(filename, 'r') for line in file: try: X.append(float(line.strip())) except: pass # пропускаем строки, которые не содержат чисел file.close() print(f"Прочитано чисел: {len(X)}") print(f"Первые 3 числа: {X[:3]}") while True: try: T = float(input("Введите T (>0): ")) if T > 0: break else: print("T должен быть больше 0") except: print("Введите число") # Применяем функцию 1 X1 = M1.function_1(X, T) print(f"\nСигнал обработан с T={T}") print(f"Пример: X[0]={X[0]:.3f} -> X1[0]={X1[0]:.3f}") print(f" X[1]={X[1]:.3f} -> X1[1]={X1[1]:.3f}") # Применяем функцию 2 increases = M1.function_2(X1) print(f" Число элементов удовлетворяющих неравенству: {increases}") # Сохраняем в файл with open("Res55.bin", 'w') as f: for value in X1: f.write(f"{value}\n") print("Файл Res55.bin создан") return X, X1 ``` - M0(основной): ``` >>>import M2 >>>import matplotlib.pyplot as plt >>>def main(): original, processed = M2.main() # Строим графики plt.figure(figsize=(10, 6)) # График 1 plt.subplot(2, 1, 1) plt.plot(original, 'b-') plt.title("Исходный сигнал") plt.xlabel("Номер отсчета") plt.ylabel("Значение") plt.grid(True) # График 2 plt.subplot(2, 1, 2) plt.plot(processed, 'r-') plt.title("Обработанный сигнал") plt.xlabel("Номер отсчета") plt.ylabel("Значение") plt.grid(True) plt.tight_layout() plt.show() >>>if __name__ == "__main__": main() === Обработка сигнала === Введите имя файла: sine.txt Чтение файла sine.txt... Прочитано чисел: 40 Первые 3 числа: [0.0, 2.249756633902887, 3.446827135542728] Введите T (>0): 2.5 Сигнал обработан с T=2.5 Пример: X[0]=0.000 -> X1[0]=0.000 X[1]=2.250 -> X1[1]=2.250 Число элементов удовлетворяющих неравенству: 18 Файл Res55.bin создан === Обработка сигнала === Введите имя файла: normal.txt Чтение файла normal.txt... Прочитано чисел: 40 Первые 3 числа: [-12.419956992247982, 9.170966980707039, 1.5586943810492464] Введите T (>0): 6 Сигнал обработан с T=6.0 Пример: X[0]=-12.420 -> X1[0]=-6.000 X[1]=9.171 -> X1[1]=6.000 Число элементов удовлетворяющих неравенству: 16 Файл Res55.bin создан ``` - Программа для создания файлов и проверки: ``` >>>import math >>>import random # Синусоидальный сигнал (40 точек) >>>with open("sine.txt", "w") as f: for i in range(40): value = 3.5 * math.sin(2 * math.pi * i / 9) f.write(f"{value}\n") print("Файл sine.txt создан (синус)") # Нормальный сигнал (40 точек) >>>with open("normal.txt", "w") as f: for i in range(40): # Простой способ получить нормальное распределение r = sum(random.random() for _ in range(12)) - 6 value = 5 + 7 * r f.write(f"{value}\n") print("Файл normal.txt создан (нормальный)") >>>print(" sine.txt с T=2.5") >>>print(" normal.txt с T=6") >>>print("\nЗапуск: python M0.py") ``` - Для первого бинарного файла: 0.0 2.249756633902887 2.5 2.5 1.197070501639841 -1.1970705016398404 -2.5 -2.5 -2.2497566339028885 -8.572527594031472e-16 2.249756633902887 2.5 2.5 1.1970705016398404 -1.197070501639838 -2.5 -2.5 -2.2497566339028867 -1.7145055188062944e-15 2.2497566339028845 2.5 2.5 1.197070501639847 -1.1970705016398373 -2.5 -2.5 -2.249756633902887 -2.5717582782094417e-15 2.2497566339028836 2.5 2.5 1.197070501639842 -1.1970705016398364 -2.5 -2.5 -2.249756633902888 -3.429011037612589e-15 2.2497566339028827 2.5 2.5 - Для второго файла: -6.0 6.0 1.5586943810492464 2.4650468069822447 -1.3776515381877372 4.308588576336187 -2.477643780693926 3.1227006290467134 -6.0 1.4639685181290663 0.5887631397128779 2.047305681679859 6.0 6.0 5.523857430011989 -6.0 6.0 6.0 0.8873255790447026 6.0 4.186677532259668 6.0 3.9062331720166252 6.0 6.0 6.0 3.4689403335145297 6.0 6.0 6.0 4.336774118550339 3.9036252545111303 6.0 3.160901927152815 5.7645792486392 6.0 0.342439825635517 0.7388797780425458 -1.4449795545346191 -2.913183927457421 ![График](Figure_1_t.png) ![График](Figure_2_t.png)