From 2b4fc6667fdfad1c3afb84efd53267f3ac7eb193 Mon Sep 17 00:00:00 2001 From: TabolinIA Date: Mon, 8 Dec 2025 02:00:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=9A=D0=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TEMA8/Mod1_okz.py | 10 ++++ TEMA8/Mod2_okz.py | 27 +++++++++++ TEMA8/Mod3_okz.py | 22 +++++++++ TEMA8/empty.txt | 0 TEMA8/few_values.txt | 1 + TEMA8/same_values.txt | 3 ++ TEMA8/selection1.txt | 3 ++ TEMA8/selection2.txt | 3 ++ TEMA8/selection3.txt | 2 + TEMA8/selection4.txt | 3 ++ TEMA8/task.md | 108 ++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 182 insertions(+) create mode 100644 TEMA8/Mod1_okz.py create mode 100644 TEMA8/Mod2_okz.py create mode 100644 TEMA8/Mod3_okz.py create mode 100644 TEMA8/empty.txt create mode 100644 TEMA8/few_values.txt create mode 100644 TEMA8/same_values.txt create mode 100644 TEMA8/selection1.txt create mode 100644 TEMA8/selection2.txt create mode 100644 TEMA8/selection3.txt create mode 100644 TEMA8/selection4.txt create mode 100644 TEMA8/task.md diff --git a/TEMA8/Mod1_okz.py b/TEMA8/Mod1_okz.py new file mode 100644 index 0000000..f7103d2 --- /dev/null +++ b/TEMA8/Mod1_okz.py @@ -0,0 +1,10 @@ +# Модуль 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 diff --git a/TEMA8/Mod2_okz.py b/TEMA8/Mod2_okz.py new file mode 100644 index 0000000..dd32b45 --- /dev/null +++ b/TEMA8/Mod2_okz.py @@ -0,0 +1,27 @@ +# Модуль 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 diff --git a/TEMA8/Mod3_okz.py b/TEMA8/Mod3_okz.py new file mode 100644 index 0000000..1e8185e --- /dev/null +++ b/TEMA8/Mod3_okz.py @@ -0,0 +1,22 @@ +# Модуль 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("Ошибка! Коэф. корр. неверный.") diff --git a/TEMA8/empty.txt b/TEMA8/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/TEMA8/few_values.txt b/TEMA8/few_values.txt new file mode 100644 index 0000000..3f10ffe --- /dev/null +++ b/TEMA8/few_values.txt @@ -0,0 +1 @@ +15 \ No newline at end of file diff --git a/TEMA8/same_values.txt b/TEMA8/same_values.txt new file mode 100644 index 0000000..1f4f830 --- /dev/null +++ b/TEMA8/same_values.txt @@ -0,0 +1,3 @@ +3 3 3 3 3 3 3 +3 3 3 3 3 +3 3 \ No newline at end of file diff --git a/TEMA8/selection1.txt b/TEMA8/selection1.txt new file mode 100644 index 0000000..24478c6 --- /dev/null +++ b/TEMA8/selection1.txt @@ -0,0 +1,3 @@ +1 2 3 4 5 +6 7 8 9 10 +11 12 13 14 15 \ No newline at end of file diff --git a/TEMA8/selection2.txt b/TEMA8/selection2.txt new file mode 100644 index 0000000..e784344 --- /dev/null +++ b/TEMA8/selection2.txt @@ -0,0 +1,3 @@ +1.1 2.2 3.1 4.3 5.2 +6.1 7.3 8.2 9.1 10.3 +11.2 12.1 13.3 14.2 15.1 \ No newline at end of file diff --git a/TEMA8/selection3.txt b/TEMA8/selection3.txt new file mode 100644 index 0000000..1b59741 --- /dev/null +++ b/TEMA8/selection3.txt @@ -0,0 +1,2 @@ +15 14 13 12 11 +10 9 8 7 6 diff --git a/TEMA8/selection4.txt b/TEMA8/selection4.txt new file mode 100644 index 0000000..72079b1 --- /dev/null +++ b/TEMA8/selection4.txt @@ -0,0 +1,3 @@ +3 8 1 9 4 +12 5 7 2 10 +6 11 14 3 8 \ No newline at end of file diff --git a/TEMA8/task.md b/TEMA8/task.md new file mode 100644 index 0000000..883381c --- /dev/null +++ b/TEMA8/task.md @@ -0,0 +1,108 @@ +# Общее контрольное задание по Теме 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 +Ошибка! Нулевая дисперсия. +```