ответвлено от main/python-labs
Tema9/test.md
Этот коммит содержится в:
16
TEMA9/MOD0.py
Обычный файл
16
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)} чисел")
|
||||
64
TEMA9/MOD1.py
Обычный файл
64
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
|
||||
45
TEMA9/MOD2.py
Обычный файл
45
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}")
|
||||
3
TEMA9/dat.txt
Обычный файл
3
TEMA9/dat.txt
Обычный файл
@@ -0,0 +1,3 @@
|
||||
100 200 300 400 500
|
||||
150 250 350 450
|
||||
50 550 650
|
||||
6
TEMA9/data.txt
Обычный файл
6
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
|
||||
167
TEMA9/test.md
Обычный файл
167
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 чисел
|
||||
```
|
||||
|
||||
Ссылка в новой задаче
Block a user