EXERCISE. HELPING ESCI. Unhappy with the academic software they use right now, ESCI asks you to write a program to manage courses, timetables, classrooms, and students. 1. Create a class Course. A course is defined by a string (name), and a level (an integer, 1 to N). Both properties are set when the course is created, and never change. (Note: probably at ESCI level 1 would mean Y1T1, level 6 would mean Y2T3 and so on, but let's ignore this.) 2. Create a class Student. A student has a name (which never changes once created) and a level, which can change over time. A student at level 3 can enrol in courses at levels 1, 2, 3, but not at level 4. For the moment, you are not asked to control whether a student enrolls more than once in a course, whether s/he passes or fails the course, etc. 3. Create a class Clasroom. A classroom is defined by a name (string) and a capacity (an int, number of students it can accomodate at any time). Both properties are set at creation, and do not change. 4. Create a class School. A School contains a set of courses, a set of classrooms, and a set of students. It also allows to manage a timetable, which is an assignment of courses to classrooms over the next week. It must support the operations: - add_courses(L), where L is a list of courses - add_classrooms(L), where L is a list of classrooms - add_students(L), where L is a list of students The three operations above can be called repeatedly, that is, not all courses, classrooms, or students need to be added at once. If a course, classroom, or student in L has the same name as one that already existed in the system, the new information replaces the old one. - enrol(s,c), where s and c are strings, representing the names of some student and some course. It enrolls the corresponding student in the corresponding course. Possible errors are (at least) the following: 1) s or c are not in the system. 2) s is already enroled in c. 3) the level of c is higher than that of s. - assign_classroom(c,r,d,h1,h2): assigns the course with name c to the classroom whose name is r for the slot corresponding to day d (d = 1..5) and hour range h1..h2 (h1, h2 = 0..24; no half-hours to simplify). Think of all possible errors and give appropriate error messages for each. For example, c or r do not exist, d is not 1..5, h1>=h2, room is already occupied by some other course during that slot or part of it, ... Note that a course can occupy several slots during the week (e.g., labs and theory) but cannot be in two different rooms at the same time, and the slots cannot overlap. Note also that we do not know if ESCI first enrols students to courses and then assign courses to classrooms, or the other way round, first assign courses to rooms, then enroll students. Or a mixture of both. Therefore, we may have an error if we try to place a course to a room that is too small for the number of students already assigned to it. But also if we try to enroll one more student in a course already fills to its max capacity one of the rooms assigned to it. - print_timetable(lev). Prints a timetable for the week for students of level lev. You choose your format, but you get the idea: it must tell the student which course s/he has and which room along the week, in an ordered way. - print_assignment(r). Prints a timetable indicating what is the occupation of classroom name r during the week, that is, what courses it holds every day and time of the week. - print_enrolment(c): Prints the names of the students enroled in the course whose name is c. Finally, adapt the Menu that we had from previous exercises (Hospital, Restaurant) to support the interactive testing of these classes.