форкнуто от main/python-labs
main
Родитель
c3488f3aff
Сommit
2b4fc6667f
@ -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
|
||||
@ -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
|
||||
@ -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("Ошибка! Коэф. корр. неверный.")
|
||||
@ -0,0 +1 @@
|
||||
15
|
||||
@ -0,0 +1,3 @@
|
||||
3 3 3 3 3 3 3
|
||||
3 3 3 3 3
|
||||
3 3
|
||||
@ -0,0 +1,3 @@
|
||||
1 2 3 4 5
|
||||
6 7 8 9 10
|
||||
11 12 13 14 15
|
||||
@ -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
|
||||
@ -0,0 +1,2 @@
|
||||
15 14 13 12 11
|
||||
10 9 8 7 6
|
||||
@ -0,0 +1,3 @@
|
||||
3 8 1 9 4
|
||||
12 5 7 2 10
|
||||
6 11 14 3 8
|
||||
@ -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')
|
||||
<module 'Mod3_okz' from 'C:\\Users\\User\\Desktop\\python-labs\\TEMA8\\Mod3_okz.py'>
|
||||
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
|
||||
Ошибка! Нулевая дисперсия.
|
||||
```
|
||||
Загрузка…
Ссылка в новой задаче