# 27 ## create_test_files.py ```py import struct import random def create_test_files(): """Создание тестовых бинарных файлов для задания M3_27""" # Файл 1: 15 элементов data1 = [random.uniform(10, 50) for _ in range(15)] with open('data1.bin', 'wb') as f: for value in data1: f.write(struct.pack('f', value)) print("Создан файл 'data1.bin' (15 элементов)") # Файл 2: 20 элементов data2 = [random.uniform(-5, 5) for _ in range(20)] with open('data2.bin', 'wb') as f: for value in data2: f.write(struct.pack('f', value)) print("Создан файл 'data2.bin' (20 элементов)") print("\nТестовые файлы готовы!") if __name__ == "__main__": create_test_files() ``` ## M0.py ```py import M2 def main(): print("ГЛАВНАЯ ПРОГРАММА M3_27") print("Проведем расчеты для 2-х разных исходных файлов") print("\n") print("РАСЧЕТ 1:") M2.main() print("\n") print("РАСЧЕТ 2:") M2.main() print("\n") print("Все расчеты завершены!") if __name__ == "__main__": main() ``` ## M1.py ```py def find_min_max_indices(data): """ Функция 1: Нахождение номеров элементов с наименьшим и наибольшим значениями Аргумент: список или кортеж с выборкой Возвращает: кортеж (индекс_мин, индекс_макс) """ if not data: return -1, -1 min_index = data.index(min(data)) max_index = data.index(max(data)) return min_index, max_index def calculate_group_averages(data, N): """ Функция 2: Разделение выборки на группы и расчет средних значений Аргументы: - data: список или кортеж с выборкой - N: целочисленный параметр - размер группы Возвращает: список средних значений по группам """ if not data or N <= 0: return [] group_averages = [] for i in range(0, len(data), N): group = data[i:i + N] group_avg = sum(group) / len(group) group_averages.append(group_avg) return group_averages ``` ## M2.py ```py import os import struct import matplotlib.pyplot as plt def read_binary_file(filename): """Чтение данных из бинарного файла""" data = [] try: with open(filename, 'rb') as f: while True: bytes_data = f.read(4) if not bytes_data: break value = struct.unpack('f', bytes_data)[0] data.append(value) return data except FileNotFoundError: return None def main(): # Запрос имени файла с проверкой наличия while True: filename = input("Введите имя бинарного файла с выборкой: ") if os.path.exists(filename): break print(f"Файл '{filename}' не найден. Попробуйте еще раз.") # Чтение выборки из файла data = read_binary_file(filename) if data is None: print("Ошибка чтения файла") return print(f"Выборка считана из файла '{filename}'") print(f"Число элементов: {len(data)}") # Импорт функций из M1 from M1 import find_min_max_indices, calculate_group_averages # Использование функции 1: нахождение номеров min и max min_index, max_index = find_min_max_indices(data) print(f"Номер элемента с наименьшим значением: {min_index}") print(f"Номер элемента с наибольшим значением: {max_index}") print(f"Наименьшее значение: {data[min_index]:.3f}") print(f"Наибольшее значение: {data[max_index]:.3f}") # Запрос числа N для формирования групп while True: try: N = int(input(f"Введите число элементов N для формирования групп (1-{len(data)}): ")) if 1 <= N <= len(data): break else: print(f"Введите число от 1 до {len(data)}") except ValueError: print("Введите целое число") # Использование функции 2: расчет средних по группам group_averages = calculate_group_averages(data, N) print(f"\nРазделение на {len(group_averages)} групп:") for i, avg in enumerate(group_averages): start_idx = i * N end_idx = min((i + 1) * N - 1, len(data) - 1) print(f"Группа {i+1} (элементы {start_idx}-{end_idx}): среднее = {avg:.3f}") # ПОСТРОЕНИЕ ГРАФИКА СОГЛАСНО ЗАДАНИЮ plt.figure(figsize=(12, 6)) # Отображение исходной выборки (основное требование задания) plt.plot(range(len(data)), data, 'bo-', linewidth=2, markersize=6, label='Исходная выборка') # Дополнительно выделяем min и max (не требуется заданием, но полезно) plt.plot(min_index, data[min_index], 'ro', markersize=10, label=f'Минимум (индекс {min_index})') plt.plot(max_index, data[max_index], 'go', markersize=10, label=f'Максимум (индекс {max_index})') plt.title(f'Исходная выборка из файла: {filename}') plt.xlabel('Индекс элемента') plt.ylabel('Значение') plt.legend() plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() if __name__ == "__main__": main() ``` ## Пример запуска ```py Создан файл 'data1.bin' (15 элементов) Создан файл 'data2.bin' (20 элементов) Тестовые файлы готовы! ``` ```py ГЛАВНАЯ ПРОГРАММА M3_27 Проведем расчеты для 2-х разных исходных файлов РАСЧЕТ 1: Введите имя бинарного файла с выборкой: data1.bin Выборка считана из файла 'data1.bin' Число элементов: 15 Номер элемента с наименьшим значением: 9 Номер элемента с наибольшим значением: 10 Наименьшее значение: 10.079 Наибольшее значение: 48.704 Введите число элементов N для формирования групп (1-15): 3 Разделение на 5 групп: Группа 1 (элементы 0-2): среднее = 18.515 Группа 2 (элементы 3-5): среднее = 33.627 Группа 3 (элементы 6-8): среднее = 36.964 Группа 4 (элементы 9-11): среднее = 29.794 Группа 5 (элементы 12-14): среднее = 29.427 ``` ![alt text]({02373A72-7282-4831-A19F-62F0491DA505}.png) ```py РАСЧЕТ 2: Введите имя бинарного файла с выборкой: data2.bin Выборка считана из файла 'data2.bin' Число элементов: 20 Номер элемента с наименьшим значением: 13 Номер элемента с наибольшим значением: 16 Наименьшее значение: -3.310 Наибольшее значение: 4.489 Введите число элементов N для формирования групп (1-20): 5 Разделение на 4 групп: Группа 1 (элементы 0-4): среднее = 0.637 Группа 2 (элементы 5-9): среднее = 0.159 Группа 3 (элементы 10-14): среднее = -0.665 Группа 4 (элементы 15-19): среднее = 0.210 Все расчеты завершены! ``` ![alt text]({60C48610-2CF2-4BF5-86A4-A530659AEC4D}.png)