typestar

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

  1. The roster is name -> scores associations.
  2. letterFor is a block: an ifTrue: ladder that answers a letter.
  3. inject:into: pools every score for the class average.

Keywords and builtins used here

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.

Type this snippet

Step 2 of 3 in Encore, step 30 of 31 in Language basics.

← Previous Next →