Dowemo
0 0 0 0

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"usingstd::cout; usingstd::vector; usingstd::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 gradescout <<"Enter all your homework grades,""followd by end-of-file:";
 if (in) {
 //get rid of previous contents hw.clear();
 //read homework gradesdouble 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 gradescout <<"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, conststd::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"usingstd::vector; usingstd::domain_error; usingstd::sort;double median(vector<double> vec) {
 typedefvector<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) {
 return0.2 * midterm + 0.4 * final + 0.4 * homework;
}double grade(double midterm, double final, constvector<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"usingstd::vector; usingstd::sort; usingstd::string; usingstd::endl;usingstd::domain_error; usingstd::cin; usingstd::cout; usingstd::max;usingstd::streamsize; usingstd::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 studentswhile (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 gradesfor (vector<Student_info>::size_type i = 0; i!= students.size(); ++i){
 //write the name, padded on the right to maxlen + 1 characterscout <<students[i].name <<string(maxlen + 1 - students[i].name.size(), ' ');
 //compute and write the gradetry {
 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;
 }
 return0;
}



Copyright © 2011 Dowemo All rights reserved.    Creative Commons   AboutUs