# Тест по модулю 3 Савин Семён, А-02-23 ## Задание M3_14 1) Создайте модуль М1, содержащий две функции: - функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке списка с наименьшим и наибольшим значениями, размахом (разность наибольшего и наименьшего значений), оценкой стандартного отклонения и отношением размаха к стандартному отклонению; - функция 2: аргументы - список или кортеж с выборкой и целочисленный параметр m; функция должна обратиться к функции 1 и затем определить границы m непересекающихся интервалов в диапазоне величины между наибольшим и наименьшим значениями по выборке, содержащих примерно одинаковое число элементов выборки; функция должна вернуть 2 списка: со значениями границ интервалов и с числами элементов в интервалах. 2) Создайте еще один модуль М2, в котором должны выполняться следующие операции: - запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос; - выборка вводится из файла и записывается в список (в строках файла может быть разное число значений, разделенных пробелами); - запрашиваются у пользователя число интервалов разбиения; - с помощью функций 1 и 2 производится определение границ интервалов и чисел элементов в них; - отображается столбиковая диаграмма с интервалами и числами элементов выборки в них. 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране. 4) Проведите расчеты при 2-х разных файлах с выборками ## Решение Содержимое модуля module3M1.py - расчеты ```py import math def calc(sample): minimum =min(sample) maximum=max(sample) print(minimum,maximum) ran = maximum-minimum n= len(sample) mean = sum(sample)/n sum1 = 0 for i in range(n): sum1 = (sample[i]-mean)**2 std_dev = math.sqrt(1/n*sum1) ratio = ran/std_dev if std_dev != 0 else 0 return {'min': minimum, 'max': maximum, 'range': ran, 'deviation': std_dev,'range to stddev': ratio, 'samplesize': n} def intervals(sample,m): stats =calc(sample) minimum = stats['min'] maximum =stats['max'] sortedsam = sorted(sample) n=len(sortedsam) width =(maximum-minimum)/m bounds = [minimum + i*width for i in range(m+1)] c = [0]*m s = 0 for i in range(m): lower = bounds[i] upper = bounds[i+1] while s < n and sortedsam[s] <= upper: if i ==m-1: if sortedsam[s] >= lower: c[i]+=1 else: if lower <=sortedsam[s] < upper: c[i]+=1 s +=1 return bounds, c ``` Содержимое модуля module3M2.py - чтение, вывод, обработка данных и передача в M1 ```py import os import module3M1 def reader(filename): sample = [] with open(filename, 'r', encoding = 'utf-8') as file: for line in file: vals = line.strip().split() for val in vals: sample.append(float(val)) return sample def display(bounds,c): maxcount =max(c) for i,count in enumerate(c): lowers = bounds[i] uppers =bounds[i+1] bar = '[|]'*int(count) print(f'({lowers}, {uppers}) : {count} элементов | {bar}') def process(): while True: filename = input('Имя файла:') if os.path.exists(filename): break print(f'Еще раз, {filename} неверное название') sample = reader(filename) while True: m =int(input('Введите число разбиений')) if m > 0: break else: ('Введите ненулевое целое значение') stats =module3M1.calc(sample) print('Максимум: ', stats['max']) print('Минимум: ', stats['min']) print('Размах: ', stats['range']) print('СО: ', stats['deviation']) print('Отношение размаха к отклоеннию: ', stats['range to stddev']) bounds, c = module3M1.intervals(sample,m) display(bounds,c) ``` Главные модуль вызова: ```py import module3M2 def main(): print('Расчет 1') module3M2.process() print('\n' + '_+++++++++_') print('\n Расчет 2') module3M2.process() ``` Вывод в консоли: ```py >>> main() Расчет 1 Имя файла:mod3.txt Введите число разбиений5 2.0 26.0 Максимум: 26.0 Минимум: 2.0 Размах: 24.0 СО: 3.0295336397000234 Отношение размаха к отклоеннию: 7.922011389969717 2.0 26.0 (2.0, 6.8) : 2 элементов | [|][|] (6.8, 11.6) : 2 элементов | [|][|] (11.6, 16.4) : 5 элементов | [|][|][|][|][|] (16.4, 21.2) : 5 элементов | [|][|][|][|][|] (21.2, 26.0) : 1 элементов | [|] _+++++++++_ Расчет 2 Имя файла:mod31.txt Введите число разбиений6 17.0 65.0 Максимум: 65.0 Минимум: 17.0 Размах: 48.0 СО: 2.8733473510872303 Отношение размаха к отклоеннию: 16.705254929181304 17.0 65.0 (17.0, 25.0) : 6 элементов | [|][|][|][|][|][|] (25.0, 33.0) : 4 элементов | [|][|][|][|] (33.0, 41.0) : 4 элементов | [|][|][|][|] (41.0, 49.0) : 1 элементов | [|] (49.0, 57.0) : 2 элементов | [|][|] (57.0, 65.0) : 1 элементов | [|] ```