# Общее контрольное задание по теме 8 Киреев Юрий А-02-23 ## Задание Разработайте программу, состоящую из трех модулей: - Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу. - Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу. - Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки. Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы. ## Решение Модуль 1: ```py def read_numbers_from_file(filename): """Модуль 1: Чтение числового списка из файла""" numbers = [] with open(filename, 'r') as fp: for line in fp: parts = line.split() for part in parts: numbers.append(float(part)) return numbers ``` Модуль 2: ```py def calculate_correlation(list1, list2): """Модуль 2: Вычисляет коэффициент корреляции для двух списков""" # Если списки разной длины, используем минимальную длину n = min(len(list1), len(list2)) # Берем только первые n элементов из каждого списка x = list1[:n] y = list2[:n] mean_x = sum(x)/n mean_y = sum(y)/n chisl = 0 sum1 = 0 sum2 = 0 for i in range(n): chisl += (x[i] - mean_x) * (y[i] - mean_y) sum1 += (x[i] - mean_x) ** 2 sum2 += (y[i] - mean_y) ** 2 znam = (sum1 * sum2) ** 0.5 if znam == 0: return ('Ошибка, деление на ноль') correlation = chisl / znam return correlation ``` Модуль 3: ```py import mod2okz, mod1okz, os file1 = os.path.abspath(input("Введите имя первого файла: ")) file2 = os.path.abspath(input("Введите имя второго файла: ")) def read_float_list(filename): nums = [] with open(filename, 'r') as f: for line in f: nums.extend([float(x) for x in line.split()]) return nums list1, list2 = read_float_list(file1), read_float_list(file2) result = mod2okz.calculate_correlation(list1, list2) print(f"{result:.3f}") ``` Файлы для проверки: ```py #file1 1 2 3 4 5 6 7 8 9 10 #file2 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 11.0 #file3 10 8 6 4 2 0 -2 -4 -6 -8 #file4 5 6 1 34 43 -3 -2 99 9.2 1 ``` Проверим результаты: ```py >>> import mod3okz Введите имя первого файла: file1.txt Введите имя второго файла: file2.txt 0.999 >>> sys.modules.pop("mod3okz") >>> import mod3okz Введите имя первого файла: file1.txt Введите имя второго файла: file3.txt -0.976 >>> sys.modules.pop("mod3okz") >>> import mod3okz Введите имя первого файла: file1.txt Введите имя второго файла: file4.txt 0.185 ```