Сравнить коммиты

..

13 Коммитов

Автор SHA1 Сообщение Дата
2186d86136 ikz 2025-12-19 12:27:43 +03:00
0273a16f88 okz red 2025-12-19 10:34:12 +03:00
5f8f58afdd ред ИКЗ 2025-12-19 07:19:43 +00:00
52c4726de8 ИКЗ ред 2025-12-19 07:17:04 +00:00
85e9c6daa2 ikz 2025-12-19 10:15:51 +03:00
35322e8142 okz 2025-12-19 02:04:07 +03:00
914f5bc920 Merge branch 'main' of http://uit.mpei.ru/git/TabolinIA/python-labs 2025-12-18 21:58:23 +03:00
1c3efa7980 report 2025-12-18 21:58:02 +03:00
f26da7aa8f редакция отчета 2025-12-08 08:53:49 +00:00
96f4fbc1b4 ИКЗ 2025-12-08 11:44:04 +03:00
fdf672b8b7 редакция отчета 2025-12-08 07:47:12 +00:00
0f9aaccdb4 редакция отчета 2025-12-08 06:42:27 +00:00
5582a02246 редакция отчета 2025-12-08 06:41:34 +00:00
23 изменённых файлов: 898 добавлений и 0 удалений

Просмотреть файл

@@ -201,6 +201,7 @@ func()
Функция `func()` определена вторым определением, так как `typ_fun=8 != 1`.
## 4. Аргументы функции.
## 4.1. Использование функции в качестве аргумента другой функции.
Это делает код более гибким, не привязывает функцию к конкретной операции, а позволяет выполнять разные операции внутри функции.
```py
def fun_arg(fff,a,b,c):
"""fff-имя функции, используемой
@@ -235,6 +236,7 @@ qq=slozh(*b1234)
print(qq)
[1, 2, -1, -2, 0, 2, -1, 1]
```
Функция `slozh` ожидает четыре аргумента, поэтому нам надо "распаковать" список на четыре переменные
## 4.5. Аргументы функции содержатся в словаре.
```py
dic4={"a1":1,"a2":2,"a3":3,"a4":4}
@@ -242,9 +244,11 @@ qqq=slozh(**dic4)
print(qqq)
10
```
`**` - оператор распаковки словаря.
## 4.6. Смешанные ссылки.
```py
e1=(-1,6);dd2={'a3':3,'a4':9}
qqqq=slozh(*e1,**dd2)
print(qqqq)
17
```

33
TEMA7/test.md Обычный файл
Просмотреть файл

@@ -0,0 +1,33 @@
# Индивидуальное контрольное задание по Теме 7
Таболин Иван, А-01-23
Вариант 3
## Задание
Разработайте функцию с 4 аргументами, создающую последовательность отсчетов случайного, равномерно распределенного сигнала типа белого шума с заданными параметрами: границы диа-пазона изменения, число отсчетов (аргументы функции). Сигнал должен быть записан построчно, по 3 элемента в строке с разделителем - запятая в текстовый файл с заданным именем (4-й аргумент функции), а также возвращен в вызывающую программу в виде списка.
## Решение
```py
def bel_shum(a_min,a_max,k,file_name):
"""Генератор белого шума
a_min,a_max - границы диапазона изменения сигнала
k - количество отсчетов
file_name - имя файла для вывода сигнала"""
import random as rn
signal=[]
for i in range(k):
a=a_min+(a_max-a_min)*rn.random()
signal.append(a)
f=open(file_name,'w')
i=0
while i<len(signal):
s=signal[i:i+3]
out=','.join(str(n) for n in s)
f.write(out+'\n')
i+=3
f.close()
return signal
bel_shum(0,1,20,'test1.txt')
[0.6121303296306144, 0.6412641200633369, 0.11685946114651469, 0.45963383247709144, 0.1396119953149234, 0.9774252470424362, 0.8214083524197986, 0.3712680592177061, 0.7679917358701837, 0.10872526758897305, 0.7277044250338426, 0.5584257054824748, 0.903225844909946, 0.7162949601167093, 0.37602800658438673, 0.7390155718732525, 0.3665326143981362, 0.8660301445143191, 0.8605103393087415, 0.8265277945070508]
bel_shum(1,5,35,'test2.txt')
[2.044262095730901, 2.9460771147067106, 3.4488422163718373, 4.501325827244864, 3.0908516348657415, 2.2486766582618416, 1.8541368543777854, 4.671136588954065, 2.0377889808927616, 2.907799881297287, 4.185430806328185, 1.3106392123128479, 1.4406582567850679, 3.066287739535445, 2.050387519395883, 2.769661281833263, 1.9383764782362034, 1.1036168746115131, 1.4156131808765569, 2.79017367419333, 3.8290609294438225, 4.342915598480614, 3.371713892072644, 2.866840758354854, 3.229631214986825, 3.671877264456392, 2.258566569052188, 3.821614716506629, 2.128574963495442, 1.8828706347794855, 2.279448934161789, 3.8514469999377954, 4.172031075019252, 3.8783957015255783, 1.2633531800325009]
```

