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

8.3 KiB

27

create_test_files.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

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

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

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

Пример запуска

Создан файл 'data1.bin' (15 элементов)
Создан файл 'data2.bin' (20 элементов)

Тестовые файлы готовы!
ГЛАВНАЯ ПРОГРАММА 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

РАСЧЕТ 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