diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py index ed4447e50..a08a511c2 100644 --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,3 +1,5 @@ +__author__ = 'Насонов Алексей Сергеевич' + # Задача-1: # Дан список фруктов. # Напишите программу, выводящую фрукты в виде нумерованного списка, @@ -13,13 +15,38 @@ # Подсказка: воспользоваться методом .format() +print("Задача-1:") +NumList = ["яблоко", "банан", "киви", "арбуз"] +for Item in NumList: + print('{:}. {:>6}'.format(str(NumList.index(Item)+1), Item)) + + + # Задача-2: # Даны два произвольные списка. # Удалите из первого списка элементы, присутствующие во втором списке. +print("Задача-2:") +NumList1 = ["яблоко", "банан", "киви", "арбуз"] +NumList2 = ["банан", "киви"] +for Item in NumList2: + if Item in NumList1: + NumList1.remove(Item) +print(NumList1) # Задача-3: # Дан произвольный список из целых чисел. # Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: # если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. + +print("Задача-3:") +NumList1 = [1, 2, 3, 4, 5] +NumList2 = [] +for Num in NumList1: + if Num % 2 == 0: + NumList2.append(Num/4) + else: + NumList2.append(Num*2) +print(NumList2) + diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py index c96843184..f1faf7012 100644 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -1,10 +1,18 @@ +__author__ = 'Насонов Алексей Сергеевич' + # Задание-1: уравнение прямой вида y = kx + b задано в виде строки. # Определить координату y точки с заданной координатой x. -equation = 'y = -12x + 11111140.2121' -x = 2.5 +#equation = 'y = -12x + 11111140.2121' +#x = 2.5 # вычислите и выведите y +print("Задача-1:") +x = 2.5 +y = -12*x + 11111140.2121 +print("Координата точки: x = {0}, y = {1}".format(x,y)) + + # Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. # Проверить, корректно ли введена дата. @@ -17,12 +25,41 @@ # (т.е. 2 символа для дня, 2 - для месяца, 4 - для года) # Пример корректной даты -date = '01.11.1985' +#date = '01.11.1985' # Примеры некорректных дат -date = '01.22.1001' -date = '1.12.1001' -date = '-2.10.3001' +#date = '01.22.1001' +#date = '1.12.1001' +#date = '-2.10.3001' + +print("Задача-2:") +DaysInToMonth = [30, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] +date = '21.11.1985' +List = date.split(".") +# Проверка по формату +if len(List[0]) != 2 or len(List[1]) != 2 or len(List[2]) != 4: + print("Формат не соответсвует dd.mm.yyyy") + quit() + +D = int(List[0]) +M = int(List[1]) +Y = int(List[2]) + +# Проверяем месяц +if M not in list(range(1, 13)): + print("Некоректно определен месяц") + quit() +# Проверяем день +elif D not in list(range(1, DaysInToMonth[M-1]+1)): + print("Некоректно определен день") + quit() +# Проверяем год +elif Y not in list(range(1, 10000)): + print("Некоректно определен год") + quit() + +print("Дата {} введена корректно".format(date)) + # Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) @@ -53,4 +90,34 @@ # Выход: 6 2 # # Вход: 11 -# Выход: 5 3 \ No newline at end of file +# Выход: 5 3 + + +print("Задача-3:") +# Задаем номер квартиры +Num = 11 + +# Определяем в каком квадрате находится квартира (сумму квадратов n натуральных чисел) +# Правильнее бы было найти обратную функцию, но как-то не получилось. Поэтому ищем решение по исходной функции +for n in range(1, 2000): + MaxKvart = n * (n + 1) * (2 * n + 1) / 6 + if MaxKvart >= Num: + break + +print("Номер исходной квартиры:", Num) +print("Номер квадрата:", n) +print("Номер последней квартиры(в правом верхнем углу):", int(MaxKvart)) +# Определяем верхний этаж этого квадрата (сумму n натуральных чисел) +MaxEtag = n * (n + 1) / 2 + +print("Этаж самой последней квартиры в этом квадрате", int(MaxEtag)) +# Определяем искомый этаж и смещение слева на право на этаже у искомой квартиры +DeltaEtag = (MaxKvart - Num) // n +RightOffset = (MaxKvart - Num) % n +print("Дельта этаж", int(DeltaEtag)) +print("Смещение квартиры справа", int(RightOffset)) + +print("\nРЕШЕНИЕ:") +print("Искомый этаж:", int(MaxEtag-DeltaEtag)) +print("Номер квартиры на этаже слева:", int(n-RightOffset)) + diff --git a/lesson02/home_work/hw02_normal.py b/lesson02/home_work/hw02_normal.py index 3acfaabb6..3d677dc38 100644 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,3 +1,5 @@ +__author__ = 'Насонов Алексей Сергеевич' + # Задача-1: # Дан список, заполненный произвольными целыми числами, получите новый список, # элементами которого будут квадратные корни элементов исходного списка, @@ -5,17 +7,86 @@ # если такой корень вообще можно извлечь # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] +print("Задача-1:") +NumList1 = [1, 2, 3, 4, 5, -10, 25] +NumList2 = [] +import math +for Num in NumList1: + if Num >= 0: + Res = math.sqrt(Num) + if (float(Res) % 1) == 0: + NumList2.append(int(Res)) +print(NumList2) # Задача-2: Дана дата в формате dd.mm.yyyy, например: 02.11.2013. # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) +print("Задача-2:") +days = ["первое", + "второе", + "третье", + "четвертое", + "пятое", + "шестое", + "седьмое", + "восьмое", + "девятое", + "десятое", + "одиннадцатое", + "двенадцатое", + "тринадцатое", + "четырнадцатое", + "пятнадцатое", + "шестнадцатое", + "семьнадцатое", + "восемнадцатое", + "девятнадцатое", + "двадцатое", + "двадцать первое", + "двадцать второе", + "двадцать третье", + "двадцать четвертое", + "двадцать пятое", + "двадцать шестое", + "двадцать седьмое", + "двадцать восьмое", + "двадцать девятое", + "тридцатое", + "тридцать первое"] +month = ["января", + "февраля", + "марта", + "апреля", + "мая", + "июня", + "июля", + "августа", + "сентября", + "октября", + "ноября", + "декабря"] +date = "26.02.1975" +D = int((date.split("."))[0]) +M = int((date.split("."))[1]) +Y = (date.split("."))[2] +print(date) +print("Дата: {0} {1} {2} года".format(days[D-1],month[M-1],Y)) + # Задача-3: Напишите алгоритм, заполняющий список произвольными целыми числами # в диапазоне от -100 до 100. В списке должно быть n - элементов. # Подсказка: # для получения случайного числа используйте функцию randint() модуля random +print("Задача-3") +import random +NumList = [] +# Задаем количество элементов списка случайных значений +n = 10 +for item in range(n): + NumList.append(random.randint(-100, 100)) +print(NumList) # Задача-4: Дан список, заполненный произвольными целыми числами. # Получите новый список, элементами которого будут: @@ -23,3 +94,32 @@ # например, lst = [1, 2, 4, 5, 6, 2, 5, 2], нужно получить lst2 = [1, 2, 4, 5, 6] # б) элементы исходного списка, которые не имеют повторений: # например, lst = [1 , 2, 4, 5, 6, 2, 5, 2], нужно получить lst2 = [1, 4, 6] + +print("Задача-4") +NumList1 = [1, 2, 4, 5, 6, 2, 5, 2] +NumList_a = [] +NumList_b = [] +NumList_temp = NumList1.copy() +# Выполняем проверку первого элемента и удаляем его, +# если элемент встречается в исходном списке несколько раз, +# то заносим его только в новый список NumList_a +# если элемент встречается в исходном списке только один раз, +# то добавляем его в списки NumList_a, NumList_b +while NumList_temp: + Num = NumList_temp[0] + NumList_temp.remove(Num) + if Num in NumList_temp: + NumList_a.append(Num) + while Num in NumList_temp: + NumList_temp.remove(Num) + else: + NumList_a.append(Num) + NumList_b.append(Num) + +print("Исходный список:") +print(NumList1) +print("Список с уникальными элементами:") +print(NumList_a) +print("Список без повторяющихся элементов:") +print(NumList_b) + diff --git a/lesson06/home_work/data/hours_of b/lesson06/home_work/data/hours_of index 7e3c12c36..227d52838 100644 --- a/lesson06/home_work/data/hours_of +++ b/lesson06/home_work/data/hours_of @@ -1,4 +1,4 @@ -Имя Фамилия Отработано часов +Имя Фамилия Отработано_часов Петр Алексеев 120 Матвей Бурин 160 Василий Сидоров 122 diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py index fe5dc2b11..1f5c3269d 100644 --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,9 +1,128 @@ # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. +print("Задача-1") + +class triangle: + def __init__(self, p1, p2, p3): + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + + def calculate_area(self): + r = 0.5*abs((p2["x"]-p1["x"])*(p3["y"]-p1["y"]) - (p3["x"]-p1["x"])*(p2["y"])-p1["y"]) + return r + + def calculate_heights(self): + def get_height(p1,p2,p3): + import math + distance = abs((p3["y"]-p2["y"])*p1["x"]-(p3["x"]-p2["x"])*p1["y"]+p3["x"]*p2["y"]-p3["y"]*p2["x"])/math.sqrt((p3["y"]-p2["y"])**2 + (p3["x"]-p2["x"])**2) + return distance + h1 = get_height(self.p1, self.p2, self.p3) + h2 = get_height(self.p2, self.p3, self.p1) + h3 = get_height(self.p3, self.p1, self.p2) + return h1,h2,h3 + + def calculate_perimeter(self): + def get_len(p1,p2): + import math + len = math.sqrt((self.p2["x"] - self.p1["x"]) ** 2 + (self.p2["y"] - self.p1["y"]) ** 2) + return len + + p1p2 = get_len(p1,p2) + p2p3 = get_len(p2,p3) + p3p1 = get_len(p3,p1) + perimeter = p1p2+p2p3+p3p1 + return perimeter + +p1 = {"x": 5, + "y": 7} +p2 = {"x": 3, + "y": 4} +p3 = {"x": 6, + "y": 1} +tr = triangle(p1,p2,p3) +print("Площадь:", tr.calculate_area()) +print("h1,h2,h3", tr.calculate_heights()) +print("Периметр:", tr.calculate_perimeter()) + # Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. # Предусмотреть в классе методы: # проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. +print("Задача-2") + +class ravtrapetc: + def __get_abc(self): + def get_len(p1, p2): + import math + len = math.sqrt((self.p2["x"] - self.p1["x"]) ** 2 + (self.p2["y"] - self.p1["y"]) ** 2) + return len + self.C = get_len(self.p1,self.p2) + self.B = get_len(self.p2,self.p3) + self.A = get_len(self.p4,self.p1) + + + def __init__(self,p1,p2,p3,p4): + self.p1 = p1 + self.p2 = p2 + self.p3 = p3 + self.p4 = p4 + self.__get_abc() + def verify(self): + 'Если стороны A и B параллельны, а углы сторон C с онованием трапеции равны' + def Vetify_Parallel(self): + if self.p1["x"] != self.p4["x"]: + A1 = (self.p1["y"] - self.p4["y"]) / (self.p1["x"] - self.p4["x"]) + else: + A1 = 0 + if self.p2["x"] != self.p3["x"]: + A2 = (self.p2["y"] - self.p3["y"]) / (self.p2["x"] - self.p3["x"]) + else: + A2 = 0 + if A1 == A2: + return True + else: + return False + def Vetify_equality_angles(self): + import math + angles1 = (((self.p1["x"]-self.p2["x"])**2)+((self.p1["y"]-self.p2["y"])**2)+((self.p1["x"]-self.p4["x"])**2)+((self.p1["y"]-self.p4["y"])**2)-((self.p2["x"]-self.p4["x"])**2)-((self.p2["y"]-self.p4["y"])**2))/(2*math.sqrt(((self.p1["x"]-self.p2["x"])**2)+((self.p1["y"]-self.p2["y"])**2))*math.sqrt(((self.p1["x"]-self.p4["x"])**2)+((self.p1["y"]-self.p4["y"])**2))) + angles2 = (((self.p4["x"]-self.p3["x"])**2)+((self.p4["y"]-self.p3["y"])**2)+((self.p4["x"]-self.p1["x"])**2)+((self.p4["y"]-self.p1["y"])**2)-((self.p3["x"]-self.p1["x"])**2)-((self.p3["y"]-self.p1["y"])**2))/(2*math.sqrt(((self.p4["x"]-self.p3["x"])**2)+((self.p4["y"]-self.p3["y"])**2))*math.sqrt(((self.p4["x"]-self.p1["x"])**2)+((self.p4["y"]-self.p1["y"])**2))) + if angles1 == angles2: + return True + else: + return False + + if Vetify_Parallel(self) and Vetify_equality_angles(self): + return True + + + + + def calculate_perimeter(self): + perimeter = self.A+self.B+2*self.C + return perimeter + def calculate_area(self): + import math + area = (self.A+self.B)/2*math.sqrt(self.C**2 - (self.A-self.B)**2/4) + return area + +p1 = {"x": 1, + "y": 1} +p2 = {"x": 2, + "y": 7} +p3 = {"x": 7, + "y": 7} +p4 = {"x": 8, + "y": 1} + + + +trap = ravtrapetc(p1,p2,p3,p4) +print("Это равнобедренная тропеция?:", trap.verify()) +print("Площадь:", trap.calculate_area()) +print("Стороны: A= {}, B= {}, C= {}".format(trap.A, trap.B, trap.C)) +print("Периметр:", trap.calculate_perimeter()) + diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py index fae8d84d2..bf8ae5bd4 100644 --- a/lesson06/home_work/hw06_hard.py +++ b/lesson06/home_work/hw06_hard.py @@ -10,3 +10,73 @@ # С использованием классов. # Реализуйте классы сотрудников так, чтобы на вход функции-конструктора # каждый работник получал строку из файла + +print("Задание-1") + +class sotrudnik(): + def __init__(self,header,init_str): + data_line = init_str.split() + for j, item in enumerate(header): + if j < len(data_line): + setattr(self,item,data_line[j]) +class vedomost(): + def __init__(self): + self.list_sotrudnik = [] + self.list_hours_of = [] + self.__init_sprav_sotrudnik() + self.__init_otrabotka() + def __init_sprav_sotrudnik(self): + import os + DIR = "data" + FileName = "workers" + with open(os.path.join(DIR, FileName), 'r', encoding='UTF-8') as f: + for i, line in enumerate(f): # считываем файл построчно + # Первую строку парсим как заголовок + if i == 0: + header = line.split() + else: + # Все остальные строки с данными + # Создаем экзэмпляр класса сотрудник и добавляем в справочник сотрудников + self.list_sotrudnik.append(sotrudnik(header,line)) + def get_sotrudmik(self,name,family_name): + for item in self.list_sotrudnik: + if item.Имя == name and item.Фамилия == family_name: + return item + def __init_otrabotka(self): + def add_hours_of(self, header, init_str): + d = {} + data_line = init_str.split() + for j, item in enumerate(header): + if j < len(data_line): + d[item] = data_line[j] + else: + d[item] = "" + sotrudnik = self.get_sotrudmik(d["Имя"], d["Фамилия"]) + setattr(sotrudnik, item, d["Отработано_часов"]) + import os + DIR = "data" + FileName = "hours_of" + with open(os.path.join(DIR, FileName), 'r', encoding='UTF-8') as f: + for i, line in enumerate(f): # считываем файл построчно + # Первую строку парсим как заголовок + if i == 0: + header = line.split() + else: + # Все остальные строки с данными + # Добавляем атрибут отработки сотруднику + add_hours_of(self, header, line) + def Calculate_ZP(self): + for item in self.list_sotrudnik: + StoimostChasa = int(item.Зарплата) / int(item.Норма_часов) + if int(item.Отработано_часов) > int(item.Норма_часов): + Pererabotka = int(item.Отработано_часов) - int(item.Норма_часов) + setattr(item, "Начислено", int(item.Зарплата)+Pererabotka*2*StoimostChasa) + elif int(item.Отработано_часов) < int(item.Норма_часов): + Nedorabotka = int(item.Норма_часов) - int(item.Отработано_часов) + setattr(item, "Начислено", int(item.Зарплата)-Nedorabotka*StoimostChasa) + else: + setattr(item, "Начислено", item.Зарплата) + print("Имя: {} Фамилия: {} Зарплата: {} Начислено: {}".format(item.Имя,item.Фамилия,item.Зарплата,item.Начислено)) + +vedomost = vedomost() +vedomost.Calculate_ZP() \ No newline at end of file diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py index 01c3982f4..629086d8c 100644 --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -15,3 +15,78 @@ # (Ученик --> Класс --> Учителя --> Предметы) # 4. Узнать ФИО родителей указанного ученика # 5. Получить список всех Учителей, преподающих в указанном классе + +print("Задание-1") + +class klass(): + def __init__(self,name): + self.name +class uchenik(): + def __init__(self,name,klass,fio_mama,fio_papa): + self.name = name + self.klass = klass + self.fio_mama = fio_mama + self.fio_papa = fio_papa +class teacher(): + def __init__(self,name,predmet,list_klass): + self.name = name + self.predmet = predmet + self.list_klass = list_klass + +class school(): + def __init__(self,name): + self.name = name + self.list_uchenik = [] + self.list_teacher = [] + def add_uchenik(self,uchenik): + self.list_uchenik.append(uchenik) + def add_teacher(self, teacher): + self.list_teacher.append(teacher) + def get_listklass(self): + l = list(set([uchenik.klass for uchenik in self.list_uchenik])) + return l + def get_listuchenik(self,klass): + l = [uchenik.name for uchenik in self.list_uchenik if uchenik.klass == klass] + return l + def get_listpredmet(self,fio_uchenik): + u = "" + for uchenik in self.list_uchenik: + if uchenik.name == fio_uchenik: + u = uchenik + break + if not u: + return "Ученик с таким ФИО не найден" + print(u.klass) + res = [] + for teacher in self.list_teacher: + if u.klass in teacher.list_klass: + res.append("Ученик: {} Класс: {} Преподаватель: {} Предмет: {}".format(u.name,u.klass,teacher.name,teacher.predmet)) + return res + def get_roditeli(self,fio_uchenik): + for uchenik in self.list_uchenik: + if uchenik.name == fio_uchenik: + return "Отец: {} Мать: {}".format(uchenik.fio_papa,uchenik.fio_mama) + def get_teacher(self,klass): + l = [teacher.name for teacher in self.list_teacher if klass in teacher.list_klass] + return l + +school = school("Школа 1111") +school.add_uchenik(uchenik("Иванов Василий Алибабаевич","5А","Иванова Ирина Васильевна","Иванов Павел Петрович")) +school.add_uchenik(uchenik("Сидорова Елена Олеговна","5А","Сидорова Полина Васильевна","Сидоров Егор Александрович")) +school.add_uchenik(uchenik("Петрова Анна Александровна","7Б","Петрова Виктория Тимофеевна","Петров Сергей Сергеевич")) +school.add_uchenik(uchenik("Синичкина Ольга Петровна","7Б","Синичкина Татьяна Егоровна","Синичкин Иван Алексеевич")) +school.add_uchenik(uchenik("Козлова Анна Денисовна","3Б","Петрова Виктория Тимофеевна","Петров Сергей Сергеевич")) +school.add_uchenik(uchenik("Щукина Виктория Максимовна","3Б","Синичкина Татьяна Егоровна","Синичкин Иван Алексеевич")) +school.add_teacher(teacher("Федоров Иван Иванович","Математика",["5А","7Б","3Б"])) +school.add_teacher(teacher("Павлов Сергей Генадьевич","Физкультура",["5А","7Б","3Б"])) + +#Получаем список учеников в классе +print(school.get_listuchenik("3Б")) +#Получаем список всех классов +print(school.get_listklass()) +#Получаем список всех предметов у ученика +print(school.get_listpredmet("Щукина Виктория Максимовна")) +#Получаем родителей ученика +print(school.get_roditeli("Щукина Виктория Максимовна")) +#Получаем список учителей в классе +print(school.get_teacher("3Б"))