# Общее контрольно задание по Теме 9 Соловьёва Екатерина, А-01-23 ## Задание: M3_19 1) Создайте модуль М1, содержащий 2 функции: - функция 1: аргумент - список или кортеж с отсчетами некоторого сигнала; функция должна определить и вернуть число элементов, значение которых превышает значение предыдущего элемента; - функция 2: аргумент - список или кортеж с последовательностью отсчетов сигнала; функция должна рассчитать список с накопленными суммами: первый элемент равен первому элементу исходной последовательности, второй - равен сумме двух первых элементов последовательности, третий - сумме первых трех элементов и т.д. 2) Создайте еще один модуль М2, в котором должны выполняться следующие операции: - запрашивается имя бинарного файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос; - выборка вводится из файла; - с помощью функции 1 производится определение числа элементов со значениями, превышающими значения их предшественников; - с помощью функции 2 рассчитывается список с кумулятивными суммами; - выборка отображается в виде графика. 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране. 4) Проведите расчеты при 2-х разных исходных файлах. ## Решение: M1.py ```py def count_increasing_elements(sequence): """ Функция 1: подсчитывает число элементов, значение которых превышает значение предыдущего элемента""" if len(sequence) <= 1: return 0 count = 0 for i in range(1, len(sequence)): if sequence[i] > sequence[i-1]: count += 1 return count def cumulative_sum(sequence): """Функция 2: рассчитывает список с накопленными суммами""" result = [] current_sum = 0 for value in sequence: current_sum += value result.append(current_sum) return result ``` M2.py ```py import os import struct import matplotlib.pyplot as plt from M1 import count_increasing_elements, cumulative_sum def read_binary_file(filename): """ Читает бинарный файл с числами с плавающей точкой """ data = [] try: with open(filename, 'rb') as f: while True: bytes_data = f.read(8) if not bytes_data: break value = struct.unpack('d', bytes_data)[0] data.append(value) except Exception as e: print(f"Ошибка при чтении файла: {e}") return data def display_plots(original_data, cumulative_data): """ Отображает графики исходных данных и кумулятивных сумм """ fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8)) # График исходного сигнала ax1.plot(original_data, 'b-', linewidth=1.5, label='Исходный сигнал') ax1.set_xlabel('Отсчеты') ax1.set_ylabel('Амплитуда') ax1.set_title('Исходный сигнал') ax1.grid(True, alpha=0.3) ax1.legend() # График кумулятивных сумм ax2.plot(cumulative_data, 'r-', linewidth=1.5, label='Накопленные суммы') ax2.set_xlabel('Отсчеты') ax2.set_ylabel('Сумма') ax2.set_title('Кумулятивные суммы сигнала') ax2.grid(True, alpha=0.3) ax2.legend() plt.tight_layout() plt.show() def process_signal_data(): """ Основная функция модуля M2 - выполняет все требуемые операции """ while True: filename = input("Введите имя бинарного файла с выборкой: ").strip() if os.path.exists(filename): print(f"Файл '{filename}' найден.") break else: print(f"Файл '{filename}' не существует. Пожалуйста, попробуйте еще раз.") print("Чтение данных из файла...") signal_data = read_binary_file(filename) if not signal_data: print("Файл пуст или содержит некорректные данные.") return None, None, None print(f"Прочитано {len(signal_data)} отсчетов сигнала.") increasing_count = count_increasing_elements(signal_data) print(f"Количество элементов, превышающих предыдущий: {increasing_count}") cumulative_sums = cumulative_sum(signal_data) print("Список с кумулятивными суммами рассчитан.") display_plots(signal_data, cumulative_sums) return signal_data, increasing_count, cumulative_sums if __name__ == "__main__": process_signal_data() ``` M0.py ```py from M2 import process_signal_data def main(): """ Главная функция программы """ print("=" * 60) print("ПРОГРАММА ОБРАБОТКИ СИГНАЛОВ") print("=" * 60) print("\n" + "=" * 60) print("РАСЧЕТ №1") print("=" * 60) data1, count1, sums1 = process_signal_data() if data1: print(f"\nРезультаты расчета №1:") print(f" • Общее количество отсчетов: {len(data1)}") print(f" • Элементов, превышающих предыдущий: {count1}") print(f" • Процент возрастающих элементов: {count1/len(data1)*100:.2f}%") print("\n" + "=" * 60) print("РАСЧЕТ №2") print("=" * 60) data2, count2, sums2 = process_signal_data() if data2: print(f"\nРезультаты расчета №2:") print(f" • Общее количество отсчетов: {len(data2)}") print(f" • Элементов, превышающих предыдущий: {count2}") print(f" • Процент возрастающих элементов: {count2/len(data2)*100:.2f}%") print("\n" + "=" * 60) print("ОБРАБОТКА ЗАВЕРШЕНА") print("=" * 60) if __name__ == "__main__": main() ```