diff --git a/TEMA9/MAINMOD3.py b/TEMA9/MAINMOD3.py new file mode 100644 index 0000000..e4bff87 --- /dev/null +++ b/TEMA9/MAINMOD3.py @@ -0,0 +1,12 @@ +import module3M2 + +def main(): + + print('Расчет 1') + module3M2.process() + + print('\n' + '_+++++++++_') + print('\n Расчет 2') + module3M2.process() + + diff --git a/TEMA9/mod3.txt b/TEMA9/mod3.txt new file mode 100644 index 0000000..d7df68e --- /dev/null +++ b/TEMA9/mod3.txt @@ -0,0 +1,3 @@ +12 15 17 18 14 +18 9 15 26 7 +12 17 18 6 2 \ No newline at end of file diff --git a/TEMA9/mod31.txt b/TEMA9/mod31.txt new file mode 100644 index 0000000..d11c586 --- /dev/null +++ b/TEMA9/mod31.txt @@ -0,0 +1,4 @@ +20 20 40 41 35 +26 27 50 34 38 +25 48 65 54 29 +29 21 17 18 20 \ No newline at end of file diff --git a/TEMA9/module3M1.py b/TEMA9/module3M1.py new file mode 100644 index 0000000..5010283 --- /dev/null +++ b/TEMA9/module3M1.py @@ -0,0 +1,50 @@ +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 + + + diff --git a/TEMA9/module3M2.py b/TEMA9/module3M2.py new file mode 100644 index 0000000..6edd506 --- /dev/null +++ b/TEMA9/module3M2.py @@ -0,0 +1,49 @@ +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) + diff --git a/TEMA9/moduletask.md b/TEMA9/moduletask.md new file mode 100644 index 0000000..6038963 --- /dev/null +++ b/TEMA9/moduletask.md @@ -0,0 +1,190 @@ +# Тест по модулю 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 элементов | [|] +``` \ No newline at end of file