module CourseModule; export CourseDB; export Course; object CourseDB is components: crs:Course*; operations: addCourse, changeCourse, removeCourse; description: (* The CourseDB is the repository of Courses

UML diagram. *); end CourseDB; object Course is components: dept:Department and cNum:CourseNumber and sec:Sections and Units and Length and Conflict* and Lab*; operations: addCourseConflict, removeCourseConflict; description: (* A Course contains information about a particular course including its name number of sections units and length as well as anything special about it for example labs and conflicting courses *); end Course; object Department is string; object CourseNumber is integer; object Sections is integer; object Units is integer; object Lab is Length and Options; object Options is Multimedia and OS and Database and AI and Networks and Other; object Multimedia is boolean; object OS is boolean; object Database is boolean; object AI is boolean; object Networks is boolean; object Other is check and text; object check is boolean; object text is string; object Conflict is components: cdept:ConflictDepartment and ccn:ConflictCourseNumber; description: (* A Conflict contains the department and Course number of a class the user does not want scheduled at the same time *); end Conflict; object ConflictDepartment is string; object ConflictCourseNumber is integer; object Length is components: Hours, Minutes; description: (* Time is in Hours and Minutes *); end Length; object Hours is integer; object Minutes is integer; operation AddCourse is inputs: c:Course, cdb:CourseDB; outputs: cdb':CourseDB; precondition: (* * There is no Course with the same Department and CourseNumber * as the course to be added *) (not (exists (c' in cdb)((c'.dept = c.dept) and (c'.cNum = c.cNum)))) and (* * The Department is not nil and 3 chars long *) (c.dept != nil) and (#(c.dept) = 3) and (* * The Course number is not nill and is between 100 and 599 *) (c.cNum != nil) and ((c.cNum >= 100) and (c.cNum < 600)); postcondition: (* * The given Course is in the output CourseDB iff it is the new one or was * already in the CourseDB * ) forall(c':Course) (c' in cdb') iff ((c' = c) or (c' in cdb)); description: (* AddCourse adds the particular course to the course database, producing an updated course database *); end AddCourse; operation ChangeCourse is inputs: newC:Course, oldC:Course, cdb:CourseDB; outputs: cdb':CourseDB; precondition: (* * The old and new Courses are not the same *) (oldC != newC) and (* * The old Course is in the CourseDB *) (oldC in cdb) and (* * Ther is no Course with the same Dept and Course # * as the new Course *) (not (exists (newC' in cdb)((newC'.dept = newC.dept) and (newC'.cNum = newC.cNum)))) and (* * The Department is not nil and 3 chars long *) (newC.dept != nil) and (#(newC.dept) = 3) and (* * The Course number is not nill and is between 100 and 599 *) (newC.cNum != nil) and ((newC.cNum >= 100) and (newC.cNum < 600)); postcondition: (* * A Course is in the output db iff it is the new record to be added * or it was already there and not the same as the old Course *) forall (c' in cdb') (c' in cdb') iff (((c' = newC) or (c' in cdb)) and (c' != oldC)); description: (* Change a course that is already in the database *); end ChangeCourse; operation RemoveCourse is inputs: c:Course, cdb:CourseDB; outputs: cdb':CourseDB; precondition: (* * The Course is in the Database *) (c in cdb); postcondition: (* * A Course is in output DB only if it is not the input Course * and if it in the input DB *) (forall (c':Course) (c' in cdb') iff ((c' != c) and (c' in cdb))); description: (* RemoveCourse removes the particular course to the course database, producing an updated course database *); end RemoveCourse; operation AddCourseConflict is inputs: c:Course, con:Conflict, cdb:CourseDB; outputs: c':Course; precondition: (* * The Conflict is not already listed * * and * * The Conflicting course is in the CourseDB *) (* * The Conflict Department is not nil and 3 chars long *) (con.cdept != nil) and (#(con.cdept) = 3) and (* * The Conflict Course number is not nill and is between 100 and 599 *) (con.ccn != nil) and ((con.ccn >= 100) and (con.ccn < 600)); postcondition: (* * The Conflict course is in the Course * * forall (con':c) * (con' in c') iff ((con' = con) or (con' in c)); *); description: (* AddCourseConflict adds a conflict to the course then, producing an updated course *); end AddCourseConflict; operation RemoveCourseConflict is inputs: Course, Conflict; outputs: Course; precondition: (*Coming Soon*); postcondition: (*Coming Soon*); description: (* RemoveCourseConflict adds a conflict to the course then, producing an updated course *); end RemoveCourseConflict; object LocalCourse inherits from Course components: CourseUsed; description: (* A CourseRoom is all the things the room is and if it is being used. *); end LocalCourse; object CourseUsed is boolean; end CourseModule;