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
Studentpairs @property storage with a factory constructor.averagefolds the boxed scores back into a double.- A guard-clause ladder in
lettermaps averages to grades.
Keywords and builtins used here
NSArrayNSNumberNSObjectNSStringStudentaveragecopydoubleforifininstancetypeintreturnselfstaticvoid
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.
Step 2 of 3 in Encore, step 26 of 27 in Language basics.