Student_info. H.

#ifndef GUARD_Student_info

#define GUARD_Student_info

//Student_info.h header file

#include <iostream>

#include <string>

#include <vector>

struct Student_info{

 std::string name;

 double midterm, final;

 std::vector<double> homework;


bool compare(const Student_info&, const Student_info&);

std::istream& read_hw(std::istream&, std::vector<double>&);

std::istream& read(std::istream&, Student_info&);


Student_info. Cpp.

//source file for Student_info-related functions

#include <vector>

#include <iostream>


using std::cout; using std::vector; using std::istream;

bool compare(const Student_info& x, const Student_info& y) {

 return <;


istream& read_hw(istream& in, vector<double>& hw) {

 //read and store the homework grades

 cout <<"Enter all your homework grades,"

 "followd by end-of-file:";

 if (in) {

 //get rid of previous contents


 //read homework grades

 double x;

 while (in>> x)


 //clear the stream so that input will work for the next student



 return in;


istream& read(istream& is, Student_info& s) {

 //read and store the student's name and midterm and final exam grades

 cout <<"Please enter your first name, midterm and final exam grades:";

 is>>>> s.midterm>>;

 read_hw(is, s.homework);

 return is;


Grade. H.

#ifndef GUARD_grade_h

#define GUARD_grade_h


#include <vector>

double median(std::vector<double>);

double grade(double, double, double);

double grade(double, double, const std::vector<double>&);

double grade(const Student_info&);


Grade. Cpp.

//source file for the grade-ralated functons

#include <vector>

#include <stdexcept>



using std::vector; using std::domain_error; using std::sort;

double median(vector<double> vec) {

 typedef vector<double>::size_type vec_sz;

 vec_sz size = vec.size();

 if (size == 0)

 throw domain_error("median of an empty vector");

 sort(vec.begin(), vec.end());

 vec_sz mid = size/2;

 return size % 2 == 0? (vec[mid - 1] + vec[mid])/2 : vec[mid];


double grade(double midterm, double final, double homework) {

 return 0.2 * midterm + 0.4 * final + 0.4 * homework;


double grade(double midterm, double final, const vector<double>& hw) {

 if (hw.size() == 0)

 throw domain_error("student has done no homework");

 return grade(midterm, final, median(hw));


double grade(const Student_info& s) {

 return grade(s.midterm,, s.homework);


Main. Cpp.

#include <algorithm>

#include <iomanip> //setprecision

#include <ios> //streamsize 

#include <iostream>

#include <stdexcept>

#include <string>



using std::vector; using std::sort; using std::string; using std::endl;

using std::domain_error; using std::cin; using std::cout; using std::max;

using std::streamsize; using std::setprecision;

int main(){

 vector<Student_info> students;

 Student_info record;

 string::size_type maxlen = 0;

 //read and store all the students' data

 //Invariant: students contains all the student records read so far

 //maxlen contains the length of the longest name in students

 while (read(cin, record)) {

 //find length of longest name

 maxlen = max(maxlen,;



 //alphabetize the student records

 sort(students.begin(), students.end(), compare);

 //write the names and grades

 for (vector<Student_info>::size_type i = 0; i!= students.size(); ++i){

 //write the name, padded on the right to maxlen + 1 characters

 cout <<students[i].name <<string(maxlen + 1 - students[i].name.size(), ' ');

 //compute and write the grade

 try {

 double final_grade = grade(students[i]);

 streamsize prec = cout.precision();

 cout <<setprecision(3) <<final_grade <<setprecision(prec);

 } catch (domain_error e) {

 cout <<e.what();


 cout <<endl;


 return 0;


Copyright © 2011 Dowemo All rights reserved.    Creative Commons   AboutUs