Problem : 来算一下自己的成绩吧!
Description
OJ是一个同学们又爱又恨的东东。老师在OJ上布置了作业,并且把作业成绩作为实验课程的成绩。马上就要结课了,小明想知道自己到底能得到多少分,所以他向老师请教分数的计算方法。老师告诉他,分数是这么算滴:
1. 对于某次作业,假设所有同学中Accpted题目数最多为X,小明Accpted题目数为Y,那么这次作业小明得分100Y/X。
2. 如果小明不幸错过了某次作业或者没有题目被Accpted,那么为0分。
3. 最终成绩是所有作业成绩的平均分。
好了,小明从OJ上下载了所有的standing,发现要想计算成绩还是挺麻烦的。所以,他向你求助,请你帮忙编个程序,算算分数。
Input
第1行N>0,表示本年级、本专业的学生数。
之后N行,每行是一个不含空白符的字符串,是一个学生的名字(假定没有重名,且姓名最多有10个字符)。
接着是M>0,表示老师总共布置的作业次数。
每次作业的输入中,第1行K>0,表示这次作业的standing中有提交记录的学生人数。之后K行是K个学生的姓名及其Accpted的题目数。
Output
第1行输出:NAME TEST1 TEST2 TEST3 ...... FINAL。
其中,“TEST?”的个数等于作业次数,按照顺序依次输出,如上所示。
之后根据输入的专业学生姓名顺序,依次输出所有学生的每次作业成绩以及最终成绩。
所有输出左对齐。
成绩保留2位小数,且左对齐输出。
输出的每一列的第1个字符要对齐。
见样例。
Sample Input
Sample Output
HINT
Append Code
#include <iomanip>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
class Student
{
private:
string name;
vector<double> scores;
double finalScore;
public:
Student(string n)
{
name = n;
}
void addAScore(double s)
{
scores.push_back(s);
}
void compute()
{
double sum = 0;
vector<double>::iterator iter;
for(iter = scores.begin(); iter < scores.end(); iter++)
{
sum += *iter;
}
finalScore = sum / scores.size();
}
double getFinalSocre()
{
return finalScore;
}
string getName()
{
return name;
}
void show()
{
vector<double>::iterator iter;
cout<<setw(11)<<left<<name;
for (iter = scores.begin(); iter < scores.end(); iter++)
{
cout<<" "<<setw(6)<<setprecision(2)<<fixed<<*iter;
}
cout<<" "<<setw(6)<<setprecision(2)<<fixed<<finalScore<<endl;
}
bool operator<(const Student &another) const
{
return name < another.name;
}
};
class Test
{
private:
map<string, double> results;
public:
void input()
{
string tmpstr;
int tmpint, maxvalue = 0;
map<string, int> numOfSubjects;
int numOfStudents;
map<string, int>::iterator iter;
cin>>numOfStudents;
for (int i = 0; i < numOfStudents; i++)
{
cin>>tmpstr>>tmpint;
if (tmpint > maxvalue)
maxvalue = tmpint;
numOfSubjects.insert(make_pair(tmpstr, tmpint));
}
for (iter = numOfSubjects.begin(); iter != numOfSubjects.end(); iter++)
{
results[iter->first] = 100.0 * iter->second / maxvalue;
}
}
double getScoreOfAStudent(const string& name)
{
map<string, double>::iterator iter;
iter = results.find(name);
if (iter != results.end())
return iter->second;
else
return 0;
}
};
class MarkList
{
private:
vector<Test> tests;
vector<Student> students;
public:
void input()
{
int num, i;
string tmp;
cin>>num;
for (i = 0; i < num; i++)
{
cin>>tmp;
students.push_back(Student(tmp));
}
cin>>num;
for (i = 0; i < num; i++)
{
Test tmp;
tmp.input();
tests.push_back(tmp);
}
}
void compute()
{
unsigned int i, j;
for (i = 0; i < tests.size(); i++)
{
for (j = 0; j < students.size(); j++)
{
students[j].addAScore(tests[i].getScoreOfAStudent(students[j].getName()));
}
}
for (j = 0; j <students.size(); j++)
{
students[j].compute();
}
}
void show()
{
vector<Student>::iterator iter;
stringstream ss;
cout<<setw(11)<<left<<"NAME";
for (unsigned int i = 1; i <= tests.size(); i++)
{
ss.str("");
ss<<i;
cout<<" "<<setw(6)<<("TEST" + ss.str());
}
cout<<" "<<"FINAL"<<endl;
for (iter = students.begin(); iter < students.end(); iter++)
{
iter->show();
}
}
};
int main()
{
MarkList markList;
markList.input();
markList.compute();
markList.show();
}
这是老师的代码,看到老师的主函数,我惊呆了。。。只有四行。我的天,学习学习!!!!
这样更方便修改,查找错误。