// mediangrades.cpp #include #include #include #include #include #include using namespace std; void read_grades( vector &grades, ifstream &grade_stream ) { int grade; while ( grade_stream >> grade ) { grades.push_back( grade ); } } // (we're passing grades by reference to avoid a COPY) void // const means grades cannot change compute_avg_and_std_dev( const vector &grades, double &avg, double &std_dev ) { // Compute the average int sum=0; for ( unsigned int i = 0; i < grades.size(); i++ ) { sum += grades[i]; } avg = double(sum) / grades.size(); // Compute the standard deviation double sum_sq = 0.0; for ( unsigned int i = 0; i < grades.size(); i++ ) { sum_sq += ( grades[i] - avg ) * ( grades[i] - avg ); } std_dev = sqrt( sum_sq / ( grades.size() - 1 ) ); } double compute_median( const vector &grades ) //compute_median( vector grades ) { // Create a copy of the vector vector grades_to_sort( grades ); // Sort the values in the vector (default is increasing order) sort( grades_to_sort.begin(), grades_to_sort.end() ); // Compute median unsigned int n = grades_to_sort.size(); if ( n % 2 == 0 ) // even number of grades return double( grades_to_sort[ n / 2 ] + grades_to_sort[ n / 2 - 1] ) / 2.0; else return double( grades_to_sort[ n / 2 ] ); } int main( int argc, char* argv[] ) { cout << "argc is " << argc << endl; if ( argc != 2 ) { cerr << "Usage: " << argv[0] << " \n"; return 1; } // Open the grades.txt file (i.e. argv[1]) // (bail if an error occurs) ifstream grades_stream( argv[1] ); if ( !grades_stream ) { cerr << "Cannot open grades file " << argv[1] << endl; return 1; } vector grades; read_grades( grades, grades_stream ); // Quit with an error message if no grades loaded if ( grades.size() == 0 ) { cout << "No grades entered." << endl; return 1; } // Compute average, standard deviation, and median double average, std_dev; compute_avg_and_std_dev( grades, average, std_dev ); double median = compute_median( grades ); cout << "From " << grades.size() << " grades: \n" << " average is " << setprecision(3) << average << '\n' << " std_dev is " << std_dev << '\n' << " median is " << median << endl; return 0; // Everything ok }