7
TEMA7/test1.txt Обычный файл
Просмотреть файл

@@ -0,0 +1,7 @@
0.6121303296306144,0.6412641200633369,0.11685946114651469
0.45963383247709144,0.1396119953149234,0.9774252470424362
0.8214083524197986,0.3712680592177061,0.7679917358701837
0.10872526758897305,0.7277044250338426,0.5584257054824748
0.903225844909946,0.7162949601167093,0.37602800658438673
0.7390155718732525,0.3665326143981362,0.8660301445143191
0.8605103393087415,0.8265277945070508

12
TEMA7/test2.txt Обычный файл
Просмотреть файл

@@ -0,0 +1,12 @@
2.044262095730901,2.9460771147067106,3.4488422163718373
4.501325827244864,3.0908516348657415,2.2486766582618416
1.8541368543777854,4.671136588954065,2.0377889808927616
2.907799881297287,4.185430806328185,1.3106392123128479
1.4406582567850679,3.066287739535445,2.050387519395883
2.769661281833263,1.9383764782362034,1.1036168746115131
1.4156131808765569,2.79017367419333,3.8290609294438225
4.342915598480614,3.371713892072644,2.866840758354854
3.229631214986825,3.671877264456392,2.258566569052188
3.821614716506629,2.128574963495442,1.8828706347794855
2.279448934161789,3.8514469999377954,4.172031075019252
3.8783957015255783,1.2633531800325009

1
TEMA8/IKZ_output.txt Обычный файл
Просмотреть файл

@@ -0,0 +1 @@
x[i] | y[i]

10
TEMA8/Mod1_IKZ.py Обычный файл
Просмотреть файл

@@ -0,0 +1,10 @@
# Mod1
# Функция
def preob(x, A):
max_i=int(A*x)
for i in range(1, max_i+1):
if i*A<=x and x<(i+1)*A:
return i
elif -(i+1)*A>=x and x>(-i)*A:
return -i
return 0

16
TEMA8/Mod2_IKZ.py Обычный файл
Просмотреть файл

@@ -0,0 +1,16 @@
# Mod2
# Генерация входных данных и применение функции
import random as rn
from Mod1_IKZ import preob
x=[]
for i in range(100):
x.append(rn.triangular(-5,25))
y=[]
for i in range(len(x)):
y.append(preob(x[i],1))
filename=input('Введите имя файла:')
file=open(filename,'w')
for i in range(len(x)):
s=str(x[i])+' '+str(y[i]) + '\n'
file.write(s)
file.close()

Просмотреть файл

@@ -80,6 +80,7 @@ Mod1:Значение perm1= 12
Mod1.perm1
'35'
```
`exec()` пытается прочитать файл в кодировке `UTF-8`.
## 2.4. Использование инструкции `from ... import ...`.
Пример 1.
```py

47
TEMA8/test.md Обычный файл
Просмотреть файл

