diff --git a/TEMA9/MOD0.py b/TEMA9/MOD0.py new file mode 100644 index 0000000..9698371 --- /dev/null +++ b/TEMA9/MOD0.py @@ -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)}") 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..f34b9cf --- /dev/null +++ b/TEMA9/MOD2.py @@ -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() diff --git a/TEMA9/RES2a.bin b/TEMA9/RES2a.bin new file mode 100644 index 0000000..ec3ba1c Binary files /dev/null and b/TEMA9/RES2a.bin differ 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/data1.txt b/TEMA9/data1.txt new file mode 100644 index 0000000..d1112f0 --- /dev/null +++ b/TEMA9/data1.txt @@ -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 \ No newline at end of file diff --git a/TEMA9/data2.txt b/TEMA9/data2.txt new file mode 100644 index 0000000..0c8ff6b --- /dev/null +++ b/TEMA9/data2.txt @@ -0,0 +1 @@ +5.2 8.9 3.1 \ No newline at end of file diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..9ef8be2 --- /dev/null +++ b/TEMA9/test.md @@ -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 +```