ответвлено от main/python-labs
101 строка
4.6 KiB
Markdown
101 строка
4.6 KiB
Markdown
# Общее контрольное задание по теме 8
|
|
Киреев Юрий А-02-23
|
|
## Задание
|
|
Разработайте программу, состоящую из трех модулей:
|
|
- Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
|
|
- Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
|
|
- Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.
|
|
Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.
|
|
## Решение
|
|
Модуль 1:
|
|
```py
|
|
def read_numbers_from_file(filename):
|
|
"""Модуль 1: Чтение числового списка из файла"""
|
|
numbers = []
|
|
with open(filename, 'r') as fp:
|
|
for line in fp:
|
|
parts = line.split()
|
|
for part in parts:
|
|
numbers.append(float(part))
|
|
return numbers
|
|
```
|
|
Модуль 2:
|
|
```py
|
|
def calculate_correlation(list1, list2):
|
|
"""Модуль 2: Вычисляет коэффициент корреляции для двух списков"""
|
|
# Если списки разной длины, используем минимальную длину
|
|
n = min(len(list1), len(list2))
|
|
|
|
# Берем только первые n элементов из каждого списка
|
|
x = list1[:n]
|
|
y = list2[:n]
|
|
mean_x = sum(x)/n
|
|
mean_y = sum(y)/n
|
|
chisl = 0
|
|
sum1 = 0
|
|
sum2 = 0
|
|
for i in range(n):
|
|
chisl += (x[i] - mean_x) * (y[i] - mean_y)
|
|
sum1 += (x[i] - mean_x) ** 2
|
|
sum2 += (y[i] - mean_y) ** 2
|
|
znam = (sum1 * sum2) ** 0.5
|
|
if znam == 0:
|
|
return ('Ошибка, деление на ноль')
|
|
correlation = chisl / znam
|
|
return correlation
|
|
```
|
|
Модуль 3:
|
|
```py
|
|
import mod2okz, mod1okz, os
|
|
file1 = os.path.abspath(input("Введите имя первого файла: "))
|
|
file2 = os.path.abspath(input("Введите имя второго файла: "))
|
|
def read_float_list(filename):
|
|
nums = []
|
|
with open(filename, 'r') as f:
|
|
for line in f:
|
|
nums.extend([float(x) for x in line.split()])
|
|
return nums
|
|
list1, list2 = read_float_list(file1), read_float_list(file2)
|
|
result = mod2okz.calculate_correlation(list1, list2)
|
|
print(f"{result:.3f}")
|
|
```
|
|
Файлы для проверки:
|
|
```py
|
|
#file1
|
|
1 2 3 4 5
|
|
6 7 8 9 10
|
|
|
|
#file2
|
|
1.1 2.2 3.3 4.4 5.5
|
|
6.6 7.7 8.8 9.9 11.0
|
|
|
|
#file3
|
|
10 8 6 4 2
|
|
0 -2 -4 -6 -8
|
|
|
|
#file4
|
|
5 6 1 34 43
|
|
-3 -2 99 9.2 1
|
|
```
|
|
|
|
Проверим результаты:
|
|
```py
|
|
>>> import mod3okz
|
|
Введите имя первого файла: file1.txt
|
|
Введите имя второго файла: file2.txt
|
|
0.999
|
|
|
|
>>> sys.modules.pop("mod3okz")
|
|
<module 'mod3okz' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\mod3okz.py'>
|
|
>>> import mod3okz
|
|
Введите имя первого файла: file1.txt
|
|
Введите имя второго файла: file3.txt
|
|
-0.976
|
|
|
|
>>> sys.modules.pop("mod3okz")
|
|
<module 'mod3okz' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\mod3okz.py'>
|
|
>>> import mod3okz
|
|
Введите имя первого файла: file1.txt
|
|
Введите имя второго файла: file4.txt
|
|
0.185
|
|
``` |