@@ -0,0 +1,47 @@
# Индивидуальное контрольное задание по Теме 8
Таболин Иван, А-01-23
Вариант 7
## Задание
По указанному преподавателем варианту контрольного задания
обратитесь к индивидуальному заданию с таким номером в теме 7,
разработайте функцию, на ее основе создайте модуль.
Создайте второй модуль, в котором должны быть инструкции для ввода/создания
исходных данных для проверки работы функции, вызов функции и отображение полученных результатов.
Вариант 7 из ИКЗ по Теме 7
Разработайте функцию с 2 параметрами: х и А, реализующую преобразование входного сигнала x по формуле: y=i, если i*A<=x<(i+1)*A, y=-i, если -(i+1)*A>=x>-i*A, где i принимает значения от 1 до А*х. Если не выполнится ни одно из неравенств ни при каком i, то y=0. Создайте список со 100 значениями входного сигнала х – случайными, треугольно (triangular) распределенными числами в диапазоне значений от -5 до 25. Для элементов списка с помощью функции рассчитайте список со значениями выходного сигнала y при А=1. Записать результаты в текстовый файл в виде двух столбцов: хi, yi.
## Решение
Модуль 1
```py
# Mod1
# Функция
def preob(x, A):
max_i=int(A*x)
for i in range(1, max_i+1):
if i*A<=x and x<(i+1)*A:
return i
elif -(i+1)*A>=x and x>(-i)*A:
return -i
return 0
```
Модуль 2
```py
# Mod2
# Генерация входных данных и применение функции
import random as rn
from Mod1_IKZ import preob
x=[]
for i in range(100):
x.append(rn.triangular(-5,25))
y=[]
for i in range(len(x)):
y.append(preob(x[i],1))
filename=input('Введите имя файла:')
file=open(filename,'w')
file.write('x[i] y[i]')
for i in range(len(x)):
s=str(x[i])+' '+str(y[i]) + '\n'
file.write(s)
file.close()
```

100
TEMA8/test_out.txt Обычный файл
Просмотреть файл

@@ -0,0 +1,100 @@
19.83763113980755 19
16.683519633109245 16
9.613937932157592 9
4.963017908969933 4
9.660130026497008 9
4.192677427076193 4
2.8042897405957676 2
7.004180515732655 7
13.593516894395366 13
10.38778089627398 10
23.524552246854263 23
10.408378867939485 10
12.11908886265757 12
13.722587336888672 13
9.599035410843936 9
16.182722607179095 16
15.960737898669425 15
20.453332281292724 20
9.351758251975712 9
4.715296915378227 4
21.713766919024486 21
0.5766163127695902 0
8.764382760761023 8
7.023206736247321 7
10.380398342708045 10
14.71079199542745 14
9.327675742027745 9
6.379809079109103 6
6.478312277893931 6
0.9453591189849897 0
17.810398025399493 17
9.500089559677443 9
10.206335274636286 10
13.119123320799352 13
12.152291629686335 12
17.672173423083027 17
-1.3318207939976006 0
16.201396905672105 16
6.813514064477367 6
9.386637502670942 9
6.829696632809032 6
-2.358188970070025 0
-1.8953657622144822 0
12.163997113559677 12
16.246743920828237 16
18.082861735802094 18
8.161677718632582 8
13.096553199692709 13
3.4793080092423683 3
14.410061733084142 14
2.8415355967140616 2
7.827245427286652 7
-0.2683352964665069 0
2.5318198114412107 2
14.741462609540093 14
9.309479183851334 9
8.719026442686971 8
15.097020825961328 15
20.836394245081628 20
9.664289544985778 9
0.8788652718512342 0
12.801681925869698 12
9.221793961478204 9
7.473865176092325 7
8.93244222349147 8
21.276485422746923 21
0.9186139053532276 0
15.614780434508106 15
23.72548157518309 23
2.286817323138184 2
9.39166993120276 9
17.54026543856295 17
15.96232105645722 15
17.402341242065198 17
8.064826473440498 8
13.969534898590881 13
2.7987177875076386 2
11.604604823060031 11
11.307488847855737 11
11.683304043759009 11
9.924038399834346 9
10.638645358046208 10
6.594015975799261 6
0.02987019195388818 0
2.9540472170256677 2
4.273258511639778 4
14.616967538004785 14
13.722438873502576 13
19.81038211300028 19
7.99574094616143 7
4.330799633595037 4
19.54150269676732 19
8.165940914694414 8
14.33141467468756 14
22.697364809616474 22
14.472567937917809 14
4.509353418534642 4
12.138577182051138 12
5.911408597590821 5
3.303353684790464 3

