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

179 строки
6.7 KiB
Markdown

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

# Выполнение модульного задания
Филиппов Даниил Юрьевич, А-01-23
# Задание
M3_2
1) Создайте модуль М1, содержащий две функции:
- функция 1: аргументы - имя текстового файла с числовыми данными (может быть разное число значений на каждой строке) и пороговое значение КК; считываются значения из указанного файла и записываются в два новых текстовых файла, имена которых совпадают с именем входного файла с добавлением 1 и 2 - в первый файл записываются значения, превышающие заданный порог, а во второй - не превышающие его. Исходные данные в виде списка возвращаются в вызывающую программу;
- функция 2: аргумент - имя текстового файла с исходными данными; считываются значения из указанного файла, формируются в виде списка и по нему рассчитываются: среднее, медиана, наименьшее и наибольшее значения, стандартное отклонение - это возвращаемые результаты функции.
2) Создайте еще один модуль М2, в котором должны:
- запрашиваться имя файла с исходными данными, проверяться его наличие и при отсутствии - повторение запроса;
- запрос порогового значения КК;
- вызов функции 1 с указанным именем;
- трижды вызвать функцию 2: с именем указанного в ответе на запрос файла, а также с каждым из файлов, созданных в функции 1; отобразить результаты расчетов.
3) Создайте модуль М0 - главную программу, которая вызывает М2, и записывает данные в бинарный файл RES2a.bin.
4) Подготовьте 2 файла с не менее, чем с 20 числовыми значениями с разным числом элементов на разных строках и проверьте с ними разработанную программу.
# Решение
1. Модуль MOD1.py
```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
```
2. Модуль MOD2.py
```py
import os
import MOD1
def process_file():
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')
file_2 = file.replace('.txt', '2.txt')
stats = []
read_1 = MOD1.func_2(file)
if read_1:
stats.append(('Исходный', read_1))
if os.path.exists(file_1):
read_2 = MOD1.func_2(file_1)
if read_2:
stats.append(('> KK', read_2))
if os.path.exists(file_2):
read_3 = MOD1.func_2(file_2)
if read_3:
stats.append(('≤ KK', read_3))
print("\nИсходный файл:")
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 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 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}")
return file, stats
```
3. Модуль MOD0.py
```py
import pickle
import MOD2
fname, stats_all = MOD2.process_file()
with open("RES2a.bin", 'wb') as f:
pickle.dump(stats_all, f)
print(f"Сохранено статистик: {len(stats_all)}")
```
4. Результаты
Для файла data.txt:
```py
>>> 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
```