From 2614cf05ad61979541a77350361905dbe18051be Mon Sep 17 00:00:00 2001 From: KapitonovMikA Date: Tue, 16 Dec 2025 13:54:58 +0000 Subject: [PATCH] added test --- TEMA9/M1.py | 42 +++++++++++++++++ TEMA9/test.md | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++ TEMA9/М2.py | 55 ++++++++++++++++++++++ 3 files changed, 223 insertions(+) create mode 100644 TEMA9/M1.py create mode 100644 TEMA9/test.md create mode 100644 TEMA9/М2.py diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..bbf9c4f --- /dev/null +++ b/TEMA9/M1.py @@ -0,0 +1,42 @@ +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 diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..9a49595 --- /dev/null +++ b/TEMA9/test.md @@ -0,0 +1,126 @@ +# Индивидуальное контрольное задание по модулю 3 + +Капитонов Михаил, А-02-23 + +## 1) Создайте модуль М1, содержащий две функции: + +- функция 1: аргумент - список или кортеж SPS с элементами случайной выборки; функция должна создать новый список с рассчитанным по выборке вариационным рядом и рассчитать по нему еще один список со средним значением, медианой и оценкой стандартного отклонения; оба списка возвращаются в вызывающую программу; +- функция 2: аргумент - список или кортеж SPS с элементами случайной выборки и целочисленный параметр NINT; функция должна рассчитать по выборке гистограмму с NINT интервалами разбиения диапазона изменения случайной величины; гистограмма должна быть представлена графически на экране, а также возвращена в виде списка в вызывающую программу. + +## 2) Создайте еще один модуль М2, в котором должны выполняться следующие операции: + +- запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторение запроса; +- выборка вводится из файла и записывается в объект-список; +- вызывается функция 1; +- у пользователя запрашивается число NINT интервалов в гистограмме; при нарушении неравенств 1 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 + +``` \ No newline at end of file diff --git a/TEMA9/М2.py b/TEMA9/М2.py new file mode 100644 index 0000000..09f1a8a --- /dev/null +++ b/TEMA9/М2.py @@ -0,0 +1,55 @@ +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