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

7.2 KiB

Индивидуальное контрольное задание по модулю 3

Капитонов Михаил, А-02-23

1) Создайте модуль М1, содержащий две функции:

  • функция 1: аргумент - список или кортеж SPS с элементами случайной выборки; функция должна создать новый список с рассчитанным по выборке вариационным рядом и рассчитать по нему еще один список со средним значением, медианой и оценкой стандартного отклонения; оба списка возвращаются в вызывающую программу;
  • функция 2: аргумент - список или кортеж SPS с элементами случайной выборки и целочисленный параметр NINT; функция должна рассчитать по выборке гистограмму с NINT интервалами разбиения диапазона изменения случайной величины; гистограмма должна быть представлена графически на экране, а также возвращена в виде списка в вызывающую программу.

2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:

  • запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторение запроса;
  • выборка вводится из файла и записывается в объект-список;
  • вызывается функция 1;
  • у пользователя запрашивается число NINT интервалов в гистограмме; при нарушении неравенств 1<NINT<12 запрос повторяется;
  • вызывается функция 2 с исходным списком и заданным числом интервалов;
  • запрашивается имя бинарного файла для сохранения результатов расчета;
  • списки с вариационным рядом, статистическими параметрами и гистограммой записываются в бинарный файл.

3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета (вариационный ряд, параметры, список с гистограммой) на экране.

4) Проверьте программу с 2 файлами с исходными данными. В одном - выборка из 20 элементами, подчиняющимися нормальному распределению с математическим ожиданием -23 и дисперсией 100. В другом - выборка с 50 целочисленными случайными элементами из диапазона значений от -10 до +30.

#Модуль М1
import matplotlib.pyplot as plt
import math
import statistics
def func1(sps):
    variation_series = sorted(list(sps))
    mean_val = statistics.mean(variation_series)
    median_val = statistics.median(variation_series)
    if len(variation_series) > 1:
        std_val = statistics.stdev(variation_series)
    else:
        std_val = 0
    params = [mean_val, median_val, std_val]
    return variation_series, params

def func2(sps, nint):
    data = list(sps)
    min_val = min(data)
    max_val = max(data)
    interval_width = (max_val - min_val) / nint
    bins = [min_val + i * interval_width for i in range(nint + 1)]
    hist = []
    bin_edges = []
    for i in range(nint):
        bin_start = bins[i]
        bin_end = bins[i + 1]
        if i == nint - 1:
            count = sum(1 for x in data if bin_start <= x <= bin_end)
        else:
            count = sum(1 for x in data if bin_start <= x < bin_end)
        hist.append(count)
        bin_edges.append((bin_start, bin_end))
    plt.figure(figsize=(10, 6))
    plt.hist(data, bins=nint, edgecolor='black', alpha=0.7)
    plt.title(f'Гистограмма выборки ({nint} интервалов)')
    plt.xlabel('Значения')
    plt.ylabel('Частота')
    plt.grid(True, alpha=0.3)
    plt.text(0.02, 0.98, f'Интервалов: {nint}', transform=plt.gca().transAxes,
             verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))   
    plt.show()
    histogram_result = [bin_edges, hist]
    return histogram_result

#Модуль М2
import os
import pickle
from M1 import func1, func2
def process_data():
    while True:
        filename = input("Введите имя файла с выборкой: ")
        if os.path.exists(filename):
            try:
                with open(filename, 'r') as file:
                    data_str = file.read()
                    data_list = []
                    for item in data_str.replace(',', ' ').split():
                        try:
                            data_list.append(float(item))
                if len(data_list) == 0:
                    print("Файл не содержит числовых данных. Попробуйте другой файл.")
                    continue
                break
        else:
            print()
    variation_series, params = func1(data_list)
    while True:
        try:
            nint_input = input("\nВведите число интервалов для гистограммы (1 < NINT < 12): ")
            nint = int(nint_input)
            if 1 < nint < 12:
                break
            else:
                print("Число интервалов должно быть больше 1 и меньше 12!")
    print("\nСтроится гистограмма...")
    histogram_result = func2(data_list, nint)
    while True:
        output_filename = input("\nВведите имя бинарного файла для сохранения результатов: ")
        if not output_filename:
            print("Имя файла не может быть пустым!")
            continue
        if not output_filename.endswith('.dat'):
            output_filename += '.dat'
        if os.path.exists(output_filename):
            overwrite = input(f"Файл '{output_filename}' уже существует. Перезаписать? (да/нет): ")
            if overwrite.lower() not in ['да', 'yes', 'y', 'д']:
                continue
        
        try:
            results = {
                'variation_series': variation_series,
                'statistical_params': params,
                'histogram': histogram_result,
                'original_data': data_list,
                'nint': nint
            }
            with open(output_filename, 'wb') as f:
                pickle.dump(results, f)
            break
    return variation_series, params, histogram_result, data_list, nint, filename