原创 组织数据.cpp 生成报表

2009-3-16 13:46 2488 6 6 分类: 软件与OS

rar


#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <string>
#include <vector>


using std::cin;    using std::cout;
using std::endl;   using std::string;
using std::setprecision; using std::streamsize;
using std::vector;   using std::sort;
using std::domain_error; using std::istream;
using std::max;


struct Student_info {
 string name;
 double midterm, final;
 vector<double> homework;
};


istream& read_hw(istream& in, vector<double>& hw)
{
 //we must fill in this part
 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
 is >> s.name >> s.midterm >> s.final;


 read_hw(is, s.homework);
 return is;
}


// compute a student's overall grade from midterm and final exam grades and homework grade
double grade(double midterm, double final, double homework)
{
 return 0.2 * midterm + 0.4 * final + 0.4 * homework;
}


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] + vec[mid-1]) / 2 : vec[mid];
}


double grade(double midterm, double final, const vector<double>& hw)
{
 if (hw.size() == 0)
  throw domain_error("student hax done no homework");
 return grade(midterm, final, median(hw));
}


double grade(const Student_info& s)
{
 return grade(s.midterm, s.final, s.homework);
}



bool compare(const Student_info & x, const Student_info& y)
{
 return x.name < y.name;
}


int main()
{
 vector<Student_info> students;
 Student_info   record;
 string::size_type  maxlen = 0;


 //read and store all the records, and find the length of the longest name
 while ( read(cin, record) ) {
  maxlen = max(maxlen, record.name.size());
  students.push_back(record);
 }


 //alphabetize the records
 sort(students.begin(), students.end(), compare);


 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.name
    << string(maxlen + 1 - students.name.size(), ' ');


   //compute and write the grade
   try {
    double final_grade = grade(students);
    streamsize prec = cout.precision();
    cout << setprecision(3) << final_grade
      << setprecision(prec);
   } catch (domain_error e) {
    cout << e.what();
   }
   cout << endl;
 }
 system("PAUSE");
 return 0;
}


/*
Duck 3.75 3.75 5.0 4.9 1.0 3.8
yannzi 3.9 3.8 4.8 4.9 4.2
Agirl 2.0 2.1 5.0 5.0 5.0
*/


dae59a3d-1057-476f-b561-fec8819166d0.jpg

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条