Dowemo

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&);



#endif






Student_info. Cpp.


//source file for Student_info-related functions


#include <vector>


#include <iostream>


#include"Student_info.h"



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



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


 return x.name <y.name;


}



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


 hw.clear();



 //read homework grades


 double x;


 while (in>> x)


 hw.push_back(x);



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


 in.clear();


 }


 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.name>> s.midterm>> s.final;


 read_hw(is, s.homework);


 return is;


}






Grade. H.


#ifndef GUARD_grade_h


#define GUARD_grade_h



//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&);



#endif









Grade. Cpp.


//source file for the grade-ralated functons


#include <vector>


#include <stdexcept>


#include"Student_info.h"


#include"median.h"



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.final, s.homework);


}






Main. Cpp.


#include <algorithm>


#include <iomanip> //setprecision


#include <ios> //streamsize 


#include <iostream>


#include <stdexcept>


#include <string>


#include"Student_info.h"


#include"grade.h"



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, record.name.size());


 students.push_back(record);


 }



 //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