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