typestar

grade_report.m en Objective-C

Boletines desde una clase Student, un comparador y format strings.

// Average each student's scores and print a letter-grade report card.
#import <Foundation/Foundation.h>

@interface Student : NSObject
@property (copy) NSString *name;
@property (copy) NSArray<NSNumber *> *scores;
+ (instancetype)name:(NSString *)name scores:(NSArray<NSNumber *> *)s;
- (double)average;
@end

@implementation Student
+ (instancetype)name:(NSString *)name scores:(NSArray<NSNumber *> *)s {
    Student *made = [[Student alloc] init];
    made.name = name;
    made.scores = s;
    return made;
}
- (double)average {
    double sum = 0;
    for (NSNumber *score in self.scores) {
        sum += [score doubleValue];
    }
    return sum / (double)[self.scores count];
}
@end

static NSString *letter(double avg) {
    if (avg >= 90) return @"A";
    if (avg >= 80) return @"B";
    if (avg >= 70) return @"C";
    if (avg >= 60) return @"D";
    return @"F";
}

int main(void) {
    @autoreleasepool {
        NSArray<Student *> *roster = @[
            [Student name:@"Ada" scores:@[ @92, @88, @97 ]],
            [Student name:@"Grace" scores:@[ @84, @91, @78 ]],
            [Student name:@"Alan" scores:@[ @70, @66, @74 ]],
            [Student name:@"Edsger" scores:@[ @58, @67, @61 ]],
        ];

        NSArray<Student *> *sorted = [roster
            sortedArrayUsingComparator:^(Student *a, Student *b) {
                return [a.name compare:b.name];
            }];

        NSLog(@"student  avg grade");
        double total = 0;
        for (Student *s in sorted) {
            NSLog(@"%-8s %4.1f  %@", [s.name UTF8String],
                  [s average], letter([s average]));
            total += [s average];
        }
        NSLog(@"Class average: %.1f",
              total / (double)[roster count]);
    }
    return 0;
}

Cómo funciona

  1. Student une almacenamiento @property con un constructor fábrica.
  2. average pliega los puntajes encajonados de vuelta a double.
  3. Una escalera de guardas en letter mapea promedios a notas.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
60
Caracteres a escribir
1479
Tokens
425
Ritmo de tres estrellas
60 tpm

Al ritmo de tres estrellas de 60 tokens por minuto, este intento toma unos 425 segundos.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →