Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

4.0 KiB

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

Сарайкина Вера, А-02-23

Задание

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

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

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

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

Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.

Решение


#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