форкнуто от main/python-labs
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
86 строки
3.7 KiB
Python
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() |