Files
python-labs/TEMA8/task.md
2025-12-14 18:22:42 +03:00

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
```