(* * * Module Predict defines the objects and operations related to * predicting student grades using a gradesheet and an input * *) module Predict; from Gradesheet import Gradesheet, StudentInfo, GradedItem; (* *This function takes in two types of user entered grades Letter or Numbers. *Since the user may mix and match the grades with numbers and letter values *we only need one function that will produce letter grades or percentage *average values needed to attain a certain grade. *) operation PredictBoth in: g: Gradesheet, ul: UserDefinedLetterGrade, si:StudentInfo; out: si':StudentInfo; description: (* Puts X's for unimportant student info, and uses predictAll function for all values of UserDefinedLetterGrade and UserDefinedGradedItems. *); pre: exists (gi in si.GradedItem) gi =nil; post: if(ul!=nil) then si'.Grade = UserDefinedScore(si)/SumWeightsPossible(si) else forall(x:integer|(x>=1) and (x<#si.GradedItem)) if(si.GradedItem[x]=nil) then si'.GradedItem[x].Points = (GetPercentNeeded(si,ul)*si.GradedItem[x].pointsPossible); end PredictBoth; object UserDefinedLetterGrade components: ; description: (* This is when the user inputs a final letter grade desired, it may be any letter A to F with A-, B+-, C+-, D+-, and F as valid inputs. *); end UserDefinedLetterGrade; function UserDefinedScore(si:StudentInfo) = ( if (#si =0) then if (si[1] !=nil) then si.GradedItem[1].Points*si.GradedItem[1].Weight + UserDefinedScore(si[2:#si]) else UserDEfinedScore(si[2:#si]) else 0; ) end; function SumWeightsPossible(si:StudentInfo) = ( if (#si =0) then if (si.GradedItem[1]=nil) then si.gradedItem[1].Weight + SumWeightsPossible(si[2:#si]) else SumWeightsPossible(si[2:#si]) else 0; ) end; function GetPercentNeeded(si:studentInfo, ul:UserDefinedLetterGrade) = ( ul-UserDefinedScore(si); ) end; end Predict;