64,651
社区成员
发帖
与我相关
我的任务
分享
template <typename T>
void Read(list<T>& L, istream& in)
{
while(!in.eof())
{
T t;
in >> t;
L.push_back(t);
}
}
template <typename T>
void Write(list<T>& L, ostream& out = std::cout)
{
list<T>::iterator it = L.begin();
list<T>::iterator end = L.end();
while(it != end)
{
out << *it << endl;
it++;
}
}
class StudentCmp
{
public:
StudentCmp(const string& key, const string& val)
: m_key(key), m_val(val) { }
bool operator()(const Student& s)
{
if(m_key == "number")
return s.get_number() == m_val;
else if(m_key == "name")
return s.get_name() == m_val;
else if(m_key == "dormPhoneNumber")
return s.get_dormPhoneNumber() == m_val;
else
return false;
}
private:
string m_key;
string m_val;
};
class CourseCmp
{
public:
CourseCmp(const string& key, const string& val = "")
: m_key(key), m_val(val) { }
bool operator()(const Course& c)
{
if(m_key == "number")
return c.get_studentNumber() == m_val;
else
return false;
}
bool operator()(const Course& c1, const Course& c2)
{
if(m_key == "finalScore_ASC")
return c1.get_finalScore() < c2.get_finalScore();
else if(m_key == "finalScore_DES")
return c2.get_finalScore() < c1.get_finalScore();
else if(m_key == "finalCredit_ASC")
return c1.get_finalCredit() < c2.get_finalCredit();
else if(m_key == "finalCredit_DES")
return c2.get_finalCredit() < c1.get_finalCredit();
else
return false;
}
private:
string m_key;
string m_val;
};
void Remove(list<Student>& L1, list<Course>& L2, const string& number)
{
L1.remove_if(StudentCmp("number", number));
L2.remove_if(CourseCmp("number", number));
}
void Query(list<Student>& L, const string& key, const string& val)
{
StudentCmp cmp(key, val);
list<Student>::iterator a = L.begin();
list<Student>::iterator b = L.end();
while(1)
{
list<Student>::iterator it = find_if(a, b, cmp);
if(it == b)
break;
cout << *it << endl;
a = ++it;
}
}
void Query(list<Student>& L1, list<Course>& L2, const string& number)
{
list<Student>::iterator it;
it = find_if(L1.begin(), L1.end(), StudentCmp("number", number));
if(it == L1.end())
return;
const string& name = it->get_name();
cout << "学号: " << number << "\t"
<< "姓名: " << name << endl;
list<Course>::iterator a = L2.begin();
list<Course>::iterator b = L2.end();
int cnt = 0;
double totalCredit = 0.0;
while(1)
{
list<Course>::iterator it = find_if(a, b, CourseCmp("number", number));
if(it == b)
break;
cout << "课程编号: " << it->get_courseNumber() << "\t"
<< "课程名称: " << setw(12) << left << it->get_name() << "\t"
<< "综合成绩: " << it->get_finalScore() << "\t"
<< "实得学分: " << it->get_finalCredit() << endl;
cnt++;
totalCredit += it->get_finalCredit();
a = ++it;
}
cout << "共修: " << cnt << "科" << "\t"
<< "实得总学分为: " << totalCredit << endl;
}
void Sort(list<Course>& L, const string& sortType)
{
L.sort(CourseCmp(sortType));
}
class Course
{
public:
//getter
const string& get_studentNumber() const { return m_StudentNumber; }
const string& get_courseNumber() const { return m_CourseNumber; }
const string& get_name() const { return m_Name; }
double get_credit() const { return m_Credit; }
double get_commonScore() const { return m_CommomScore; }
double get_experimentScore() const { return m_ExperimentSocre; }
double get_paperScore() const { return m_PaperScore; }
double get_finalScore() const { return m_FinalScore; }
double get_finalCredit() const { return m_FinalCredit; }
//setter
void update_finalScore();
void update_finalCredit();
friend ostream& operator << (ostream& out, const Course& c);
friend istream& operator >> (istream& in, Course& c);
public:
string m_StudentNumber;
string m_CourseNumber;
string m_Name;
double m_Credit;
double m_CommomScore;
double m_ExperimentSocre;
double m_PaperScore;
double m_FinalScore;
double m_FinalCredit;
};
void Course::update_finalCredit()
{
double t = m_FinalScore;
double x = 0.0;
if(t >= 90 && t <= 100)
x = 1.0;
else if( t >= 80 && t < 90)
x = 0.8;
else if(t >= 70 && t < 80)
x = 0.75;
else if(t >= 60 && t < 70)
x = 0.6;
m_FinalCredit = m_Credit * x;
}
void Course::update_finalScore()
{
if(m_ExperimentSocre == -1)
{
m_FinalScore =
m_CommomScore * 0.3 +
m_PaperScore * 0.7;
}
else
{
m_FinalScore =
m_CommomScore * 0.15 +
m_ExperimentSocre * 0.15 +
m_PaperScore * 0.7;
}
}
ostream& operator << (ostream& out, const Course& c)
{
out << c.get_studentNumber() << "\t"
<< c.get_courseNumber() << "\t"
<< setw(12) << left
<< c.get_name() << "\t"
<< c.get_credit() << "\t"
<< c.get_commonScore() << "\t"
<< c.get_experimentScore() << "\t"
<< c.get_paperScore() << "\t"
<< c.get_finalScore() << "\t"
<< c.get_finalCredit();
return out;
}
istream& operator >> (istream& in, Course& c)
{
in >> c.m_StudentNumber
>> c.m_CourseNumber
>> c.m_Name
>> c.m_Credit
>> c.m_CommomScore
>> c.m_ExperimentSocre
>> c.m_PaperScore;
c.update_finalScore();
c.update_finalCredit();
return in;
}
class Student
{
public:
//getter
const string& get_number() const { return m_Number; }
const string& get_name() const { return m_Name; }
const string& get_sex() const { return m_Sex; }
const string& get_dormPhoneNumber() const { return m_DormPhoneNumber; }
const string& get_telePhoneNumber() const { return m_TelePhoneNumber; }
//setter
void set_number(string& number) { m_Number = number; }
void set_name(string& name) { m_Name = name; }
void set_sex(string& sex) { m_Sex = sex; }
void set_dormPhoneNumber(string& dormPhoneNumber) { m_DormPhoneNumber = dormPhoneNumber; }
void set_telePhoneNumber(string& telePhoneNumber) { m_TelePhoneNumber = telePhoneNumber; }
//io
friend ostream& operator << (ostream& out, const Student& s);
friend istream& operator >> (istream& in, Student& s);
private:
string m_Number;
string m_Name;
string m_Sex;
string m_DormPhoneNumber;
string m_TelePhoneNumber;
};
ostream& operator << (ostream& out, const Student& s)
{
out << s.get_number() << "\t"
<< s.get_name() << "\t"
<< s.get_sex() << "\t"
<< s.get_dormPhoneNumber() << "\t"
<< s.get_telePhoneNumber();
return out;
}
istream& operator >> (istream& in, Student& s)
{
in >> s.m_Number
>> s.m_Name
>> s.m_Sex
>> s.m_DormPhoneNumber
>> s.m_TelePhoneNumber;
return in;
}