├── .gitattributes └── OOP_HW.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /OOP_HW.py: -------------------------------------------------------------------------------- 1 | class Student: 2 | def __init__(self, name, surname, age): 3 | self.name = name 4 | self.surname = surname 5 | self.age = age 6 | self.courses_in_progress = [] 7 | self.courses_complete = [] 8 | self.grades = {} 9 | 10 | def average_grade(self): 11 | grades_sum = 0 12 | marks_total = 0 13 | for number in self.grades.values(): 14 | for grade in number: 15 | grades_sum += grade 16 | marks_total += 1 17 | avr_grade = grades_sum / marks_total 18 | return round(avr_grade, 2) 19 | 20 | def rate_lector(self, lector, course, grade): 21 | if grade in range(1, 11): 22 | if isinstance(lector, Lector) and course in self.courses_in_progress and course in lector.courses_attached: 23 | if course in lector.grades: 24 | lector.grades[course] += [grade] 25 | else: 26 | lector.grades[course] = [grade] 27 | else: 28 | return 'Error' 29 | else: 30 | return 'Error' 31 | 32 | def __str__(self): 33 | return f"Имя: {self.name}\nФамилия: {self.surname}\n" \ 34 | f"Средняя оценка за домашние задания: {self.average_grade()}\n"\ 35 | f"Курсы в процессе изучения: {', '.join(self.courses_in_progress)}\n"\ 36 | f"Завершённые курсы: {', '.join(self.courses_complete)}\n" 37 | 38 | def __lt__(self, other): 39 | if not isinstance(other, Student): 40 | return "Сравнение невозможно" 41 | return self.average_grade() < other.average_grade() 42 | 43 | def __gt__(self, other): 44 | if not isinstance(other, Student): 45 | return "Сравнение невозможно" 46 | return self.average_grade() > other.average_grade() 47 | 48 | def __eq__(self, other): 49 | if not isinstance(other, Student): 50 | return "Сравнение невозможно" 51 | return self.average_grade() == other.average_grade() 52 | 53 | 54 | class Mentor(): 55 | def __init__(self, name, surname): 56 | self.name = name 57 | self.surname = surname 58 | self.courses_attached = [] 59 | self.grades = {} 60 | 61 | 62 | class Lector(Mentor): 63 | def __init__(self, name, surname): 64 | super().__init__(name, surname) 65 | 66 | def average_grade(self): 67 | grades_sum = 0 68 | marks_total = 0 69 | for number in self.grades.values(): 70 | for grade in number: 71 | grades_sum += grade 72 | marks_total += 1 73 | avr_grade = grades_sum / marks_total 74 | return round(avr_grade, 2) 75 | 76 | def __str__(self): 77 | return f"Имя: {self.name}\nФамилия: {self.surname}\n" \ 78 | f"Средняя оценка за лекции: {self.average_grade()}\n" 79 | 80 | def __lt__(self, other): 81 | if not isinstance(other, Lector): 82 | return "Сравнение невозможно" 83 | return self.average_grade() < other.average_grade() 84 | 85 | def __gt__(self, other): 86 | if not isinstance(other, Lector): 87 | return "Сравнение невозможно" 88 | return self.average_grade() > other.average_grade() 89 | 90 | def __eq__(self, other): 91 | if not isinstance(other, Lector): 92 | return "Сравнение невозможно" 93 | return self.average_grade() == other.average_grade() 94 | 95 | 96 | class Reviewer(Mentor): 97 | def __init__(self, name, surname): 98 | super().__init__(name, surname) 99 | 100 | def give_mark(self, student, course, grade): 101 | if grade in range(1, 11): 102 | if isinstance(student, 103 | Student) and course in self.courses_attached and course in student.courses_in_progress: 104 | if course in student.grades: 105 | student.grades[course] += [grade] 106 | else: 107 | student.grades[course] = [grade] 108 | else: 109 | return 'Error' 110 | else: 111 | return 'Error' 112 | 113 | def __str__(self): 114 | return f"Имя: {self.name}\n"\ 115 | f"Фамилия: {self.surname}\n" 116 | 117 | 118 | first_student = Student('Bobbi', 'Kotik', 26) 119 | first_student.courses_in_progress += ['Python'] 120 | first_student.courses_in_progress += ['Java'] 121 | 122 | second_student = Student('Keanu', 'Rewez', 18) 123 | second_student.courses_in_progress += ['Python'] 124 | second_student.courses_complete += ['C++'] 125 | 126 | third_student = Student('Trevor', 'Smith', 41) 127 | third_student.courses_in_progress += ['Java'] 128 | third_student.courses_in_progress += ['C++'] 129 | 130 | good_teacher = Lector('Vic', 'Miller') 131 | good_teacher.courses_attached += ['Python'] 132 | 133 | bad_teacher = Lector('Mike', 'Brown') 134 | bad_teacher.courses_attached += ['Java'] 135 | bad_teacher.courses_attached += ['C++'] 136 | 137 | good_reviewer = Reviewer('Misha', 'Shkredov') 138 | good_reviewer.courses_attached += ['Python'] 139 | good_reviewer.courses_attached += ['Java'] 140 | 141 | bad_reviewer = Reviewer('Vitalii', 'Kazunov') 142 | bad_reviewer.courses_attached += ['Java'] 143 | bad_reviewer.courses_attached += ['Python'] 144 | bad_reviewer.courses_attached += ['C++'] 145 | 146 | good_reviewer.give_mark(first_student, 'Python', 10) 147 | good_reviewer.give_mark(first_student, 'Python', 10) 148 | good_reviewer.give_mark(first_student, 'Python', 9) 149 | good_reviewer.give_mark(first_student, 'Python', 9) 150 | good_reviewer.give_mark(first_student, 'Java', 10) 151 | good_reviewer.give_mark(first_student, 'Java', 10) 152 | good_reviewer.give_mark(first_student, 'Java', 10) 153 | good_reviewer.give_mark(first_student, 'Java', 10) 154 | 155 | good_reviewer.give_mark(second_student, 'Python', 7) 156 | good_reviewer.give_mark(second_student, 'Python', 9) 157 | good_reviewer.give_mark(second_student, 'Python', 8) 158 | good_reviewer.give_mark(second_student, 'Python', 7) 159 | 160 | bad_reviewer.give_mark(third_student, 'C++', 1) 161 | bad_reviewer.give_mark(third_student, 'C++', 4) 162 | bad_reviewer.give_mark(third_student, 'C++', 5) 163 | bad_reviewer.give_mark(third_student, 'C++', 2) 164 | bad_reviewer.give_mark(third_student, 'Java', 8) 165 | bad_reviewer.give_mark(third_student, 'Java', 6) 166 | bad_reviewer.give_mark(third_student, 'Java', 3) 167 | bad_reviewer.give_mark(third_student, 'C++', 7) 168 | 169 | 170 | first_student.rate_lector(good_teacher, 'Python', 10) 171 | first_student.rate_lector(good_teacher, 'Python', 10) 172 | first_student.rate_lector(good_teacher, 'Python', 10) 173 | first_student.rate_lector(good_teacher, 'Python', 10) 174 | first_student.rate_lector(bad_teacher, 'Java', 4) 175 | first_student.rate_lector(bad_teacher, 'Java', 3) 176 | first_student.rate_lector(bad_teacher, 'Java', 7) 177 | first_student.rate_lector(bad_teacher, 'Java', 5) 178 | 179 | second_student.rate_lector(good_teacher, 'Python', 9) 180 | second_student.rate_lector(good_teacher, 'Python', 8) 181 | second_student.rate_lector(good_teacher, 'Python++', 8) 182 | second_student.rate_lector(good_teacher, 'Python', 9) 183 | second_student.rate_lector(bad_teacher, 'C++', 6) 184 | second_student.rate_lector(bad_teacher, 'C++', 3) 185 | second_student.rate_lector(bad_teacher, 'C++', 4) 186 | second_student.rate_lector(bad_teacher, 'C++', 8) 187 | 188 | third_student.rate_lector(bad_teacher, 'Java', 3) 189 | third_student.rate_lector(bad_teacher, 'Java', 4) 190 | third_student.rate_lector(bad_teacher, 'Java', 1) 191 | third_student.rate_lector(bad_teacher, 'Java', 2) 192 | third_student.rate_lector(bad_teacher, 'Java', 5) 193 | 194 | 195 | first_student.average_grade() 196 | second_student.average_grade() 197 | third_student.average_grade() 198 | good_teacher.average_grade() 199 | bad_teacher.average_grade() 200 | 201 | print(first_student) 202 | print(second_student) 203 | print(third_student) 204 | print(bad_teacher) 205 | print(good_teacher) 206 | print(good_reviewer) 207 | print(bad_reviewer) 208 | print('Сравнение средней оценки студентов:') 209 | print(f'Средняя оценка {first_student.name} {first_student.surname}' 210 | f' {"<" if first_student.average_grade() < second_student.average_grade() else ">" if first_student.average_grade() > second_student.average_grade() else "="}' 211 | f' чем у {second_student.name} {second_student.surname}') 212 | print(f'Средняя оценка {first_student.name} {first_student.surname}' 213 | f' {"<" if first_student.average_grade() < third_student.average_grade() else ">" if first_student.average_grade() > third_student.average_grade() else "="}' 214 | f' чем у {third_student.name} {third_student.surname}') 215 | print() 216 | print('Сравнение средней оценки лекторов:') 217 | print(f'Средняя оценка {good_teacher.name} {good_teacher.surname}' 218 | f' {"<" if good_teacher.average_grade() < bad_teacher.average_grade() else ">" if good_teacher.average_grade() > bad_teacher.average_grade() else "="}' 219 | f' чем у {bad_teacher.name} {bad_teacher.surname}') 220 | print() 221 | 222 | student_list = [first_student, second_student, third_student] 223 | course_selection = input('Укажите название курса для подсчёта средней оценки домашних заданий:') 224 | 225 | 226 | def course_average_grade(students, course): 227 | course_grades_sum = 0 228 | course_grade_num = 0 229 | for student in students: 230 | if course in student.courses_in_progress or course in student.courses_complete: 231 | for number in student.grades[course]: 232 | course_grades_sum += number 233 | course_grade_num += 1 234 | avr_grade = course_grades_sum / course_grade_num 235 | return print(f'Средняя оценка за домашние задания по всем студентам курса {course} {round(avr_grade, 2)}') 236 | 237 | 238 | course_average_grade(student_list, course_selection) 239 | print() 240 | lector_list = [good_teacher, bad_teacher] 241 | course_selection = input('Укажите название курса для подсчёта средней оценки за лекции: ') 242 | 243 | 244 | def course_average_grade(lector, course): 245 | course_grades_sum = 0 246 | course_grade_num = 0 247 | for teacher in lector: 248 | if course in teacher.courses_attached: 249 | for number in teacher.grades[course]: 250 | course_grades_sum += number 251 | course_grade_num += 1 252 | avr_grade = course_grades_sum / course_grade_num 253 | return print(f'Средняя оценка за лекции всех лекторов курса {course} {round(avr_grade, 2)}') 254 | 255 | 256 | course_average_grade(lector_list, course_selection) 257 | --------------------------------------------------------------------------------