Write a program that reads a text file containing a set of test scores. Each lin
ID: 3712676 • Letter: W
Question
Write a program that reads a text file containing a set of test scores. Each line in the file contains scores of a specific student. For example, the first line has the scores for the first student and so forth. Average the scores for each student and save them in a vector of final scores. Then sort the final scores to calculate the class average and median. Print the final scores sorted from least to greatest, the class average and median. Detailed set of requirements: File processing: Program should try to open a file using a default file path first, then check if it was successful, if not, ask the user for a different file name/path and try again until it succeeds. Do not try to process a file that you could not open. Remember to close the file when done reading. To make sure you process each student's scores separately, read each line from the file using the getline function. You can find an example on how to use getline here: http://www.cplusplus.com/forum/beginner/11304/ Convert each line, which should be a string, to a string stream, so it can be used as a source for the individual test scores: stringstream lineStream(line) // line is the string read from the file. Read the individual scores from the lineStream variable as you would from an ifstream. Store all final scores in a vector (not an array!). To add values to a vector, use function push_back. Sort the data using the sort function (you will need this for the median) Refer to http://www.cplusplus.com/reference/algorithm/sort/ to learn how to use sort. Calculate the average and median of the values in the vector. Average is calculated by adding all data points then dividing by the number of data points. Median is the data point in the middle after you have sorted them. If there is an odd number of data points, there will be only one in the middle. If there is an even number of data points, the median is the average of the two in the middle. Your algorithm must work for both cases. Define separate functions to calculate and return average and median. Define a seprate function to print the required info on the screen: This function should receive the vector, the average and median as parameters. Use a range-based for loop to print the scores in the vector. Do not use global variables.
Explanation / Answer
Given below is the code for the question.
Please do rate the answer if it was helpful. Thank you
input file: scores.txt
----------------
78 89 80
76 80 90
69 80 79
main.cpp
--------
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <iomanip>
using namespace std;
void readFile(string filename, vector<double> &finals);
double average(const vector<double> &finals);
double median(vector<double> finals);
void display(const vector<double> &finals, double avg, double median);
int main()
{
string filename;
vector<double> final_scores;
double avg, med;
cout << "Enter input filename: ";
cin >> filename;
readFile(filename, final_scores);
avg = average(final_scores);
med = median(final_scores);
display(final_scores, avg, med);
}
void readFile(string filename, vector<double> &finals)
{
ifstream infile(filename.c_str());
if(infile.fail())
{
cout << "ERROR: could not open input file " << filename << endl;
exit(1);
}
string line;
double avg, score;
int n;
while(getline(infile, line)) //get the line of scores for a student
{
avg = 0;
n = 0;
stringstream lstream(line);
while(lstream >> score) //calculate average of scores for a single student and push the average into finals
{
avg += score;
n++;
}
avg /= n;
finals.push_back(avg);
}
infile.close();
}
double average(const vector<double> &finals)
{
double avg = 0;
for(int i = 0; i < finals.size(); i++)
avg += finals[i];
avg /= finals.size();
return avg;
}
double median(vector<double> finals)
{
double median;
int mid = finals.size() / 2;
sort(finals.begin(), finals.end());
if(finals.size() % 2 == 1) //odd length
median = finals[mid];
else
median = (finals[mid] + finals[mid-1])/2; //average of middle 2 values
return median;
}
void display(const vector<double> &finals, double avg, double median)
{
cout << "The scores for the students is" << endl;
cout << fixed << setprecision(2);
for(int i =0; i < finals.size(); i++)
{
cout << (i+1) << ". " << finals[i] << endl;
}
cout << endl << "The average score is " << avg << endl;
cout << "The median score is " << median << endl;
}
output
======
The scores for the students is
1. 82.33
2. 82.00
3. 76.00
The average score is 80.11
The median score is 82.00
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.