| 327 | | == Review == |
| 328 | | |
| 329 | | Optionally, one or more '''review''' attributes can be given. |
| 330 | | Each specifies a grade threshold X and a list of review units. |
| 331 | | If the student's grade on the exercise set is less than some Y, |
| | 331 | == Exercise review and repeat == |
| | 332 | |
| | 333 | The "repeat" items in an exercise set determine the student's options |
| | 334 | to review for and repeat the exercise set. |
| | 335 | ( |
| | 336 | Each repeat item is a function call of the form |
| | 337 | {{{ |
| | 338 | repeat(grade_threshold, review_unit, review_optional, repeat_optional); |
| | 339 | }}} |
| | 340 | The arguments are: |
| | 341 | * grade_threshold: the highest grade to which this item applies |
| | 342 | * review_unit: a unit that reviews the material assessed by for the exercise set. |
| | 343 | * review_unit: whether the review is optional. |
| | 344 | * repeat_optional: whether repeating the exercise set is optional |
| | 345 | |
| | 346 | A student's score on an exercise set is the average score of the selected exercises. |
| | 347 | Call this Y; |
| | 348 | the "selected repeat item" is the one with the greatest X such that Y < X. |
| | 349 | |
| | 350 | If there is no such repeat item, the student is not given an option |
| | 351 | to repeat the exercise set; i.e., they see only a Next button. |
| | 352 | |
| | 353 | Otherwise let R be the selected repeat item. |
| | 354 | If R.repeat_optional is true, the student sees |