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