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

6.6 KiB

Тест по модулю 3

Савин Семён, А-02-23

Задание

M3_14

  1. Создайте модуль М1, содержащий две функции:
  • функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке списка с наименьшим и наибольшим значениями, размахом (разность наибольшего и наименьшего значений), оценкой стандартного отклонения и отношением размаха к стандартному отклонению;

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

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

  • выборка вводится из файла и записывается в список (в строках файла может быть разное число значений, разделенных пробелами);

  • запрашиваются у пользователя число интервалов разбиения;

  • с помощью функций 1 и 2 производится определение границ интервалов и чисел элементов в них;

  • отображается столбиковая диаграмма с интервалами и числами элементов выборки в них.

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

  2. Проведите расчеты при 2-х разных файлах с выборками

Решение

Содержимое модуля module3M1.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

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)

Главные модуль вызова:

import module3M2

def main():

    print('Расчет 1')
    module3M2.process()

    print('\n' + '_+++++++++_')
    print('\n Расчет 2')
    module3M2.process()

Вывод в консоли:

>>> 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 элементов | [|]