Files
python-labs/TEMA9/test.md

7.1 KiB

Общее контрольно задание по Теме 9

Соловьёва Екатерина, А-01-23

Задание:

  1. Создайте модуль М1, содержащий 2 функции:
  • функция 1: аргумент - список или кортеж с отсчетами некоторого сигнала; функция должна определить и вернуть число элементов, значение которых превышает значение предыдущего элемента;

  • функция 2: аргумент - список или кортеж с последовательностью отсчетов сигнала; функция должна рассчитать список с накопленными суммами: первый элемент равен первому элементу исходной последовательности, второй - равен сумме двух первых элементов последовательности, третий - сумме первых трех элементов и т.д.

  1. Создайте еще один модуль М2, в котором должны выполняться следующие операции:
  • запрашивается имя бинарного файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос;

  • выборка вводится из файла;

  • с помощью функции 1 производится определение числа элементов со значениями, превышающими значения их предшественников;

  • с помощью функции 2 рассчитывается список с кумулятивными суммами;

  • выборка отображается в виде графика.

  1. Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.

  2. Проведите расчеты при 2-х разных исходных файлах.

Решение:

M1.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

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

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