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

4.7 KiB

Общее контрольное задание по Теме 8

Таболин Иван, А-01-23

Задание

Разработайте программу, состоящую из трех модулей:

  • Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
  • Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
  • Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, два-жды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вы-зывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отобража-ет рассчитанное значение на экране с округлением до трех цифр после точки. Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.

Решение

Первый модуль Mod1_okz.py

# Модуль 1 ОКЗ
def r_file(name):
    """Чтение данных из файла
    name - имя файла"""
    inp_spis=[]
    with open(name) as f:
        for line in f:
            for x in line.split():
                inp_spis.append(float(x))
    return inp_spis

Второй модуль Mod2_okz.py

# Модуль 2
# Расчет корреляции
def corr(x,y):
    if not x or not y:
        # Ошибка! Отсутствует аргумент.
        return 22
    import math
    sum1=sum2=sum3=0
    n=min(len(x),len(y))
    if n<2:
        # Ошибка! Малая выборка.
        return 33
    x=x[:n]
    y=y[:n]
    x_mean=sum(x)/n
    y_mean=sum(y)/n
    for i in range(n):
        sum1+=(x[i]-x_mean)*(y[i]-y_mean)
        sum2+=(x[i]-x_mean)**2
        sum3+=(y[i]-y_mean)**2
    if sum2!=0 and sum3!=0:
        znam=math.sqrt(sum2*sum3)
    else:
        # Ошибка! Деление на ноль.
        return 44
    r=sum1/znam
    return r

Третий модуль 'Mod3_okz.py'

# Модуль 3
from Mod1_okz import r_file
from Mod2_okz import corr
file1=input("Введите имя первого файла: ")
file2=input("Введите имя второго файла: ")
spis1=r_file(file1)
spis2=r_file(file2)

res=corr(spis1,spis2)
if not(res in [22,33,44]):
    res=round(res,3)

if res == 22:
    print("Ошибка! Пустой файл.")
elif res == 33:
    print("Ошибка! Малая выборка.")
elif res == 44:
    print("Ошибка! Нулевая дисперсия.")
elif (res >= -1) and (res <= 1):
    print("r =", res)
else:
    print("Ошибка! Коэф. корр. неверный.")

Тестирование

import Mod3_okz
Введите имя первого файла: selection1.txt
Введите имя второго файла: selection2.txt
r = 1.0

sys.modules.pop('Mod3_okz')
<module 'Mod3_okz' from 'C:\\Users\\User\\Desktop\\python-labs\\TEMA8\\Mod3_okz.py'>
import Mod3_okz
Введите имя первого файла: selection3.txt
Введите имя второго файла: selection4.txt
r = -0.235

Примеры ошибок

import Mod3_okz
Введите имя первого файла: selection1.txt
Введите имя второго файла: empty.txt
Ошибка! Пустой файл.

import Mod3_okz
Введите имя первого файла: selection2.txt
Введите имя второго файла: few_values.txt
Ошибка! Малая выборка.

import Mod3_okz
Введите имя первого файла: selection3.txt
Введите имя второго файла: same_values.txt
Ошибка! Нулевая дисперсия.