ответвлено от main/python-labs
fix test.md
Этот коммит содержится в:
123
TEMA8/test.md
123
TEMA8/test.md
@@ -3,42 +3,121 @@
|
||||
|
||||
## Задание
|
||||
```
|
||||
#2 (из ЛР№7)
|
||||
Разработайте функцию с 4 аргументами, создающую последовательность отсчетов случайного, нормально распределенного сигнала типа белого шума с заданными параметрами: математическое ожидание и дисперсия, число отсчетов (аргументы функции). Сигнал должен быть записан построчно, по 3 элемента в строке с разделителем - пробел в текстовый файл с заданным именем (4-й аргумент функции), а также возвращен в вызывающую программу в виде списка.
|
||||
#7
|
||||
1) Создайте модуль М1, содержащий две функции:
|
||||
|
||||
Дополнительно: раскидать ввод параметров в один .py файл, выполнение функции в другой .py файл
|
||||
- функция 1: аргументы - три целочисленных параметра: Т1, Т2 и М; функция должна рассчитать и вернуть список СС с М неповторяющимися целыми числами в интервале значений между Т1 и Т2;
|
||||
|
||||
- функция 2: аргументы - список СС с неповторяющимися целыми числами и список или кортеж КК с целыми числами; функция должна создать список НН, с числом элементов, равным длине СС, и с целыми значениями из КК, близкими к соответствующим элементам в СС; так, элемент КК[i] считается близким к элементу CC[j], если для него абсолютная разность |KK[i]-CC[j]| - наименьшая по всем CC[j].
|
||||
|
||||
2) Создайте еще один модуль М2, в котором должны выполняться операции:
|
||||
|
||||
- запрашиваются у пользователя целочисленные границы диапазона значений Т1 и Т2; проверяется T1<T2 и, если это не выполняется - запрос повторяется;
|
||||
|
||||
- запрашивается у пользователя целое число М - число значений в списке СС; если М>(T2-T1), то принимается М=Т2-Т1;
|
||||
|
||||
- с помощью функции 1 создается и отображается список СС;
|
||||
|
||||
- создается список КК с 500 случайными целыми числами в диапазоне значений от Т1 до Т2;
|
||||
|
||||
- с помощью функции 2 рассчитывается список НН; результат отображается на экране.
|
||||
|
||||
3) Создайте модуль М0 - главную программу, которая вызывает М2 и записывает списки КК, СС и НН в бинарный файл Res1212.bin.
|
||||
|
||||
4) Проверьте программу при двух наборах исходных данных:
|
||||
|
||||
- Т1=34, Т2=78, М= 10
|
||||
|
||||
- Т1=25, Т2=30, М=8.
|
||||
```
|
||||
|
||||
## Решение
|
||||
|
||||
### Файл input_data.py
|
||||
### Файл M2.py
|
||||
```py
|
||||
filename = input('Enter filename: ')
|
||||
mean = float(input('Enter mean: '))
|
||||
dispersia = float(input('Enter dispersia: '))
|
||||
count = int(input('Enter count: '))
|
||||
from typing import Tuple
|
||||
import random
|
||||
from M1 import func1, func2
|
||||
|
||||
|
||||
def _input_int(prompt: str) -> int:
|
||||
s = input(prompt)
|
||||
return int(s)
|
||||
|
||||
|
||||
def _input_range_t1_t2() -> Tuple[int, int]:
|
||||
while True:
|
||||
t1 = _input_int("T1: ")
|
||||
t2 = _input_int("T2: ")
|
||||
if t1 < t2:
|
||||
return t1, t2
|
||||
|
||||
|
||||
def main():
|
||||
t1, t2 = _input_range_t1_t2()
|
||||
|
||||
m = _input_int("m: ")
|
||||
max_m = t2 - t1
|
||||
if m > max_m:
|
||||
m = max_m
|
||||
|
||||
CC = func1(t1, t2, m)
|
||||
KK = [random.randint(t1, t2) for i in range(500)]
|
||||
|
||||
HH = func2(CC, KK)
|
||||
print("HH:", HH)
|
||||
return CC, KK, HH
|
||||
|
||||
```
|
||||
|
||||
### Файл file_with_func.py
|
||||
### Файл M1.py
|
||||
```py
|
||||
from random import gauss
|
||||
import math
|
||||
from typing import List, Union, Tuple
|
||||
from random import sample
|
||||
|
||||
def func(mean, dispersia, count):
|
||||
otklonenye = math.sqrt(dispersia)
|
||||
samples = [gauss(mean, otklonenye) for i in range(count)]
|
||||
|
||||
return samples
|
||||
def func1(T1: int, T2: int, M: int) -> List[int]:
|
||||
CC = sample(range(T1, T2+1), M)
|
||||
return CC
|
||||
|
||||
from typing import List, Tuple, Union
|
||||
|
||||
def func2(CC: List[int], KK: Union[Tuple[int, ...], List[int]]) -> List[int]:
|
||||
HH = []
|
||||
KK = list(KK)
|
||||
|
||||
for c in CC:
|
||||
nearest = min(KK, key=lambda x: abs(x - c))
|
||||
HH.append(nearest)
|
||||
|
||||
return HH
|
||||
```
|
||||
|
||||
### Файл test.py
|
||||
### Файл M0.py
|
||||
```py
|
||||
from input_data import *
|
||||
from file_with_func import func
|
||||
import pickle
|
||||
import M2
|
||||
|
||||
samples = func(mean, dispersia, count)
|
||||
|
||||
with open(filename, 'w') as f:
|
||||
for i in range(0, count, 3):
|
||||
f.write(''.join(f"{' '.join(map(lambda x: str(x), samples[i:i+3]))}\n"))
|
||||
def main():
|
||||
CC, KK, HH = M2.main()
|
||||
|
||||
data = {
|
||||
"CC": CC,
|
||||
"KK": KK,
|
||||
"HH": HH,
|
||||
}
|
||||
|
||||
with open("Res1212.bin", "wb") as f:
|
||||
pickle.dump(data, f)
|
||||
|
||||
main()
|
||||
```
|
||||
|
||||
### Вывод
|
||||
```py
|
||||
>>> T1: 34
|
||||
>>> T2: 78
|
||||
>>> m: 10
|
||||
HH: [48, 75, 60, 69, 70, 45, 63, 59, 66, 38]
|
||||
```
|
||||
Ссылка в новой задаче
Block a user