# Индивидуальное контрольное задание по теме 9 Бушманов А.С. А-01-23 ## Задание: Вариант 14 M3_14 ### Создайте модуль М1, содержащий две функции: функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке списка с наименьшим и наибольшим значениями, размахом (разность наибольшего и наименьшего значений), оценкой стандартного отклонения и отношением размаха к стандартному отклонению; функция 2: аргументы - список или кортеж с выборкой и целочисленный параметр m; функция должна обратиться к функции 1 и затем определить границы m непересекающихся интервалов в диапазоне величины между наибольшим и наименьшим значениями по выборке, содержащих примерно одинаковое число элементов выборки; функция должна вернуть 2 списка: со значениями границ интервалов и с числами элементов в интервалах. ### Создайте еще один модуль М2, в котором должны выполняться следующие операции: запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос; выборка вводится из файла и записывается в список (в строках файла может быть разное число значений, разделенных пробелами); запрашиваются у пользователя число интервалов разбиения; с помощью функций 1 и 2 производится определение границ интервалов и чисел элементов в них. отображается столбиковая диаграмма с интервалами и числами элементов выборки в них. ### Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране. ### Проведите расчеты при 2-х разных файлах с выборками ## Решение: #### Модуль 1: M1 ```python import math def stats(sample): x = list(sample) n = len(x) mn = min(x) mx = max(x) razmah = mx - mn mean = sum(x) / n if n > 1: s = math.sqrt(sum((xi - mean) ** 2 for xi in x) / (n - 1)) else: s = 0.0 if s == 0: ratio = None else: ratio = razmah / s return mn, mx, razmah, s, ratio def intervals(sample, m): mn, mx, razmah, s, ratio = stats(sample) x = sorted(sample) n = len(x) borders = [mn] for k in range(1, m): idx = int(k * n / m) borders.append(x[idx]) borders.append(mx) counts = [0] * m for v in sample: placed = False for i in range(m - 1): if borders[i] <= v < borders[i + 1]: counts[i] += 1 placed = True break if not placed: if borders[m - 1] <= v <= borders[m]: counts[m - 1] += 1 return borders, counts ``` #### Модуль 2: M2 ```python import os import M1 import matplotlib.pyplot as plt def read_sample(filename): data = [] with open(filename, "r", encoding="utf-8") as f: for line in f: for t in line.split(): data.append(float(t)) return data def run(): while True: fname = input("Введите имя файла с выборкой: ").strip() if os.path.exists(fname): break print("Файл не найден. Попробуйте ещё раз.") sample = read_sample(fname) print("Размер выборки:", len(sample)) m = int(input("Введите число интервалов m: ")) mn, mx, razmah, s, ratio = M1.stats(sample) borders, counts = M1.intervals(sample, m) print("\n--- Статистики ---") print("min =", mn) print("max =", mx) print("размах =", razmah) print("std =", s) print("размах/std =", ratio) print("\n--- Интервалы ---") for i in range(m): left = borders[i] right = borders[i+1] print(f"[{left}; {right}) -> {counts[i]}" if i < m-1 else f"[{left}; {right}] -> {counts[i]}") labels = [] for i in range(m): a = borders[i] b = borders[i+1] if i < m-1: labels.append(f"[{a:.2f};{b:.2f})") else: labels.append(f"[{a:.2f};{b:.2f}]") plt.bar(labels, counts) plt.xticks(rotation=45, ha="right") plt.title("Распределение элементов по интервалам") plt.xlabel("Интервалы") plt.ylabel("Число элементов") plt.tight_layout() plt.show() return mn, mx, razmah, s, ratio, borders, counts ``` #### Модуль 3: M0 ```python import M2 result = M2.run() print("\nГотово. Результаты получены.") ``` ## Ответ c sampe1.txt: ```python import M0 Введите имя файла с выборкой: sample1 Файл не найден. Попробуйте ещё раз. Введите имя файла с выборкой: sample1.txt Файл не найден. Попробуйте ещё раз. Введите имя файла с выборкой: sample1.txt Размер выборки: 20 Введите число интервалов m: 5 --- Статистики --- min = 1.0 max = 12.0 размах = 11.0 std = 3.216323497738569 размах/std = 3.4200539864022432 --- Интервалы --- [1.0; 3.0) -> 4 [3.0; 4.0) -> 3 [4.0; 6.0) -> 5 [6.0; 9.0) -> 4 [9.0; 12.0] -> 4 Готово. Результаты получены. ``` ![[test_figure_1.png]] ## Ответ c sampe2.txt: ```python import M0 Введите имя файла с выборкой: sample2.txt Размер выборки: 18 Введите число интервалов m: 8 --- Статистики --- min = -5.0 max = 34.0 размах = 39.0 std = 9.751319669363612 размах/std = 3.9994586704534942 --- Интервалы --- [-5.0; -3.0) -> 2 [-3.0; -1.0) -> 2 [-1.0; 0.0) -> 1 [0.0; 1.0) -> 3 [1.0; 2.0) -> 2 [2.0; 5.0) -> 3 [5.0; 13.0) -> 2 [13.0; 34.0] -> 3 Готово. Результаты получены. ``` ![[test_figure_2.png]] #### Файл sample1.txt: ``` 1 2 3 4 5 6 2 2 3 3 4 4 5 6 7 8 9 10 11 12 ``` #### Файл sample2.txt: ``` -5 -4 -3 -2 -1 0 0 0 1 1 2 2 3 5 8 13 21 34 ```