typestar

grade_report.m in Objective-C

Report cards from a Student class, a comparator, and 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;
}

How it works

  1. Student pairs @property storage with a factory constructor.
  2. average folds the boxed scores back into a double.
  3. A guard-clause ladder in letter maps averages to grades.

Keywords and builtins used here

The run, in numbers

Lines
60
Characters to type
1479
Tokens
425
Three-star pace
60 tpm

At the three-star pace of 60 tokens a minute, this run takes about 425 seconds.

Type this snippet

Step 2 of 3 in Encore, step 26 of 27 in Language basics.

← Previous Next →