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
- El roster son asociaciones nombre -> puntajes.
letterFores un bloque: una escalera ifTrue: que responde la letra.inject:into:junta cada puntaje para el promedio del curso.
Palabras clave y builtins usados aquí
new
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.
Paso 2 de 3 en Bis; paso 30 de 31 en Fundamentos del lenguaje.