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

6.1 KiB

Модуль 3 варианть 2

Ефимова Людмила, А-03-23

Создайте модуль М1, содержащий две функции:

  • функция 1: аргументы - имя текстового файла с числовыми данными (может быть разное число значений на каждой строке) и пороговое значение КК; считываются значения из указанного файла и записываются в два новых текстовых файла, имена которых совпадают с именем входного файла с добавлением 1 и 2 - в первый файл записываются значения, превышающие заданный порог, а во второй - не превышающие его. Исходные данные в виде списка возвращаются в вызывающую программу;

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

import math
import statistics

def func1(filename, KK):
    with open(filename, 'r', encoding = 'utf-8') as f:
        nums = []
        for i in f:
            nums_line = list(map(float,line.strip().split()))
            nums.extend(nums_line)

    above = [] 
    below = []
    for n in nums:
        if n > KK:
            above.append(n)
        else:
            below.append(n)
            

    x = filename.split('.')[0] 
    with open(x + '1.txt') as f: # запись в новый файл превышающих
        for num in above:
            f.write(str(num) +'\n')

    with open(x + '2.txt') as f: # запись в новый файл не превышающих
        for num in below:
            f.write(str(num) +'\n')
            
    return nums

def func2(filename):
    with open(filename, 'r', encoding = 'utf-8') as f:
        nums = []
        for i in f:
            nums_line = list(map(float,line.strip().split()))
            nums.extend(nums_line)
    n = len(nums)
    mean = sum(nums)/n

    median = statistics.median(nums) # медиана
    std = statistics.stdev(nums) # стандартное отклонение
    print(mean, median, min(nums), max(nums), std)

    return [mean, median, min(nums), max(nums), std]

Создайте еще один модуль М2, в котором должны:

  • запрашиваться имя файла с исходными данными, проверяться его наличие и при отсутствии - повторение запроса;

  • запрос порогового значения КК;

  • вызов функции 1 с указанным именем;

  • трижды вызвать функцию 2: с именем указанного в ответе на запрос файла, а также с каждым из файлов, созданных в функции 1; отобразить результаты расчетов.

import os

from M1 import func1, func2

def main():
    while True:
        filename = input("Исходный файл: ")
        if os.path.exists(filename):
            break
        print("Нет такого файла...")

        KK = float(input("Введите пороговое значение K: "))
        data = func1(filename, KK)

        x = filename.split('.')[0]

        print("CТАТИСТИКИ")
        print("1. Исходный файл: ", func2(filename))
        print("2. Выше порога: ", func2(x + '1.txt'))
        print("3. Ниже порога: ", func2(x + '2.txt'))

        return data

Создайте модуль М0 - главную программу, которая вызывает М2, отображает исходные данные в виде графика и записывает их в бинарный файл RES2a.bin.

import M2
import matplotlib.pyplot as plt
import pickle

if __name__ == "__main__":
    data = M2.main()
    
	print("ГРАФИК:")

	plt.figure(figsize=(12, 5))
	plt.plot(numbers)
	plt.axhline(y=k, color='r')
	plt.title(f"Данные из файла: {filename}")
	plt.xlabel("Номер элемента")
	plt.ylabel("Значение")
	plt.grid(True)
	plt.show()

    with open("Res2a.bin", 'wb') as f:
        pickle.dump(data, f)                  

Подготовьте файл с не менее, чем с 20 числовыми значениями с разным числом элементов на разных строках и проверьте с ним разработанную программу. Создала файл datatest.txt с содержимым

10 20 30 20
22 33
60 70 80 90 
15 23 25 27 76
5 12 34 67 36

Результат работы программы

Введите имя файла (например: data.txt): datatest.txt
Введите пороговое значение K: 23

СТАТИСТИКИ:
1. Исходный файл: Среднее: 37.75, Медиана: 28.50, Мин: 5.00, Макс: 90.00, Отклонение: 26.02
2. Выше порога:   Среднее: 52.33, Медиана: 48.00, Мин: 25.00, Макс: 90.00, Отклонение: 23.73
3. Ниже порога:   Среднее: 15.88, Медиана: 17.50, Мин: 5.00, Макс: 23.00, Отклонение: 6.45

ГРАФИК:
Данные сохранены в файл 'Res2a.bin'

Скриншот построенного графика

Содержимое файла above:

30.0
33.0
60.0
70.0
80.0
90.0
25.0
27.0
76.0
34.0
67.0
36.0

Содержимое файла below:

10.0
20.0
20.0
22.0
15.0
23.0
5.0
12.0