ответвлено от main/python-labs
done
Этот коммит содержится в:
110
TEMA8/task.md
Обычный файл
110
TEMA8/task.md
Обычный файл
@@ -0,0 +1,110 @@
|
||||
Жалнин Вадим А-01-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
|
||||
```
|
||||
Ссылка в новой задаче
Block a user