форкнуто от main/python-labs
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
115 строки
4.1 KiB
Markdown
115 строки
4.1 KiB
Markdown
# Общее контрольное задание по теме 8
|
|
|
|
Похил Анастасия, А-02-23
|
|
|
|
## Задание
|
|
|
|
Разработайте программу, состоящую из трех модулей:
|
|
|
|
- Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
|
|
|
|
- Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
|
|
|
|
- Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.
|
|
|
|
Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.
|
|
|
|
## Решение
|
|
|
|
```py
|
|
|
|
#okz1.py
|
|
|
|
def read_numbers_from_file(filename):
|
|
numbers = []
|
|
file = open(filename, 'r')
|
|
lines = file.readlines()
|
|
file.close()
|
|
|
|
for line in lines:
|
|
line = line.strip()
|
|
if line:
|
|
parts = line.split()
|
|
for part in parts:
|
|
numbers.append(float(part))
|
|
|
|
return numbers
|
|
|
|
#okz2.py
|
|
|
|
def correlation_coefficient(list1, list2):
|
|
length1 = len(list1)
|
|
length2 = len(list2)
|
|
min_length = min(length1, length2)
|
|
|
|
if min_length < 2:
|
|
return 0.0
|
|
|
|
x = list1[:min_length]
|
|
y = list2[:min_length]
|
|
|
|
sum_x = 0.0
|
|
sum_y = 0.0
|
|
for i in range(min_length):
|
|
sum_x += x[i]
|
|
sum_y += y[i]
|
|
|
|
average_x = sum_x / min_length
|
|
average_y = sum_y / min_length
|
|
|
|
top = 0.0
|
|
sum_sq_x = 0.0
|
|
sum_sq_y = 0.0
|
|
|
|
for i in range(min_length):
|
|
diff_x = x[i] - average_x
|
|
diff_y = y[i] - average_y
|
|
top += diff_x * diff_y
|
|
sum_sq_x += diff_x * diff_x
|
|
sum_sq_y += diff_y * diff_y
|
|
|
|
if sum_sq_x == 0.0 or sum_sq_y == 0.0:
|
|
return 0.0
|
|
|
|
bottom = (sum_sq_x * sum_sq_y) ** 0.5
|
|
result = top / bottom
|
|
|
|
return result
|
|
|
|
#okz3.py
|
|
|
|
import okz1
|
|
import okz2
|
|
|
|
def main():
|
|
print("Введите имя первого файла:")
|
|
file_name1 = input()
|
|
|
|
print("Введите имя второго файла:")
|
|
file_name2 = input()
|
|
|
|
numbers1 = module1.read_numbers_from_file(file_name1)
|
|
numbers2 = module1.read_numbers_from_file(file_name2)
|
|
|
|
correlation = module2.correlation_coefficient(numbers1, numbers2)
|
|
|
|
correlation = round(correlation, 3)
|
|
|
|
print("Коэффициент корреляции:", correlation)
|
|
|
|
#Проверка
|
|
|
|
data1.txt
|
|
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
|
|
|
|
data2.txt
|
|
10.0 9.0 9.5 8.0 7.0 5.0 4.0 2.0 1.0 7.5
|
|
|
|
|
|
Введите имя первого файла: data1.txt
|
|
Введите имя второго файла: data2.txt
|
|
Коэффициент корреляции: -0.76
|
|
Process finished with exit code 0
|
|
```
|
|
|