SimankovBV 4 дней назад
Родитель 51f98ccafe
Сommit 5796188292

@ -0,0 +1,9 @@
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)}")

@ -0,0 +1,64 @@
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)
# Исправление деления на ноль
if len(numbers) <= 1:
if numbers:
x = numbers[0]
return x, x, x, x, 0.0
else:
return None
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

@ -0,0 +1,62 @@
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
if __name__ == "__main__":
process_file()

Двоичные данные
TEMA9/RES2a.bin

Двоичный файл не отображается.

@ -0,0 +1,6 @@
10.5 20.3 15.7 30.2
5.2 40.1 25.8
8.9 12.4 35.6 18.2 22.7
45.9 3.1 28.4
60.0 17.3 33.8
19.5 42.6

@ -0,0 +1 @@
10.5 20.3 15.7 30.2 40.1 25.8 12.4 35.6 18.2 22.7 45.9 28.4 60.0 17.3 33.8 19.5 42.6

@ -0,0 +1,178 @@
# Выполнение модульного задания
Симанков Б., А-02-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
```
Загрузка…
Отмена
Сохранить