Vector求期末成績

#include<iostream>
#include <string>
#include <stdexcept>
#include <iomanip>
#include <algorithm>
#include <vector>
using namespace std;

//求排序後家庭作業成績中的中間成績
double median(vector<double> vec)
{
	typedef vector<double>::size_type vec_size;
	vec_size size = vec.size();
	if (size == 0)
		throw domain_error("沒有做一門家庭作業!---在求中間值函數中");
	sort(vec.begin(),vec.end());
	vec_size 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>& homework)

{
	if( homework.size() == 0)
		throw domain_error("沒有做過一門家庭作業!");

	return grade(midterm, final, median(homework));
}

//讀取家庭作業成績
istream& read_hw(istream& in,vector<double>& hw
{
	if(in)
	{
		hw.clear();
		double x;
		while (in>>x)
			hw.push_back(x);
		in.clear();
	}

	return in;
}


int main()
{
	cout<<"請輸入您的姓名:";
	string name;
	cin>>name;

	double midterm, final;
	cout<<"請輸入期中、期末成績:";
	cin>>midterm>>final;
	
	cout<<"請輸入家庭作業成績用EOF結束:";
	vector<double> homework;
	read_hw(cin,homework);

	try
	{
		double final_grade = grade(midterm, final, homework);
		streamsize prec = cout.precision();
		cout<<"你最終的期末成績:"<<setprecision(5)<<final_grade<<setprecision(prec)<<endl;
	}
	catch(domain_error)
	{
		cout<<"你必須輸入你的家庭作業成績!"<<endl;
	}

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章