From 1fd501419727a437115ae277fedd124f623c004a Mon Sep 17 00:00:00 2001 From: "FilippovDY (FilippovDY)" Date: Mon, 8 Dec 2025 11:49:30 +0300 Subject: [PATCH] Tema9/test.md --- TEMA9/MOD0.py | 16 +++++ TEMA9/MOD1.py | 64 +++++++++++++++++++ TEMA9/MOD2.py | 45 +++++++++++++ TEMA9/dat.txt | 3 + TEMA9/data.txt | 6 ++ TEMA9/test.md | 167 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 301 insertions(+) create mode 100644 TEMA9/MOD0.py create mode 100644 TEMA9/MOD1.py create mode 100644 TEMA9/MOD2.py create mode 100644 TEMA9/dat.txt create mode 100644 TEMA9/data.txt create mode 100644 TEMA9/test.md diff --git a/TEMA9/MOD0.py b/TEMA9/MOD0.py new file mode 100644 index 0000000..25e2ccb --- /dev/null +++ b/TEMA9/MOD0.py @@ -0,0 +1,16 @@ +import MOD2 +import pickle + +filename = input("Введите имя файла для сохранения в бинарный: ") + +numbers = [] +with open(filename, 'r') as f: + for line in f: + for x in line.split(): + numbers.append(float(x)) + +with open("RES2a.bin", 'wb') as f: + pickle.dump(numbers, f) + +print(f"\nДанные сохранены в RES2a.bin") +print(f"Записано {len(numbers)} чисел") diff --git a/TEMA9/MOD1.py b/TEMA9/MOD1.py new file mode 100644 index 0000000..07facd0 --- /dev/null +++ b/TEMA9/MOD1.py @@ -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 diff --git a/TEMA9/MOD2.py b/TEMA9/MOD2.py new file mode 100644 index 0000000..d8709dd --- /dev/null +++ b/TEMA9/MOD2.py @@ -0,0 +1,45 @@ +import os +import MOD1 + +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') + +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}") diff --git a/TEMA9/dat.txt b/TEMA9/dat.txt new file mode 100644 index 0000000..55d4c0b --- /dev/null +++ b/TEMA9/dat.txt @@ -0,0 +1,3 @@ +100 200 300 400 500 +150 250 350 450 +50 550 650 \ No newline at end of file diff --git a/TEMA9/data.txt b/TEMA9/data.txt new file mode 100644 index 0000000..cdfc855 --- /dev/null +++ b/TEMA9/data.txt @@ -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 \ No newline at end of file diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..1856071 --- /dev/null +++ b/TEMA9/test.md @@ -0,0 +1,167 @@ + # Выполнение модульного задания +Филиппов Даниил Юрьевич, А-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 +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}") +``` + + +3. Модуль MOD0.py +```py +import MOD2 +import pickle +filename = input("Введите имя файла для сохранения в бинарный: ") +numbers = [] +with open(filename, 'r') as f: + for line in f: + for x in line.split(): + numbers.append(float(x)) +with open("RES2a.bin", 'wb') as f: + pickle.dump(numbers, f) + +print(f"\nДанные сохранены в RES2a.bin") +print(f"Записано {len(numbers)} чисел") +``` + + +4. Результаты +Для файла data.txt: +```py +import MOD0 +Введите имя файла: data.txt +Пороговое значение KK: 12 +Исходный файл: + Среднее: 24.81 + Медиана: 21.50 + От 3.10 до 60.00 + Отклонение: 14.83 + +Файл с числами > KK: + Среднее: 29.28 + Медиана: 27.10 + От 12.40 до 60.00 + Отклонение: 13.02 + +Файл с числами ≤ KK: + Среднее: 6.92 + Медиана: 7.05 + От 3.10 до 10.50 + Отклонение: 3.38 +Введите имя файла для сохранения в бинарный: data.txt +Данные сохранены в RES2a.bin +Записано 20 чисел +``` +