Assignment 4: Ruby scripting
Due: 5:00pm, Friday, September 21. Value: 30 pts.
Learn the basics of the Ruby programming language. One way to do this is to read pages 29 through 49 of the book Seven Languages in Seven Weeks. Or a really bizarre introduction: why's poignant guide to Ruby.
One of the most useful applications of a scripting language like Ruby (or Python) is to produce a summary of data stored in a text file. So that's what you're assigned to do. In particular, you should write a script that walks through a file for recording grades and then displays a summary of missing grades and students' total grades. (In fact, I personally use a file basically in this format with an associated Python script for generating summaries.)
As illustrated in the below example, the grades file contains three types of lines: empty lines to be ignored; lines beginning with a dollar sign, followed by the number of points that item is worth and then the item name; and lines recording a student's grade for the last-mentioned grading item followed by the student's name. You can assume that spaces separate the parts of a line; this allows you to use strings' split method to divide a line into pieces.
$ 30 Assn1 28 Alice 28 Carrie $ 30 Assn2 30 Alice 25 Bob
Your program is to produce a summary consisting of two parts: First the program should list any assignment where a student mentioned in a previous assignment does not have a grade recorded, and then it should list the number of points earned by each student, sorted by student name, followed by the total number of points possible. For example, the above example file should lead to the following output. (It does not mention Bob missing Assn1 since Bob was not mentioned previously in the file.)
Carrie did not complete Assn2 58 Alice 25 Bob 28 Carrie 60 points possible
A more complex file is available for testing. [Download.] The expected output for this file is as follows.
Eve did not complete Assn3 Krunch did not complete Assn3 Eve did not complete Assn5 Krunch did not complete Assn9 849 Alice 965 Bob 982 Carrie 817 Eve 692 Krunch 962 Spot 1000 total possible
You may find my Python implementation useful for reference. [Download.]