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

4.6 KiB

Общее контрольное задание по теме 8

Киреев Юрий А-02-23

Задание

Разработайте программу, состоящую из трех модулей:

  • Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
  • Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
  • Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки. Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.

Решение

Модуль 1:

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:

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:

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}")

Файлы для проверки:

#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

Проверим результаты:

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