diff --git a/TEMA9/Ris10.PNG b/TEMA9/Ris10.PNG new file mode 100644 index 0000000..aee8faf Binary files /dev/null and b/TEMA9/Ris10.PNG differ diff --git a/TEMA9/task9.md b/TEMA9/task9.md index 7c7e5df..d9eea95 100644 --- a/TEMA9/task9.md +++ b/TEMA9/task9.md @@ -1,112 +1,168 @@ -# Общее контрольное задание по теме 9 -Ефимова Людмила, А-03-23 - -Создайте и запишите в модуль класс, содержащий следующие компоненты: -- конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим -фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их -окладов, некоторые начальные значения; - -- метод для обеспечения операции повышения оклада сотрудника на заданное значение; - -- метод для обеспечения перевода сотрудника из одного отдела в другой; - -- метод для изменения должности сотрудника; - -- свойство, содержащее перечень (список) поощрений сотрудника. - -Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. -Отобразите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в -отдел, изменения должности и оклада, объявления благодарности. - -## Решение - -```py -class Employee: - def __init__(self, fio = "", otdel="", dolzhnost="",oklad=0): - self.fio=fio - self.otdel=otdel - self.dolzhnost=dolzhnost - self.oklad=oklad - self.__pooshreniya=[] - self.pooshreniya = property( - self.get_pooshreniya, - self.set_pooshreniya - ) - def change_oklad(self, diff): - self.oklad += diff - def change_otdel(self, new_otdel): - self.otdel = new_otdel - def change_dolzhnost(self, new_dolzhnost): - self.dolzhnost = new_dolzhnost - def get_pooshreniya(self): - return list(self.__pooshreniya) - def set_pooshreniya(self,pooshrenie): - self.__pooshreniya.append(pooshrenie) - def get_employee_info(self): - print(f""" - ФИО: {self.fio} - Отдел: {self.otdel} - Должность: {self.dolzhnost} - Оклад: {self.oklad} руб. - Поощрения: {self.__pooshreniya} - """) -``` - -```py -from Employee import Employee -employee1 = Employee("Иванов И.И.", "Отдел ИИ", "Президент ИИ", 100000) -employee2 = Employee("Володин Д.В.", "Отдел БЯМоведения", "программист БЯМов", 10000) - -employee1.get_employee_info() - -ФИО: Иванов И.И. -Отдел: Отдел ИИ -Должность: Президент ИИ -Оклад: 100000 руб. -Поощрения: [] - -employee2.get_employee_info() - -ФИО: Володин Д.В. -Отдел: Отдел БЯМоведения -Должность: программист БЯМов -Оклад: 10000 руб. -Поощрения: [] - -employee1.change_otdel("Отдел по работе с роботами") # Изменим отдел -employee1.change_oklad(1000) -employee2.set_pooshreniya("Сертификат на кофеек") - -employee1.get_employee_info() # Отображение полной информации об экземпляре класса - -ФИО: Киреев Ю.П. -Отдел: Отдел по работе с роботами -Должность: Президент ИИ -Оклад: 1000 руб. -Поощрения: [] - -employee2.get_employee_info() - -ФИО: Володин Д.В. -Отдел: Отдел БЯМоведения -Должность: программист БЯМов -Оклад: 10000 руб. -Поощрения: ['Сертификат на кофеек'] -``` - - - - - - - - - - - - - - - - - +# Индивидуальное контрольное задание вариант 2 +Ефимова Людмила, А-03-23 + +Создайте модуль М1, содержащий две функции: + +- функция 1: аргументы - имя текстового файла с числовыми данными (может быть разное число значений на каждой строке) и пороговое значение КК; +считываются значения из указанного файла и записываются в два новых текстовых файла, имена которых совпадают с именем входного файла с добавлением 1 и 2 - в первый файл записываются значения, превышающие заданный порог, а во второй - не превышающие его. +Исходные данные в виде списка возвращаются в вызывающую программу; + +- функция 2: аргумент - имя текстового файла с исходными данными; считываются значения из указанного файла, формируются в виде списка и по нему рассчитываются: среднее, медиана, наименьшее и наибольшее значения, стандартное отклонение - это возвращаемые результаты функции. +```py +import math +import statistics + +def func1(filename, KK): + with open(filename, 'r', encoding = 'utf-8') as f: + nums = [] + for i in f: + nums_line = list(map(float,line.strip().split())) + nums.extend(nums_line) + + above = [] + below = [] + for n in nums: + if n > KK: + above.append(n) + else: + below.append(n) + + + x = filename.split('.')[0] + with open(x + '1.txt') as f: # запись в новый файл превышающих + for num in above: + f.write(str(num) +'\n') + + with open(x + '2.txt') as f: # запись в новый файл не превышающих + for num in below: + f.write(str(num) +'\n') + + return nums + +def func2(filename): + with open(filename, 'r', encoding = 'utf-8') as f: + nums = [] + for i in f: + nums_line = list(map(float,line.strip().split())) + nums.extend(nums_line) + n = len(nums) + mean = sum(nums)/n + + median = statistics.median(nums) # медиана + std = statistics.stdev(nums) # стандартное отклонение + print(mean, median, min(nums), max(nums), std) + + return [mean, median, min(nums), max(nums), std] +``` + +Создайте еще один модуль М2, в котором должны: + +- запрашиваться имя файла с исходными данными, проверяться его наличие и при отсутствии - повторение запроса; + +- запрос порогового значения КК; + +- вызов функции 1 с указанным именем; + +- трижды вызвать функцию 2: с именем указанного в ответе на запрос файла, а также с каждым из файлов, созданных в функции 1; отобразить результаты расчетов. + +```py +import os + +from M1 import func1, func2 + +def main(): + while True: + filename = input("Исходный файл: ") + if os.path.exists(filename): + break + print("Нет такого файла...") + + KK = float(input("Введите пороговое значение K: ")) + data = func1(filename, KK) + + x = filename.split('.')[0] + + print("CТАТИСТИКИ") + print("1. Исходный файл: ", func2(filename)) + print("2. Выше порога: ", func2(x + '1.txt')) + print("3. Ниже порога: ", func2(x + '2.txt')) + + return data +``` + +Создайте модуль М0 - главную программу, которая вызывает М2, отображает исходные данные в виде графика и записывает их в бинарный файл RES2a.bin. +```py +import M2 +import matplotlib.pyplot as plt +import pickle + +if __name__ == "__main__": + data = M2.main() + + print("ГРАФИК:") + + plt.figure(figsize=(12, 5)) + plt.plot(numbers) + plt.axhline(y=k, color='r') + plt.title(f"Данные из файла: {filename}") + plt.xlabel("Номер элемента") + plt.ylabel("Значение") + plt.grid(True) + plt.show() + + with open("Res2a.bin", 'wb') as f: + pickle.dump(data, f) +``` +Подготовьте файл с не менее, чем с 20 числовыми значениями с разным числом элементов на разных строках и проверьте с ним разработанную программу. +Создала файл datatest.txt с содержимым +```py +10 20 30 20 +22 33 +60 70 80 90 +15 23 25 27 76 +5 12 34 67 36 +``` + +Результат работы программы +```py +Введите имя файла (например: data.txt): datatest.txt +Введите пороговое значение K: 23 + +СТАТИСТИКИ: +1. Исходный файл: Среднее: 37.75, Медиана: 28.50, Мин: 5.00, Макс: 90.00, Отклонение: 26.02 +2. Выше порога: Среднее: 52.33, Медиана: 48.00, Мин: 25.00, Макс: 90.00, Отклонение: 23.73 +3. Ниже порога: Среднее: 15.88, Медиана: 17.50, Мин: 5.00, Макс: 23.00, Отклонение: 6.45 + +ГРАФИК: +Данные сохранены в файл 'Res2a.bin' +``` +![Скриншот построенного графика](Ris10.PNG) + +Содержимое файла above: + +```py +30.0 +33.0 +60.0 +70.0 +80.0 +90.0 +25.0 +27.0 +76.0 +34.0 +67.0 +36.0 +``` +Содержимое файла below: + +```py +10.0 +20.0 +20.0 +22.0 +15.0 +23.0 +5.0 +12.0 +``` \ No newline at end of file