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

6.8 KiB

Выполнение модульного задания

Филиппов Даниил Юрьевич, А-01-23

Задание

M3_2

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

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

Решение

  1. Модуль MOD1.py
def func_1 (file, KK):
    """"Разделение чисел на два файла по пороговому значению KK"""
    numbers=[]
    with open(file, 'r') as f:
        for line in f:
            parts=line.split()
            for x in parts:
                 num=float(x)
                 numbers.append(num)
    file_1=[]
    file_2=[]
    for x in numbers:
         if x>KK:
             file_1.append(x)
         else:
             file_2.append(x)
    name_1=file.replace('.txt', '1.txt')
    name_2=file.replace('.txt', '2.txt')
    with open(name_1, 'w') as f:
         for x in file_1:
             f.write(f"{x} ")
    with open(name_2, 'w') as f:
         for x in file_2:
             f.write(f"{x} ")
    return numbers

def func_2 (file):
    import statistics
    import math
    numbers=[]
    with open(file, 'r') as f:
        for line in f:
            parts=line.split()
            for x in parts:
                num=float(x)
                numbers.append(num)
    sred=sum(numbers)/len(numbers)
    mediana = statistics.median(numbers)
    minimum = min(numbers)
    maximum = max(numbers)
    sum_kvadratov = 0
    for x in numbers:
        kvadrat = (x-sred)*(x-sred)
        sum_kvadratov+=kvadrat
    std=math.sqrt(sum_kvadratov/(len(numbers)-1))
    return sred, mediana, minimum, maximum, std

  1. Модуль MOD2.py
import os
while True:

   file = input("Введите имя файла: ")
   if os.path.exists(file):
       break
   print("Такого файла нет!")


KK=float(input("Пороговое значение KK: "))
MOD1.func_1(file, KK)
file_1 = file.replace('.txt', '1.txt')  # Файл с числами > KK
file_2 = file.replace('.txt', '2.txt')  # Файл с числами ≤ KK
print("\nИсходный файл:")
read_1 = MOD1.func_2(file)
if read_1:
  a, b, c, d, e = read_1
  print(f"   Среднее: {a:.2f}")
  print(f"   Медиана: {b:.2f}")
  print(f"   От {c:.2f} до {d:.2f}")
  print(f"   Отклонение: {e:.2f}")
else:
   print("   Не удалось рассчитать статистику")

print("\n Файл с числами > KK:")
if os.path.exists(file_1):
   read_2 = MOD1.func_2(file_1)
   if read_2:
       a, b, c, d, e = read_2
       print(f"   Среднее: {a:.2f}")
       print(f"   Медиана: {b:.2f}")
       print(f"   От {c:.2f} до {d:.2f}")
       print(f"   Отклонение: {e:.2f}")

print("\n Файл с числами ≤ KK:")
if os.path.exists(file_2):  
   read_3 = MOD1.func_2(file_2)  
   if read_3:
       a, b, c, d, e = read_3  
       print(f"   Среднее: {a:.2f}")
       print(f"   Медиана: {b:.2f}")
       print(f"   От {c:.2f} до {d:.2f}")
       print(f"   Отклонение: {e:.2f}")
  1. Модуль MOD0.py
import MOD2
import pickle
import MOD1

fname = input("Исходный файл из MOD2: ")
fname1 = fname.replace('.txt', '1.txt')  
fname2 = fname.replace('.txt', '2.txt')  

stats_all = []
stats1 = MOD1.func_2(fname)
if stats1:
    stats_all.append(('Исходный', stats1))

stats2 = MOD1.func_2(fname1) if stats1 else None
if stats2:
    stats_all.append(('> KK', stats2))

stats3 = MOD1.func_2(fname2) if stats1 else None
if stats3:
    stats_all.append(('≤ KK', stats3))

with open("RES2a.bin", 'wb') as f:
    pickle.dump(stats_all, f)

print(f"Сохранено статистик: {len(stats_all)}")
  1. Результаты Для файла data.txt:
>>> import MOD0
Введите имя файла: data.txt
Пороговое значение KK: 10

Исходный файл:
   Среднее: 24.81
   Медиана: 21.50
   От 3.10 до 60.00
   Отклонение: 14.83

Файл с числами > KK:
   Среднее: 28.18
   Медиана: 25.80
   От 10.50 до 60.00
   Отклонение: 13.41

Файл с числами  KK:
   Среднее: 5.73
   Медиана: 5.20
   От 3.10 до 8.90
   Отклонение: 2.94
Исходный файл из MOD2: data.txt
Сохранено статистик: 3