typestar

grade_report.st en Smalltalk

Boletines desde asociaciones, una escalera de bloques y relleno.

"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.

Cómo funciona

  1. El roster son asociaciones nombre -> puntajes.
  2. letterFor es un bloque: una escalera ifTrue: que responde la letra.
  3. inject:into: junta cada puntaje para el promedio del curso.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
30
Caracteres a escribir
914
Tokens
200
Ritmo de tres estrellas
55 tpm

Al ritmo de tres estrellas de 55 tokens por minuto, este intento toma unos 218 segundos.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 30 de 31 en Fundamentos del lenguaje.

← Anterior Siguiente →