## Модуль 3

Добровольска Елизавета, А-02-23
Вариант 10

## Задание

Разработайте функцию по заданию и на ее основе создайте модуль. Создайте второй модуль, в котором должны быть инструкции для ввода/создания исходных данных 
для проверки работы функции, вызов функции и отображение полученных результатов.
Разработайте функцию с 5 аргументами, создающую отсчеты сигнала в виде последовательности импульсов с заданными параметрами: 
амплитуда, продолжительность импульса, период (импульс + пауза),  число отсчетов (аргументы функции). 
Сигнал должен быть записан в виде столбца в текстовый файл с заданным именем (5-й аргумент функции), а также возвращен в вызывающую программу в виде списка.

## Решение

Для создания бинарного файла был создан модуль TEST с таким кодом: 

```py
import random
import pickle

def create_binary_file(filename="input_data.bin", len1=40, len2=50, min_val=20, max_val=45):
    krt1 = tuple(random.randint(min_val, max_val) for _ in range(len1))
    krt2 = tuple(random.randint(min_val, max_val) for _ in range(len2))

    with open(filename, 'wb') as f: 
        pickle.dump(krt1, f) 
        pickle.dump(krt2, f) 
    print(f"Бинарный файл '{filename}' создан с двумя кортежами.")
    print(f"KRT1: {krt1[:5]}... (длина {len(krt1)})")
    print(f"KRT2: {krt2[:5]}... (длина {len(krt2)})")

if __name__ == "__main__":
    create_binary_file()
```

Далее приведен текст модуля 1:

```py
import math

def process_tuples(tuple1, tuple2):
    temp_list = []
    for item in tuple1:
        temp_list.append((item, 1))
    for item in tuple2:
        temp_list.append((item, 2))

    temp_list.sort(key=lambda x: x[0])

    sps1 = [item[0] for item in temp_list] 
    sps2 = [item[1] for item in temp_list] 

    return sps1, sps2

def calculate_stats(numeric_list):
    n = len(numeric_list)
    mean = sum(numeric_list) / n
  
    min_val = min(numeric_list)
    max_val = max(numeric_list)

   
    sorted_list = sorted(numeric_list)
    if n % 2 == 1:
        median = sorted_list[n // 2]
    else:
        median = (sorted_list[n // 2 - 1] + sorted_list[n // 2]) / 2
    if n <= 1: 
        std_dev = 0.0
    else:
        variance = sum((x - mean) ** 2 for x in numeric_list) / (n - 1)
        std_dev = math.sqrt(variance)

    return {
        "Среднее": mean,
        "Наименьшее": min_val,
        "Наибольшее": max_val,
        "Медиана": median,
        "Стандартное отклонение": std_dev
    }
```

Далее приведен текст модуля 2:

```py
import os
import pickle
from M1 import process_tuples, calculate_stats 

def process_data_and_save_results():
    filename = ""
   
    while not os.path.exists(filename):
        filename = input("Введите имя бинарного файла с данными (например, input_data.bin): ")
        if not os.path.exists(filename):
            print(f"Файл '{filename}' не найден. Попробуйте еще раз.")


    with open(filename, 'rb') as f: 
        krt1 = pickle.load(f) 
        krt2 = pickle.load(f) 
    print(f"\nДанные успешно считаны из файла '{filename}'.")
    print(f"KRT1 (первые 5 элементов): {krt1[:5]}")
    print(f"KRT2 (первые 5 элементов): {krt2[:5]}")

    sps1, sps2 = process_tuples(krt1, krt2)
    print("\n--- Результаты функции 1 ---")
    print(f"SPS1 (упорядоченный список элементов): {sps1[:10]}... (длина {len(sps1)})")
    print(f"SPS2 (список происхождения элементов): {sps2[:10]}... (длина {len(sps2)})")

   
    stats = calculate_stats(sps1)
    print("\n--- Результаты функции 2 (для SPS1) ---")
    for key, value in stats.items():
        print(f"{key}: {value:.2f}") 

    output_filename = "Res22.txt"
    with open(output_filename, 'w') as f:
        for val1, val2 in zip(sps1, sps2):
            f.write(f"{val1} {val2}\n")
    print(f"\nРезультаты функции 1 записаны в файл '{output_filename}'.")

    return sps1 
```

И текст основной прогрммы M0:

```py
import matplotlib.pyplot as plt
from M2 import process_data_and_save_results 

if __name__ == "__main__":
    print("--- Запуск главной программы M0 ---")

    
    sps1_for_plot = process_data_and_save_results()

   
    plt.figure(figsize=(10, 6)) 
    plt.plot(sps1_for_plot, marker='.', linestyle='-', color='skyblue', label='SPS1 Values')
    plt.title("График упорядоченного списка SPS1")
    plt.xlabel("Индекс отсчета")
    plt.ylabel("Значение элемента")
    plt.grid(True)
    plt.legend()
    plt.show() 

    print("\n Программа завершена")
```

Вывод программы: 

```py
================ RESTART: C:\Users\u522-16\Desktop\tema9\TEST.py ===============
Бинарный файл 'input_data.bin' создан с двумя кортежами.
KRT1: (33, 24, 43, 33, 42)... (длина 40)
KRT2: (34, 33, 32, 38, 27)... (длина 50)
>>> 
================= RESTART: C:\Users\u522-16\Desktop\tema9\M0.py ================
--- Запуск главной программы M0 ---
Введите имя бинарного файла с данными (например, input_data.bin): input_data.bin

Данные успешно считаны из файла 'input_data.bin'.
KRT1 (первые 5 элементов): (33, 24, 43, 33, 42)
KRT2 (первые 5 элементов): (34, 33, 32, 38, 27)

--- Результаты функции 1 ---
SPS1 (упорядоченный список элементов): [20, 20, 20, 20, 21, 22, 23, 23, 23, 24]... (длина 90)
SPS2 (список происхождения элементов): [1, 2, 2, 2, 2, 1, 1, 1, 2, 1]... (длина 90)

--- Результаты функции 2 (для SPS1) ---
Среднее: 33.02
Наименьшее: 20.00
Наибольшее: 45.00
Медиана: 33.00
Стандартное отклонение: 6.87

Результаты функции 1 записаны в файл 'Res22.txt'.
```

![](pic0.png)





