Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

86 строки
3.7 KiB
Python

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