From 0e0029a4302768a6152e8135a200678ce0a435a6 Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 19 Dec 2025 00:31:30 +0300 Subject: [PATCH] =?UTF-8?q?task:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TEMA9/M0.py | 22 ++++ TEMA9/M1.py | 53 +++++++++ TEMA9/M2.py | 38 +++++++ TEMA9/Mod3.py | 11 ++ TEMA9/RES2a.bin | Bin 0 -> 124 bytes TEMA9/SAU.png | Bin 0 -> 25322 bytes TEMA9/SAU.py | 21 ++++ TEMA9/data1.txt | 4 + TEMA9/data11.txt | 6 ++ TEMA9/data12.txt | 6 ++ TEMA9/data2.txt | 4 + TEMA9/main_SAU.py | 13 +++ TEMA9/report.md | 270 ++++++++++++++++++++++++++++++++++++++++++++++ TEMA9/task.md | 99 +++++++++++++++++ TEMA9/task.py | 62 +++++++++++ 15 files changed, 609 insertions(+) create mode 100644 TEMA9/M0.py create mode 100644 TEMA9/M1.py create mode 100644 TEMA9/M2.py create mode 100644 TEMA9/Mod3.py create mode 100644 TEMA9/RES2a.bin create mode 100644 TEMA9/SAU.png create mode 100644 TEMA9/SAU.py create mode 100644 TEMA9/data1.txt create mode 100644 TEMA9/data11.txt create mode 100644 TEMA9/data12.txt create mode 100644 TEMA9/data2.txt create mode 100644 TEMA9/main_SAU.py create mode 100644 TEMA9/report.md create mode 100644 TEMA9/task.md create mode 100644 TEMA9/task.py diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..3786799 --- /dev/null +++ b/TEMA9/M0.py @@ -0,0 +1,22 @@ +# M0.py +import pickle +import pylab +import M2 + +# Получаем данные (они уже прочитаны в M2) +data = M2.original_data + +# График +pylab.plot(data, marker='o') +pylab.title("Исходные данные") +pylab.xlabel("Номер") +pylab.ylabel("Значение") +pylab.grid(True) +pylab.show() + +# Запись в бинарный файл +f = open("RES2a.bin", "wb") +pickle.dump(data, f) +f.close() + +print("Исходные данные записаны в RES2a.bin") diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..2878618 --- /dev/null +++ b/TEMA9/M1.py @@ -0,0 +1,53 @@ +# M1.py +import os +import math + +def func1(filename, KK): + numbers = [] + f = open(filename, 'r') + for line in f: + parts = line.split() + for p in parts: + numbers.append(float(p)) + f.close() + + base, ext = os.path.splitext(filename) + f1 = open(base + '1' + ext, 'w') + f2 = open(base + '2' + ext, 'w') + + for x in numbers: + if x > KK: + f1.write(str(x) + '\n') + else: + f2.write(str(x) + '\n') + + f1.close() + f2.close() + return numbers + + +def func2(filename): + numbers = [] + f = open(filename, 'r') + for line in f: + parts = line.split() + for p in parts: + numbers.append(float(p)) + f.close() + + if len(numbers) == 0: + return 0, 0, 0, 0, 0 # пустой файл + + n = len(numbers) + mean = sum(numbers) / n + min_val = min(numbers) + max_val = max(numbers) + std_dev = math.sqrt(sum((x - mean) ** 2 for x in numbers) / n) + + sorted_nums = sorted(numbers) + if n % 2 == 1: + median = sorted_nums[n // 2] + else: + median = (sorted_nums[n // 2 - 1] + sorted_nums[n // 2]) / 2 + + return mean, median, min_val, max_val, std_dev diff --git a/TEMA9/M2.py b/TEMA9/M2.py new file mode 100644 index 0000000..0f60e76 --- /dev/null +++ b/TEMA9/M2.py @@ -0,0 +1,38 @@ +# M2.py +import os +from M1 import func1, func2 + +# Запрос имени файла с проверкой существования +filename = input("Введите имя файла с исходными данными: ") +while not os.path.isfile(filename): + print("Файл не найден.") + filename = input("Введите имя файла с исходными данными: ") + +# Запрос порога +KK = float(input("Введите пороговое значение KK: ")) + +# Вызов func1 +data = func1(filename, KK) + +# Имена новых файлов +base, ext = os.path.splitext(filename) +file1 = base + '1' + ext +file2 = base + '2' + ext + +# Три вызова func2 +files = [filename, file1, file2] +labels = ["Исходный", "Больше KK", "Не больше KK"] + +print("\nРезультаты статистики:") +print("-" * 50) +for i in range(3): + mean, median, minv, maxv, std = func2(files[i]) + print(f"\n{labels[i]} файл:") + print(f" Среднее: {mean:.4f}") + print(f" Медиана: {median:.4f}") + print(f" Минимум: {minv:.4f}") + print(f" Максимум: {maxv:.4f}") + print(f" Ст. откл.: {std:.4f}") + +# Возвращаем исходные данные для M0 +original_data = data diff --git a/TEMA9/Mod3.py b/TEMA9/Mod3.py new file mode 100644 index 0000000..0ab7e2e --- /dev/null +++ b/TEMA9/Mod3.py @@ -0,0 +1,11 @@ +class Class1: #Объявление класса Class1 в модуле + def zad_zn(self,znach): # 1 Метод класса + self.data=znach # self - ссылка на экземпляр класса Class1 + def otobrazh(self): # 2 Метод класса + print(self.data)#Отображение данных экземпляра + +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 + print('значение=',self.data)#Отображение данных экземпляра + def otobrazh(objekt): #Объявление самостоятельной функции + print('значение объекта=',objekt) diff --git a/TEMA9/RES2a.bin b/TEMA9/RES2a.bin new file mode 100644 index 0000000000000000000000000000000000000000..5068d156b5407d816d5d7a2f2942f1c5d5452ed0 GIT binary patch literal 124 zcmZo*nOevI0kKmw-0eRbgMqsP4@A)Y0K*v&IP2~p43iRpN;xp4fq}dI$C)57%iTc= Ysu*e{gS!J4RE>iSRBHbZh-9iB0GC}Rw*UYD literal 0 HcmV?d00001 diff --git a/TEMA9/SAU.png b/TEMA9/SAU.png new file mode 100644 index 0000000000000000000000000000000000000000..68a4cd5209b24cb7750525cc152fbe140f333e9d GIT binary patch literal 25322 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 SaSB|u>g2K0PIZ`|YySgga+JFO literal 0 HcmV?d00001 diff --git a/TEMA9/SAU.py b/TEMA9/SAU.py new file mode 100644 index 0000000..6f0cc48 --- /dev/null +++ b/TEMA9/SAU.py @@ -0,0 +1,21 @@ +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]) diff --git a/TEMA9/data1.txt b/TEMA9/data1.txt new file mode 100644 index 0000000..5ae6de3 --- /dev/null +++ b/TEMA9/data1.txt @@ -0,0 +1,4 @@ +1.2 3.5 +-2.1 4.8 5.0 +2.3 1.1 6.7 0.0 3.3 +7.2 -1.5 \ No newline at end of file diff --git a/TEMA9/data11.txt b/TEMA9/data11.txt new file mode 100644 index 0000000..16a1769 --- /dev/null +++ b/TEMA9/data11.txt @@ -0,0 +1,6 @@ +3.5 +4.8 +5.0 +6.7 +3.3 +7.2 diff --git a/TEMA9/data12.txt b/TEMA9/data12.txt new file mode 100644 index 0000000..ca3f0aa --- /dev/null +++ b/TEMA9/data12.txt @@ -0,0 +1,6 @@ +1.2 +-2.1 +2.3 +1.1 +0.0 +-1.5 diff --git a/TEMA9/data2.txt b/TEMA9/data2.txt new file mode 100644 index 0000000..72b8c96 --- /dev/null +++ b/TEMA9/data2.txt @@ -0,0 +1,4 @@ +10 20 30 +15.5 -5 +0 25 35.7 40 +12.3 18.9 \ No newline at end of file diff --git a/TEMA9/main_SAU.py b/TEMA9/main_SAU.py new file mode 100644 index 0000000..73e6070 --- /dev/null +++ b/TEMA9/main_SAU.py @@ -0,0 +1,13 @@ +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() diff --git a/TEMA9/report.md b/TEMA9/report.md new file mode 100644 index 0000000..09ccd74 --- /dev/null +++ b/TEMA9/report.md @@ -0,0 +1,270 @@ +# Отчет по теме 9 + +Анисенков Павел, А-01-23 + +## 1 Запуск интерактивной оболочки IDLE + +Была запущена интерактивная оболочка IDLE. + +## 2 Создание классов + +## 2.1 Создание автономного класса + +```py +>>> class Class1: #Объявление класса +... def zad_zn(self,znach): #Метод 1 класса1 – задание значения data +... self.data=znach # self - ссылка на экземпляр класса +... def otobrazh(self): # Метод 2 класса1 +... print(self.data)#Отображение данных экземпляра класса +... +... +>>> z1=Class1() #Создаём 1-й экземпляр класса +>>> z2=Class1() #Создаём 2-й экземпляр класса +>>> z1.zad_zn('экз.класса 1') #Обращение к 1 методу класса у 1-го экз. +>>> z2.zad_zn(-632.453) #Обращение к 1 методу класса у 2-го экз. +>>> z1.otobrazh() # Обращение ко второму методу класса у 1-го экз. +экз.класса 1 +>>> z2.otobrazh() # Обращение ко второму методу класса у 2-го экз. +-632.453 +>>> z1.data='Новое значение атрибута у экз.1' +>>> z1.otobrazh() +Новое значение атрибута у экз.1 +``` + +## 2.2 Создание класса-наследника + +```py +>>> class Class2(Class1): #Class2 - наследник класса Class1 +... def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя +... 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__', 'otobrazh', 'zad_zn'] +>>> z3.zad_zn('Совсем новое') +>>> z3.otobrazh() #Метод из Class2 (потому что он переопределяет родительский). +значение= Совсем новое +>>> z1.otobrazh() # z1 Не изменилось У каждого экземпляра — свой data +Новое значение атрибута у экз.1 +>>> del z1,z2,z3 +``` + +## 3 Использование классов, содержащихся в модуле + +Был создан модуль Mod3 с таким содержимым: + +```py +class Class1: #Объявление класса Class1 в модуле + def zad_zn(self,znach): # 1 Метод класса + self.data=znach # self - ссылка на экземпляр класса Class1 + def otobrazh(self): # 2 Метод класса + print(self.data)#Отображение данных экземпляра + +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 + print('значение=',self.data)#Отображение данных экземпляра + def otobrazh(objekt): #Объявление самостоятельной функции + print('значение объекта=',objekt) +``` + +Далее импортирован класс из этого модуля (при вызове метода otobrazh была выведена ошибка, так как не было задано значение обьекта с помощью метода zad_zn, которое и должно выводиться на печать): + +```py +>>> from Mod3 import Class1 #Частичный импорт содержимого модуля +>>> z4=Class1() +>>> z4.otobrazh() +Traceback (most recent call last): + File "", line 1, in + z4.otobrazh() + File "C:\Users\Professional\Desktop\python-labs\TEMA9\Mod3.py", line 5, in otobrazh + print(self.data)#Отображение данных экземпляра +AttributeError: 'Class1' object has no attribute 'data' #y z4 нет атрибута data +``` +Далее была произведена еще попытка печати, но предварительно было задано знаечние обьекта: + +```py +>>> from Mod3 import Class1 +>>> z4=Class1() +>>> z4.data='значение данного data у экз.4' +>>> z4.otobrazh() +значение данного data у экз.4 +``` + +Потом был импортирован весь модуль и из него с использованием разных методов был вызван otobrazh: + +```py +>>> import Mod3 #Полный импорт содержимого модуля +>>> z4=Mod3.Class2() +>>> z4.zad_zn('Класс из модуля') +>>> z4.otobrazh() #метод класса Class2 +значение= Класс из модуля +>>> Mod3.otobrazh('Объект') #функция, не связанная с классами +значение объекта= Объект +``` +## 4 Использование специальных методов + +```py +>>> class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 +... 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.otobrazh() +значение= abc +>>> z6=z5+'def' +>>> z6.otobrazh() +значение= abcdef +>>> z6.zad_dr_zn(3) +>>> z6.otobrazh() +значение= 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__', 'otobrazh', 'zad_dr_zn', 'zad_zn'] +>>> Class3.fio='Иванов И.И.' +>>> z7=Class3(123) +>>> dir(z7)==dir(Class3) +False #У класса Class3 — нет 'data' +>>> dir(z7.fio) +['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] +>>> 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', 'otobrazh', 'rozden', 'zad_dr_zn', 'zad_zn'] +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', 'otobrazh', 'zad_dr_zn', 'zad_zn'] #rozden был добавлен только к экземпляру z7, а не к классу Class3, если атрибут или метод добавлены к классу то к экземпляру автоматически тоже +``` + +## 6 Выявление родительских классов + +```py +>>> Class3.__bases__ +(,) +>>> Class2.__bases__ +(,) +>>> Class1.__bases__ +(,) #object — корень всей иерархии классов в нем определены все базовые методы +>>> Class3.__mro__ +(, , , ) +>>> ZeroDivisionError.__mro__ +(, , , , ) +``` + +## 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) #позволяет контролировать доступ к атрибуту через методы: obj.svojstvo → вызывает chten(). obj.svojstvo = 5 → вызывает zapis(5). del obj.svojstvo → вызывает stiran() +... +... +>>> exempl=Class4(12) +>>> exempl.svojstvo +12 +>>> exempl.svojstvo=45 +>>> print(exempl.svojstvo) +45 +del exempl.svojstvo #атрибут __prm больше не существует +exempl.svojstvo +Traceback (most recent call last): + File "", line 1, in + exempl.svojstvo + File "", line 5, in chten + return sam.__prm +AttributeError: 'Class4' object has no attribute '_Class4__prm' +``` +## 8 представление в виде класса модели системы автоматического регулирования + +Была создана программа с формированием класса для расчета САУ: + +```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]) +``` + +Была создана основная программа для формирования САУ с помощью модуля SAU: + +```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() +``` + +Был запущен модуль MAIN_SAU + +```py += RESTART: C:\Users\Professional\Desktop\python-labs\TEMA9\main_SAU.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 +``` +![](SAU.png) + +## 9 Завершение работы + +Сеанс в IDLE был завершен! + diff --git a/TEMA9/task.md b/TEMA9/task.md new file mode 100644 index 0000000..cddc3ce --- /dev/null +++ b/TEMA9/task.md @@ -0,0 +1,99 @@ +## Общее контрольное задание по теме 9 + +Анисенков Павел А-01-23 + +## Задание +Создайте и запишите в модуль класс, содержащий следующие компоненты: + +- конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения; + +- метод для обеспечения операции повышения оклада сотрудника на заданное значение; + +- метод для обеспечения перевода сотрудника из одного отдела в другой; + +- метод для изменения должности сотрудника; + +- свойство, содержащее перечень (список) поощрений сотрудника. + +Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобра-зите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, изменения должности и оклада, объявления благодарности. + +## Решение + +Программа записанная в модуль: + +```py +class Sotrudnik: + + def __init__(self, fio, otdel, dolzhnost, oklad): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self.__pooshchreniya = []# Приватный атрибут для хранения поощрений Чтобы запретить прямое изменение списка поощрений извне.Все операции (добавление, чтение, очистка) происходят только через свойство pooshchreniya, где контролируется логика — например, при emp.pooshchreniya = "Премия" — значение добавляется в список, а не перезаписывает его.(публичный может сломать код emp.pooshchreniya = 123 ← тип не тот emp.pooshchreniya = None ← сломать логику) + + def __chtenie_pooshchreniy(self): #возвращает список + return self.__pooshchreniya + + def __zapis_pooshchreniy(self, pooshchrenie): #добавляет поощрение + self.__pooshchreniya.append(pooshchrenie) + + def __stiran_pooshchreniy(self): # очищает список + self.__pooshchreniya = [] + + pooshchreniya = property(__chtenie_pooshchreniy, __zapis_pooshchreniy, __stiran_pooshchreniy, "Список поощрений сотрудника") + #Методы изменения данных: + def povysit_oklad(self, summa): + self.oklad += summa + + def perevod_v_otdel(self, novyy_otdel): + self.otdel = novyy_otdel + + def izmenit_dolzhnost(self, novaya_dolzhnost): + self.dolzhnost = novaya_dolzhnost + + def __repr__(self): #чтобыпросто писать print(emp1) — и видеть все данные + return (f"Сотрудник: {self.fio}, Отдел: {self.otdel}, " + f"Должность: {self.dolzhnost}, Оклад: {self.oklad}, " + f"Поощрения: {self.pooshchreniya}") + +# Создание экземпляров +emp1 = Sotrudnik("Иванова И.И.", "Секретариат", "Разносчица бумажек", 50000) +emp2 = Sotrudnik("Петрова А.С.", "Секретариат", "Разносчица кофе", 80000) + +# Задание начальных поощрений +emp1.pooshchreniya = "Благодарность" #накапливает поощрения +emp2.pooshchreniya = "Премия" +emp2.pooshchreniya = "Премия 2" + +# Отображение начальных значений +print("Начальные данные ") +print(emp1) +print(emp2) + +# Операции с экземплярами + +# Сотрудник 1: Повышение оклада и перевод +emp1.povysit_oklad(10000) +emp1.perevod_v_otdel("Генсекритариат") + +# Сотрудник 2: Изменение должности и объявление благодарности +emp2.izmenit_dolzhnost("Старшая секретарша") +emp2.pooshchreniya = "Благодарность от руководства за вкусный кофе" + +# Отображение измененных значений +print("Измененные данные") +print(emp1) +print(emp2) +``` + +Отображение результата: + +```py += RESTART: C:\Users\Professional\Desktop\python-labs\TEMA9\task.py +Начальные данные +Сотрудник: Иванова И.И., Отдел: Секретариат, Должность: Разносчица бумажек, Оклад: 50000, Поощрения: ['Благодарность'] +Сотрудник: Петрова А.С., Отдел: Секретариат, Должность: Разносчица кофе, Оклад: 80000, Поощрения: ['Премия', 'Премия 2'] +Измененные данные +Сотрудник: Иванова И.И., Отдел: Генсекритариат, Должность: Разносчица бумажек, Оклад: 60000, Поощрения: ['Благодарность'] +Сотрудник: Петрова А.С., Отдел: Секретариат, Должность: Старшая секретарша, Оклад: 80000, Поощрения: ['Премия', 'Премия 2', 'Благодарность от руководства за вкусный кофе'] +``` \ No newline at end of file diff --git a/TEMA9/task.py b/TEMA9/task.py new file mode 100644 index 0000000..464655f --- /dev/null +++ b/TEMA9/task.py @@ -0,0 +1,62 @@ +class Sotrudnik: + + def __init__(self, fio, otdel, dolzhnost, oklad): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self.__pooshchreniya = []# Приватный атрибут для хранения поощрений + + def __chtenie_pooshchreniy(self): #возвращает список + return self.__pooshchreniya + + def __zapis_pooshchreniy(self, pooshchrenie): #добавляет поощрение + self.__pooshchreniya.append(pooshchrenie) + + def __stiran_pooshchreniy(self): # очищает список + self.__pooshchreniya = [] + + pooshchreniya = property(__chtenie_pooshchreniy, __zapis_pooshchreniy, __stiran_pooshchreniy, "Список поощрений сотрудника") + #Методы изменения данных: + def povysit_oklad(self, summa): + self.oklad += summa + + def perevod_v_otdel(self, novyy_otdel): + self.otdel = novyy_otdel + + def izmenit_dolzhnost(self, novaya_dolzhnost): + self.dolzhnost = novaya_dolzhnost + + def __repr__(self): #чтобыпросто писать print(emp1) — и видеть все данные + return (f"Сотрудник: {self.fio}, Отдел: {self.otdel}, " + f"Должность: {self.dolzhnost}, Оклад: {self.oklad}, " + f"Поощрения: {self.pooshchreniya}") + +# Создание экземпляров +emp1 = Sotrudnik("Иванова И.И.", "Секретариат", "Разносчица бумажек", 50000) +emp2 = Sotrudnik("Петрова А.С.", "Секретариат", "Разносчица кофе", 80000) + +# Задание начальных поощрений +emp1.pooshchreniya = "Благодарность" #накапливает поощрения +emp2.pooshchreniya = "Премия" +emp2.pooshchreniya = "Премия 2" + +# Отображение начальных значений +print("Начальные данные ") +print(emp1) +print(emp2) + +# Операции с экземплярами + +# Сотрудник 1: Повышение оклада и перевод +emp1.povysit_oklad(10000) +emp1.perevod_v_otdel("Генсекритариат") + +# Сотрудник 2: Изменение должности и объявление благодарности +emp2.izmenit_dolzhnost("Старшая секретарша") +emp2.pooshchreniya = "Благодарность от руководства за вкусный кофе" + +# Отображение измененных значений +print("Измененные данные") +print(emp1) +print(emp2)