# Общее контрольное задание по Теме 8 Таболин Иван, А-01-23 ## Задание Разработайте программу, состоящую из трех модулей: - Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу. - Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу. - Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, два-жды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вы-зывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отобража-ет рассчитанное значение на экране с округлением до трех цифр после точки. Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы. ## Решение Первый модуль `Mod1_okz.py` ```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` ```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' ```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("Ошибка! Коэф. корр. неверный.") ``` Тестирование ```py import Mod3_okz Введите имя первого файла: selection1.txt Введите имя второго файла: selection2.txt r = 1.0 sys.modules.pop('Mod3_okz') import Mod3_okz Введите имя первого файла: selection3.txt Введите имя второго файла: selection4.txt r = -0.235 ``` Примеры ошибок ```py import Mod3_okz Введите имя первого файла: selection1.txt Введите имя второго файла: empty.txt Ошибка! Пустой файл. import Mod3_okz Введите имя первого файла: selection2.txt Введите имя второго файла: few_values.txt Ошибка! Малая выборка. import Mod3_okz Введите имя первого файла: selection3.txt Введите имя второго файла: same_values.txt Ошибка! Нулевая дисперсия. ```