11
TEMA9/Mod0.py Обычный файл
Просмотреть файл

@@ -0,0 +1,11 @@
# Модуль 0
import Mod2
import matplotlib.pyplot as plt
sps1, sps2 = Mod2.read_file()
plt.plot(sps1)
plt.title('График sps1')
plt.grid(True)
plt.show()

38
TEMA9/Mod1.py Обычный файл
Просмотреть файл

@@ -0,0 +1,38 @@
# Модуль 1
import math
def func1(t1, t2):
"""Объединяет два кортежа и сортирует"""
sps1 = []
sps2 = []
for x in t1:
sps1.append(x)
sps2.append(1)
for x in t2:
sps1.append(x)
sps2.append(2)
spis3 = list(zip(sps1, sps2))
spis3.sort(key=lambda x: x[0])
sps1_sorted = [x[0] for x in spis3]
sps2_sorted = [x[1] for x in spis3]
return sps1_sorted, sps2_sorted
def func2(spis):
"""Вычисляет статистики списка"""
sred = sum(spis) / len(spis)
mini = min(spis)
maxi = max(spis)
spis_sorted = sorted(spis)
n = len(spis_sorted)
if n % 2 == 1:
med = spis_sorted[n // 2]
else:
med = (spis_sorted[n // 2 - 1] + spis_sorted[n // 2]) / 2
if len(spis) > 1:
kv_sum = sum((x - sred) ** 2 for x in spis)
std = math.sqrt(kv_sum / (len(spis) - 1))
else:
std = 0
return sred, mini, maxi, med, std

31
TEMA9/Mod2.py Обычный файл
Просмотреть файл

@@ -0,0 +1,31 @@
# Модуль 2
import pickle
import os
import Mod1
def read_file():
while True:
file_name = input("Введите имя файла: ")
if os.path.exists(file_name):
break
print("Файл не найден! Попробуйте снова.")
with open(file_name, 'rb') as f:
KRT1, KRT2 = pickle.load(f)
sps1, sps2 = Mod1.func1(KRT1, KRT2)
print("SPS1:", sps1)
print("SPS2:", sps2)
sred, mini, maxi, med, std = Mod1.func2(sps1)
print('Статистики SPS1:')
print("Среднее:" ,sred)
print("Минимум:", mini)
print("Максимум:", maxi)
print("Медиана:", med)
print("Ст.отклонение:", std)
with open('Res22.txt', 'w') as f:
f.write("sps1 sps2\n")
for i in range(len(sps1)):
f.write(str(sps1[i]))
f.write(' ')
f.write(str(sps2[i]))
f.write('\n')
return sps1, sps2

11
TEMA9/Mod3.py Обычный файл
Просмотреть файл

@@ -0,0 +1,11 @@
# Модуль 3
class Class1:
def zad_zn(self,znach):
self.data=znach
def otobraz(self):
print(self.data)
class Class2(Class1):
def otobraz(self):
print('значение =',self.data)
def otobraz(objekt):
print('значение объекта =',objekt)

81
TEMA9/Res22.txt Обычный файл
Просмотреть файл

@@ -0,0 +1,81 @@
sps1 sps2
20 1
20 2
21 1
21 1
21 2
21 2
25 1
25 1
25 1
25 1
25 1
25 2
25 2
25 2
25 2
25 2
26 1
26 1
26 2
26 2
29 1
29 2
30 1
30 1
30 2
30 2
31 1
31 1
31 1
31 1
31 1
31 2
31 2
31 2
31 2
31 2
32 1
32 1
32 2
32 2
34 1
34 1
34 1
34 1
34 2
34 2
34 2
34 2
36 1
36 2
37 1
37 2
38 1
38 1
38 1
38 1
38 2
38 2
38 2
38 2
39 1
39 2
40 1
40 2
42 1
42 1
42 2
42 2
43 1
43 1
43 2
43 2
44 1
44 1
44 2
44 2
45 1
45 1
45 2
45 2

Двоичные данные
TEMA9/Ris1.png Обычный файл

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

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
TEMA9/Ris2.png Обычный файл

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

После

Ширина:  |  Высота:  |  Размер: 15 KiB

22
TEMA9/SAU.py Обычный файл
Просмотреть файл

@@ -0,0 +1,22 @@
# SAU
class SAU:
def __init__(self,zn_param):
self.param=zn_param
self.ypr=[0,0]
def zdn_zn(self,upr):
self.x=upr
def model(self):
def inerz(x,T,yy):
return (x+T*yy)/(T+1)
y0=self.x-self.ypr[1]*self.param[3] #Обр.связь с усилителем 2
y1=self.param[0]*y0 #Усилитель1
y2=inerz(y1,self.param[1],self.ypr[0]) #Инерционное звено1
y3=inerz(y2,self.param[2],self.ypr[1]) #Инерционное звено2
self.ypr[0]=y2
self.ypr[1]=y3
def otobraz(self):
print('y=',self.ypr[1])

Двоичные данные
TEMA9/input.bin Обычный файл

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

249
TEMA9/report.md Обычный файл
Просмотреть файл

@@ -0,0 +1,249 @@
# Отчет по Теме 9
Таболин Иван, А-01-23
## 1. Запуск и настройка рабочего каталога.
```py
import os
os.chdir('C:\\Users\\User\\Desktop\\python-labs\\TEMA9')
```
## 2. Создание классов и их наследников.
## 2.1. Создание автономного класса.
```py
class Class1:
def zad_zn(self,znach):
self.data=znach
def otobraz(self):
print(self.data)
z1=Class1()
z1
<__main__.Class1 object at 0x0000018646F32A50>
z2=Class1()
z1.zad_zn('экз. класса 1')
z2.zad_zn(-632.453)
z1.otobraz()
экз. класса 1
z2.otobraz()
-632.453
```
```py
z1.data='Новое значение атрибута у экз.1'
z1.otobraz()
Новое значение атрибута у экз.1
```
## 2.2. Создание класса-наследника.
```py
class Class2(Class1):
def otobraz(self):
print('значение =',self.data)
z3=Class2()
dir(z3)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'otobraz', 'zad_zn']
```
```py
z3.zad_zn('Совсем новое')
z3.otobraz()
значение = Совсем новое
```
Сработал метод класса `Class2`
```py
z1.otobraz()
Новое значение атрибута у экз.1
del z1,z2,z3
```
## 3. Использование классов, содержащихся в модулях.
Создан модуль `Mod3.py` с кодом
```py
# Модуль 3
class Class1:
def zad_zn(self,znach):
self.data=znach
def otobraz(self):
print(self.data)
class Class2(Class1):
def otobraz(self):
print('значение =',self.data)
def otobraz(objekt):
print('значение объекта =',objekt)
```
Далее работаем в командной строке
```py
from Mod3 import Class1
z4=Class1()
z4.otobraz()
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
z4.otobraz()
File "C:\Users\User\Desktop\python-labs\TEMA9\Mod3.py", line 6, in otobraz
print(self.data)
AttributeError: 'Class1' object has no attribute 'data'
```
```py
from Mod3 import Class1
z4=Class1()
z4.data='значение данного data у экз. 4'
z4.otobraz()
значение данного data у экз. 4
```
```py
import Mod3
z4=Mod3.Class2()
z4.zad_zn('класс из модуля')
z4.otobraz()
значение = класс из модуля
Mod3.otobraz('Объект')
значение объекта = Объект
```
## 4. Использование специальных методов.
```py
class Class3(Class2):
def __init__(self,znach):
self.data=znach
def __add__(self,drug_zn):
return Class3(self.data+drug_zn)
def zad_dr_zn(self,povtor):
self.data*=povtor
z5=Class3('abc')
z5.otobraz()
значение = abc
z6=z5+'def'
z6.otobraz()
значение = abcdef
z6.zad_dr_zn(3)
z6.otobraz()
значение = abcdefabcdefabcdef
```
## 5. Присоединение атрибутов к классу.
```py
dir(Class3)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'otobraz', 'zad_dr_zn', 'zad_zn']
Class3.fio='Иванов И.И.'
dir(Class3)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'fio', 'otobraz', 'zad_dr_zn', 'zad_zn']
'fio' in dir(Class3)
True
z7=Class3(123)
dir(z7)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobraz', 'zad_dr_zn', 'zad_zn']
dir(z7)==dir(Class3)
False
z7.rozden='1987'
dir(z7)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobraz', 'rozden', 'zad_dr_zn', 'zad_zn']
'rozden' in dir(z7)
True
'rozden' in dir(Class3)
False
```
## 6. Выявление родительских классов.
```py
Class3.__bases__
(<class '__main__.Class2'>,)
Class2.__bases__
(<class '__main__.Class1'>,)
Class1.__bases__
Class3.__mro__
(<class '__main__.Class3'>, <class '__main__.Class2'>, <class '__main__.Class1'>, <class 'object'>)
ZeroDivisionError.__mro__
(<class 'ZeroDivisionError'>, <class 'ArithmeticError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)
```
## 7. Создание свойства класса.
```py
class Class4:
def __init__(sam,znach):
sam.__prm=znach
def chten(sam):
return sam.__prm
def zapis(sam,znch):
sam.__prm=znch
def stiran(sam):
del sam.__prm
svojstvo=property(chten,zapis,stiran)
exempl=Class4(12)
exempl.svojstvo
12
exempl.svojstvo=45
print(exempl.svojstvo)
45
del exempl.svojstvo
exempl.svojstvo
Traceback (most recent call last):
File "<pyshell#113>", line 1, in <module>
exempl.svojstvo
File "<pyshell#106>", line 5, in chten
return sam.__prm
AttributeError: 'Class4' object has no attribute '_Class4__prm'
```
## 8. Пример.
Представление в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем.
Модуль `SAU.py`
```py
class SAU:
def __init__(self,zn_param):
self.param=zn_param
self.ypr=[0,0]
def zdn_zn(self,upr):
self.x=upr
def model(self):
def inerz(x,T,yy):
return (x+T*yy)/(T+1)
y0=self.x-self.ypr[1]*self.param[3] #Обр.связь с усилителем 2
y1=self.param[0]*y0 #Усилитель1
y2=inerz(y1,self.param[1],self.ypr[0]) #Инерционное звено1
y3=inerz(y2,self.param[2],self.ypr[1]) #Инерционное звено2
self.ypr[0]=y2
self.ypr[1]=y3
def otobraz(self):
print('y=',self.ypr[1])
```
Содержимое модуля `test_SAU.py` для тестирования программы
```py
###main_SAU
prm=[2.5,4,1.3,0.8] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь
from SAU import *
xx=[0]+[1]*20 #Входной сигнал – «ступенька»
SAUe=SAU(prm) # Создаём экземпляр класса
yt=[]
for xt in xx: # Прохождение входного сигнала
SAUe.zdn_zn(xt)
SAUe.model()
SAUe.otobraz()
yt.append(SAUe.ypr[1])
import pylab
pylab.plot(yt)
pylab.show()
```
Результат запуска теста
```py
y= 0.0
y= 0.2173913043478261
y= 0.4763705103969754
y= 0.686594887811293
y= 0.8199324616478645
y= 0.8837201137353929
y= 0.8994188484874774
y= 0.8892777072047301
y= 0.870097963179993
y= 0.8518346102696789
y= 0.8387499784485772
y= 0.8314204114211459
y= 0.8286051955249649
y= 0.8285656555914835
y= 0.8297915186846528
y= 0.8312697736438287
y= 0.8324765218921963
y= 0.8332456979978418
y= 0.8336163607592184
y= 0.8337101315489143
y= 0.833654237067147
```
![Выходной сигнал](Ris1.png)

81
TEMA9/task.md Обычный файл
Просмотреть файл

@@ -0,0 +1,81 @@
# Общее контрольное задание по Теме 9
Таболин Иван, А-01-23
## Задание
Создайте и запишите в модуль класс, содержащий следующие компоненты:
- конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамиилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения;
- метод для обеспечения операции повышения оклада сотрудника на заданное значение;
- метод для обеспечения перевода сотрудника из одного отдела в другой;
- метод для изменения должности сотрудника;
- свойство, содержащее перечень (список) поощрений сотрудника.
Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобразите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, изменения должности и оклада, объявления благодарности.
## Решение
```py
class Workers:
def __init__(self,fio='',otdel='',dolznost='',oklad=0):
self.fio=fio
self.otdel=otdel
self.dolznost=dolznost
self.oklad=oklad
self.__poos=[]
def pov_oklad(self,uvel):
self.oklad+=uvel
print('Сотрудник', self.fio, 'теперь имеет оклад', self.oklad)
return self.oklad
def perevod(self,new_otdel):
self.otdel=new_otdel
print('Сотрудник', self.fio, 'переведен в отдел', self.otdel)
return self.otdel
def new_dolznost(self,new_dolzn):
self.dolznost=new_dolzn
print('Сотрудник', self.fio, 'переведен на должность', self.dolznost)
return self.dolznost
@property
def view_poos(self):
print('Поощрения сотрудника', self.fio)
print(self.__poos)
return self.__poos
def add_poos(self, new_poos):
self.__poos.append(new_poos)
```
Тестирование
```py
worker1=Workers('TabolinIA','IVTI','bakalavr_3',2400)
worker2=Workers('BerezhkovDA','IVTI','bakalavr_3',2400)
print('ФИО:', worker1.fio,'\n', 'Должность:',worker1.dolznost,'\n', 'Институт:', worker1.otdel,'\n', 'Оклад (стипендия):', worker1.oklad)
ФИО: TabolinIA
Должность: bakalavr_3
Институт: IVTI
Оклад (стипендия): 2400
worker1.new_dolznost('bakalavr_4')
Сотрудник TabolinIA переведен на должность bakalavr_4
'bakalavr_4'
print('ФИО:', worker1.fio,'\n', 'Должность:',worker1.dolznost,'\n', 'Институт:', worker1.otdel,'\n', 'Оклад (стипендия):', worker1.oklad)
ФИО: TabolinIA
Должность: bakalavr_4
Институт: IVTI
Оклад (стипендия): 2400
worker2.perevod('GPI')
Сотрудник BerezhkovDA переведен в отдел GPI
'GPI'
worker2.pov_oklad(worker2.oklad*2)
Сотрудник BerezhkovDA теперь имеет оклад 7200
7200
print('ФИО:', worker2.fio,'\n', 'Должность:',worker2.dolznost,'\n', 'Институт:', worker2.otdel,'\n', 'Оклад (стипендия):', worker2.oklad)
ФИО: BerezhkovDA
Должность: bakalavr_3
Институт: GPI
Оклад (стипендия): 7200
worker1.add_poos('Благодарность 08.12.2025')
worker1.view_poos
Поощрения сотрудника TabolinIA
['Благодарность 08.12.2025']
```

129
TEMA9/test.md Обычный файл
Просмотреть файл

@@ -0,0 +1,129 @@
# Тест по Модулю 3
Таболин Иван, А-01-23
Вариант 10
## Задание
1) Создайте модуль М1, содержащий две функции:
- функция 1: аргументы - два кортежа с целочисленными элементами, не обязательно одинаковой длины; в функции должен быть составлены два списка: SPS1 с элементами из двух входных кортежей, причем элементы SPS1 должны быть упорядочены по возрастанию величины, а также список SPS2 с элементами, равными 1 или 2, причем значение 1 берется в том случае, если соответствующий элемент в SPS1 взят из первого кортежа, а значение 2 - если из второго;
- функция 2: аргумент - числовой список; по этому списку в функции должны быть вычислены среднее, наименьшее и наибольшее значения, медиана и оценка стандартного отклонения,
2) Создайте еще один модуль М2, в котором должны выполняться операции:
- запрашивается и вводится имя бинарного файла с данными; проверяется наличие файла и при отсутствии - повторение запроса;
- из указанного файла считываются два кортежа: KRT1 и KRT2.
- применяется функция 1 к этим двум кортежам и отображаются полученные списки;
- применяется функция 2 к списку SPS1 и отображаются результаты расчета;
- в текстовый файл с именем Res22.txt записываются результаты расчета по функции 1 так, чтобы в каждой строке был один элемент из SPS1 и один элемент из SPS2, разделенные пробелом.
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика полученный из функции 1 список SPS1.
4) Подготовьте бинарный файл с двумя кортежами, содержащими, соответственно, 40 и 50 случайных целочисленных элементов из диапазона значений от 20 до 45. Проверьте работу программы с этими данными.
## Решение
Модуль 1
```py
# Модуль 1
import math
def func1(t1, t2):
"""Объединяет два кортежа и сортирует"""
sps1 = []
sps2 = []
for x in t1:
sps1.append(x)
sps2.append(1)
for x in t2:
sps1.append(x)
sps2.append(2)
spis3 = list(zip(sps1, sps2))
spis3.sort(key=lambda x: x[0])
sps1_sorted = [x[0] for x in spis3]
sps2_sorted = [x[1] for x in spis3]
return sps1_sorted, sps2_sorted
def func2(spis):
"""Вычисляет статистики списка"""
sred = sum(spis) / len(spis)
mini = min(spis)
maxi = max(spis)
spis_sorted = sorted(spis)
n = len(spis_sorted)
if n % 2 == 1:
med = spis_sorted[n // 2]
else:
med = (spis_sorted[n // 2 - 1] + spis_sorted[n // 2]) / 2
if len(spis) > 1:
kv_sum = sum((x - sred) ** 2 for x in spis)
std = math.sqrt(kv_sum / (len(spis) - 1))
else:
std = 0
return sred, mini, maxi, med, std
```
Модуль 2
```py
# Модуль 2
import pickle
import os
import Mod1
def read_file():
while True:
file_name = input("Введите имя файла: ")
if os.path.exists(file_name):
break
print("Файл не найден! Попробуйте снова.")
with open(file_name, 'rb') as f:
KRT1, KRT2 = pickle.load(f)
sps1, sps2 = Mod1.func1(KRT1, KRT2)
print("SPS1:", sps1)
print("SPS2:", sps2)
sred, mini, maxi, med, std = Mod1.func2(sps1)
print('Статистики SPS1:')
print("Среднее:" ,sred)
print("Минимум:", mini)
print("Максимум:", maxi)
print("Медиана:", med)
print("Ст.отклонение:", std)
with open('Res22.txt', 'w') as f:
f.write("sps1 sps2\n")
for i in range(len(sps1)):
f.write(str(sps1[i]))
f.write(' ')
f.write(str(sps2[i]))
f.write('\n')
return sps1, sps2
```
Модуль 0
```py
# Модуль 0
import Mod2
import matplotlib.pyplot as plt
sps1, sps2 = Mod2.read_file()
plt.plot(sps1)
plt.title('График sps1')
plt.grid(True)
plt.show()
```
Генерация входных данных
```py
import pickle
import random as rn
krt1=tuple(rn.randint(20,45) for _ in range(40))
krt2=tuple(rn.randint(20,45) for _ in range(50))
file=open('input.bin','wb')
pickle.dump((krt1,krt1),file)
file.close()
```
Выполнение
```py
import Mod0
Введите имя файла: input.txt
Файл не найден! Попробуйте снова.
Введите имя файла: input.bin
SPS1: [20, 20, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 36, 36, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45]
SPS2: [1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2]
Статистики SPS1:
Среднее: 33.375
Минимум: 20
Максимум: 45
Медиана: 33.0
Ст.отклонение: 7.171277096157519
```
![График sps1](Ris2.png)

14
TEMA9/test_SAU.py Обычный файл
Просмотреть файл

@@ -0,0 +1,14 @@
###main_SAU
prm=[2.5,4,1.3,0.8] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь
from SAU import *
xx=[0]+[1]*20 #Входной сигнал – «ступенька»
SAUe=SAU(prm) # Создаём экземпляр класса
yt=[]
for xt in xx: # Прохождение входного сигнала
SAUe.zdn_zn(xt)
SAUe.model()
SAUe.otobraz()
yt.append(SAUe.ypr[1])
import pylab
pylab.plot(yt)
pylab.show()