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
Studentune almacenamiento @property con un constructor fábrica.averagepliega los puntajes encajonados de vuelta a double.- Una escalera de guardas en
lettermapea promedios a notas.
Palabras clave y builtins usados aquí
NSArrayNSNumberNSObjectNSStringcopydoubleforifininstancetypeintreturnselfstaticvoid
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.
Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.