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