grade_report.st in Smalltalk
Report cards from associations, a block ladder, and padding.
"Average each student's scores and print a letter-grade report."
| roster letterFor |
roster := OrderedCollection new.
roster add: 'Ada' -> #(92 88 97).
roster add: 'Grace' -> #(84 91 78).
roster add: 'Alan' -> #(70 66 74).
roster add: 'Edsger' -> #(58 67 61).
letterFor := [:avg |
avg >= 90 ifTrue: ['A'] ifFalse: [
avg >= 80 ifTrue: ['B'] ifFalse: [
avg >= 70 ifTrue: ['C'] ifFalse: [
avg >= 60 ifTrue: ['D'] ifFalse: ['F']]]]].
Transcript show: 'student avg grade'; cr.
(roster asSortedCollection: [:a :b | a key < b key]) do: [:entry |
| avg |
avg := entry value average asFloat.
Transcript
show: (entry key padRightTo: 8);
show: ' ';
show: (avg printShowingDecimalPlaces: 1);
show: ' ';
show: (letterFor value: avg);
cr].
Transcript show: 'Class average: ',
((roster inject: OrderedCollection new into: [:all :entry |
all addAll: entry value; yourself]) average asFloat
printShowingDecimalPlaces: 1); cr.
How it works
- The roster is name -> scores associations.
letterForis a block: an ifTrue: ladder that answers a letter.inject:into:pools every score for the class average.
Keywords and builtins used here
OrderedCollectionTranscriptasFloataveragecrkeynewvalueyourself
The run, in numbers
- Lines
- 30
- Characters to type
- 914
- Tokens
- 200
- Three-star pace
- 55 tpm
At the three-star pace of 55 tokens a minute, this run takes about 218 seconds.
Step 2 of 3 in Encore, step 30 of 31 in Language basics.