diff --git a/TEMA8/file1.txt b/TEMA8/file1.txt new file mode 100644 index 0000000..dddd0c3 --- /dev/null +++ b/TEMA8/file1.txt @@ -0,0 +1,7 @@ +1 +2 +3 +4 +5 +6 +8 \ No newline at end of file diff --git a/TEMA8/file2.txt b/TEMA8/file2.txt new file mode 100644 index 0000000..b0f1865 --- /dev/null +++ b/TEMA8/file2.txt @@ -0,0 +1 @@ +6 7 8 9 10 8 4 6 \ No newline at end of file diff --git a/TEMA8/mod_cc.py b/TEMA8/mod_cc.py new file mode 100644 index 0000000..47782ae --- /dev/null +++ b/TEMA8/mod_cc.py @@ -0,0 +1,19 @@ +import math +def calculateCorrelation(list1, list2): + n = min(len(list1), len(list2)) + mean1 = sum(list1[:n]) / n + mean2 = sum(list2[:n]) / n + numerator = 0 + sum1 = 0 + sum2 = 0 + for i in range(n): + d1 = list1[i] - mean1 + d2 = list2[i] - mean2 + numerator += d1 * d2 + sum1 += d1 ** 2 + sum2 += d2 ** 2 + denominator = math.sqrt(sum1 * sum2) + if denominator == 0: + print("деление на ноль") + return None + return numerator / denominator diff --git a/TEMA8/mod_m.py b/TEMA8/mod_m.py new file mode 100644 index 0000000..b00ab8f --- /dev/null +++ b/TEMA8/mod_m.py @@ -0,0 +1,16 @@ +import os, mod_s, mod_cc +for i in range(1, 3): + while True: + filename = os.path.abspath(input(f"Введите имя {i}-го файла: ")) + if not os.path.isfile(filename): + print("Ошибка: введено неверное имя файла") + continue + newList = mod_s.readList(filename) + if not newList: + print("Ошибка: в данном файле содержится пустой список значений") + continue + globals()[f"list{i}"] = newList + break +correlation = mod_cc.calculateCorrelation(list1, list2) +if correlation is not None: + print(f"Коэффициент корреляции равен: {correlation}") diff --git a/TEMA8/mod_s.py b/TEMA8/mod_s.py new file mode 100644 index 0000000..3548aae --- /dev/null +++ b/TEMA8/mod_s.py @@ -0,0 +1,7 @@ +def readList(filename): + numList = [] + with open(filename, "r") as file: + for line in file: + for num in line.strip().split(): + numList.append(float(num)) + return numList diff --git a/TEMA8/task.md b/TEMA8/task.md new file mode 100644 index 0000000..5ce4c54 --- /dev/null +++ b/TEMA8/task.md @@ -0,0 +1,80 @@ +# Общее контрольное задание по теме 8 + +Мамакин Ярослав, А-02-23 + +## Задание + +Общее контрольное задание. +Разработайте программу, состоящую из трех модулей: +- Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Получен-ный список должен возвращаться в вызывающую программу. + +- Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу. + +- Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. За-тем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки. + + + +## Решение + +Модуль 1 +```py +def readList(filename): + numList = [] + with open(filename, "r") as file: + for line in file: + for num in line.strip().split(): + numList.append(float(num)) + return numList +``` + +Модуль 2 +```py +import math +def calculateCorrelation(list1, list2): + n = min(len(list1), len(list2)) + mean1 = sum(list1[:n]) / n + mean2 = sum(list2[:n]) / n + numerator = 0 + sum1 = 0 + sum2 = 0 + for i in range(n): + d1 = list1[i] - mean1 + d2 = list2[i] - mean2 + numerator += d1 * d2 + sum1 += d1 ** 2 + sum2 += d2 ** 2 + denominator = math.sqrt(sum1 * sum2) + if denominator == 0: + print("деление на ноль") + return None + return numerator / denominator +``` + +Модуль 3 + +```py +import os, mod_s, mod_cc +for i in range(1, 3): + while True: + filename = os.path.abspath(input(f"Введите имя {i}-го файла: ")) + if not os.path.isfile(filename): + print("Ошибка: введено неверное имя файла") + continue + newList = mod_s.readList(filename) + if not newList: + print("Ошибка: в данном файле содержится пустой список значений") + continue + globals()[f"list{i}"] = newList + break +correlation = mod_cc.calculateCorrelation(list1, list2) +if correlation is not None: + print(f"Коэффициент корреляции равен: {correlation}") +``` + +```py +>>> import mod_m +Введите имя 1-го файла: file1.txt +Введите имя 2-го файла: file2.txt +Коэффициент корреляции равен: -0.1888141941724601 +``` +