Question
Assignment: Grade Processor Your task for this lab is to complete the implementation of a program that processes a .csv file containing raw grade data,
Assignment: Grade Processor
Your task for this lab is to complete the implementation of a program that processes a .csv file containing raw grade data, and produces a report file as a .txt.
Starter Code
The framework of the program has been given to you in the starter code, including useful constants, function prototypes, and the main() function.
The parts of the program that you need to complete have been marked with comments:
// TODO (n): ...
Input File Format
The input file will be formatted as follows:
- Columns, also known as fields, are separated by commas and rows, also known as records, are separated by newlines
- Note: files formatted in this way can be opened and viewed as a table with a program such as MS Excel or Open Office
- The first row will be a header for the file containing titles for each field and should be ignored
- All other rows will be student records consisting of comma-separated fields:
- student name
- student ID
- test scores
- The test scores will be a comma-separated list of 4 test results
For example, the beginning of such a file might look like this:
Name, ID, score1, score2, score3, score4 Fred Flintstone,q5563w,70,82,55,80 Barney Rubble,q5771x,65,62,0,71
You will have to parse, or separate out, each field from a given line of text.
Output File Format
The output file will be a neatly formatted report showing the student name, their four scores, the lowest score (dropped), the total score, average, and resulting grade letter.
For example, given the input above, the report would look like this:
Name Scores (Low) Total Average Grade ------------------------ ---------------- ----- ----- ------- ----- Fred Flintstone 70 82 55 80 ( 55) 232 77.33 C Barney Rubble 65 62 0 71 ( 0) 198 66.00 D
Note that various field widths have been defined as constants near the top of the source file. Be sure to use these named constants, rather than hard-coding "magic numbers" when you get to writing the code to output the formatted record.
Implementing the helper functions
The program is written in a modular way, using functions to "abstract" away details, so that the overall flow of the program is easy to understand. The main() function calls other functions to do the actual work.
Your job is to fill in the details by implementing many of these "helper" functions.
The Top-Level Functions
string getInputFilename()
The program starts by asking the user for the name of the input file. To do this it invokes the getInputFilename() function. This function should:
- Prompt the user to enter a filename.
- Validate that the filename has the form:
- "rawgrades-
.csv" - where
identifies the class to which it pertains. - ..for example, the above input file might be named "rawgrades-bw101.csv".
- "rawgrades-
- Continue prompting the user for a filename until a valid one is given.
- Return the validated filename.
Sample run:
Enter input filename (rawgrades-.csv): what Enter input filename (rawgrades- .csv): what.csv Enter input filename (rawgrades- .csv): rawgrades.csv Enter input filename (rawgrades- .csv): rawgrades-bw101.csv Processing rawgrades-bw101.csv... Report written to grade-report-bw101.txt
string deriveOutputFilename()
This function takes an input filename as a parameter and should return the corresponding output filename. The format of the output filename is grade-report-
bool openFiles()
This function opens the input and output files, associating the files with the provided input/output file streams.
If the input file fails to open, the following message should be output before the function returns false:
Failed to open for read:
If the output file fails to open, the following message should be output before the function returns false:
Failed to open for write:
The function should return true only if both files opened successfully. Returning false signals to the main program that some error occurred and that the run should be aborted.
void processGradeFile()
This function has been implemented for you. It writes the report header (invoking a function also written for you), then loops over the lines read in from the input file, invoking processLine(...) for each one.
Helper Functions
To break the problem down into manageable pieces, helper functions have been defined to solve small, specific tasks. These will need to be implemented correctly, and called from the appropriate places to complete the project.
You'll find them in the starter code, but as a quick summary:
// Returns true if fname is of the form "rawgrades-.csv" bool validInputFilename(const string &fname) // Parses a record (line), placing the substrings into name, id, scores, and s1...s4 void parseStudentRecord(const string &line, string &name, string &id, int &s1, int &s2, int &s3, int &s4) // Returns the smaller of the two values int min(int a, int b) // Returns the smallest of all the values int min(int a, int b, int c, int d) // Returns a letter grade for the given score char gradeFromScore(double score) // Processes a line read from the raw-grades input file void processLine(ostream &out, const string &line) // Writes the report header to the given output file stream (ALREADY DONE) void writeReportHeader(ofstream &out)
Some notes on parseStudentRecord:
- Given a line of text, stored in the variable line, you must extract the substrings that are separated by commas. There are a couple of approaches you can take for this:
- Method 1:
- Load the line into a stringstream
- Use the overload of getline that takes an optional delimiter. This causes getline to read up to a comma instead of a newline
- Method 2:
- Use use .find to find commas, then use .substr to extract substrings from in between those commas
- Method 1:
- Once you have extracted the scores as strings, you will have to convert them to ints.
- For this you can use either stoi (string to int) or a stringstream.
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started