广交天下好友:
www.lfsblack.com IT幽灵界
#pragma warning(disable:4786)
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <numeric>
using namespace std;
struct Student
{
string sno;
string sname;
int sage;
string ssex;
bool operator ==(const string & sno) const
{
return this->sno == sno;
}
};
struct Course
{
string cno;
string cname;
bool operator == (const string &cno) const
{
return this->cno == cno;
}
};
struct SC
{
string sno;
string cno;
int grade;
};
struct ResultView1
{
string sno;
string sname;
map<string,int> mapGrade;
};
struct ResultView3
{
string cno;
float average;
bool operator< (const ResultView3 &rv) const
{
bool bRet = false;
if(average < rv.average)
bRet = true;
else
{
if(average == rv.average)
{
bRet = cno > rv.cno ? true:false;
}
}
return bRet;
}
};
struct ResultView4
{
string cno;
vector<string> vecSno;
};
class MyFind
{
vector<Student> &vecStud;
vector<Course> &vecCour;
vector<SC> &vecSC;
public:
MyFind(vector<Student>&s,vector<Course>&c,vector<SC>&sc) :
vecStud(s),vecCour(c),vecSC(sc)
{}
bool GetFactor1Result(string sno,ResultView1 &v);
bool GetFactor2Result(vector<string> & vResult);
bool GetFactor22Result(vector<string> &vResult);
bool GetFactor3Result(vector<ResultView3> & vResult);
bool GetFactor4Result(vector<ResultView4> & vResult);
bool GetFactor42Result(vector<ResultView4> & vResult);
};
class MyCompare1
{
string sno;
public:
MyCompare1(string sno)
{
this->sno = sno;
}
bool operator() (const SC &s) const
{
return sno != s.sno;
}
};
bool MyFind::GetFactor1Result(string sno,ResultView1 &v)
{
vector<Student>::iterator it = find(vecStud.begin(),vecStud.end(),sno);
if(it == vecStud.end())
return false;
v.sno = (*it).sno;
v.sname = (*it).sname;
vector<SC>vec;
remove_copy_if(vecSC.begin(),vecSC.end(),back_inserter(vec),MyCompare1(sno));
for(int i = 0 ; i < vec.size(); i ++)
{
vector<Course>::iterator it = find(vecCour.begin(),vecCour.end(),vec[i].cno);
pair<string,int> p((*it).cname,vec[i].grade);
v.mapGrade.insert(p);
}
return true;
}
class MyCompare2
{
public:
bool operator() (const SC &s1,const SC &s2) const
{
return s1.sno < s2.sno;
}
};
bool MyFind::GetFactor2Result(vector<string> &vResult)
{
int nCount = vecCour.size();
sort(vecSC.begin(),vecSC.end(),MyCompare2());
int pos = 0;
typedef vector<SC>::iterator FwdIt;
FwdIt begin = vecSC.begin();
pair<FwdIt,FwdIt> it;
while(begin != vecSC.end())
{
it = equal_range(begin,vecSC.end(),vecSC[pos],MyCompare2());
int nSize = it.second - it.first;
if(nSize == nCount)
{
SC *pSC = it.first;
vResult.push_back(pSC->sno);
}
pos += nSize;
begin = it.second;
}
return true;
}
bool MyFind::GetFactor22Result(vector<string> & vResult)
{
map<string,int> mymap;
map<string,int>::iterator it;
pair<string,int> p;
for(int i = 0 ;i < vecSC.size();i ++)
{
if(mymap.empty())
{
p.first = vecSC[0].sno,p.second = 1;
mymap.insert(p);
}
else
{
it = mymap.find(vecSC[i].sno);
if(it == mymap.end())
{
p.first = vecSC[0].sno,p.second = 1;
mymap.insert(p);
}
else
{
(*it).second += 1;
}
}
}
int nCount = vecCour.size();
it = mymap.begin();
while(it != mymap.end())
{
if((*it).second == nCount)
vResult.push_back((*it).first);
it ++;
}
return true;
}
class MyCompare3
{
public:
bool operator() (const SC &s1,const SC &s2) const
{
return s1.cno < s2.cno;
}
};
class MySum3
{
public:
float operator() (const float &result,const SC &s) const
{
return result + s.grade;
}
};
bool MyFind::GetFactor3Result(vector<ResultView3> &vResult)
{
sort(vecSC.begin(),vecSC.end(),MyCompare3());
typedef vector<SC>::iterator MyIt;
pair<MyIt,MyIt> p;
MyIt begin = vecSC.begin();
ResultView3 rv3;
while(begin != vecSC.end())
{
p = equal_range(begin,vecSC.end(),*begin,MyCompare3());
rv3.cno = (*begin).cno;
rv3.average = accumulate(p.first,p.second,0.0f,MySum3())/(p.second-p.first);
vResult.push_back(rv3);
begin = p.second;
}
sort(vResult.begin(),vResult.end());
return true;
}
class MyCompare4
{
public:
bool operator() (const SC &s1,const SC &s2) const
{
bool bRet = false;
if(s1.cno < s2.cno)
bRet = true;
else
{
if(s1.cno == s2.cno)
{
bRet = s1.grade > s2.grade ? true : false;
}
}
return bRet;
}
};
bool MyFind::GetFactor4Result(vector<ResultView4>& vResult)
{
sort(vecSC.begin(),vecSC.end(),MyCompare4());
typedef vector<SC>::iterator MyIt;
pair<MyIt,MyIt> p;
MyIt begin = vecSC.begin();
while(begin != vecSC.end())
{
p = equal_range(begin,vecSC.end(),*begin,MyCompare4());
ResultView4 rv;
rv.cno = (*begin).cno;
rv.vecSno.push_back((*begin).sno);
begin ++;
rv.vecSno.push_back((*begin).sno);
vResult.push_back(rv);
begin = p.second;
}
return true;
}
class MyCompare42
{
string cno;
public:
MyCompare42(string cno)
{
this -> cno = cno;
}
bool operator() (const SC &s) const
{
return this->cno == s.cno;
}
};
class MyCompare43
{
public:
bool operator()(const SC &s1,const SC &s2) const
{
return s1.grade >= s2.grade;
}
};
bool MyFind::GetFactor42Result(vector<ResultView4> &vResult)
{
typedef vector<SC>::iterator MyIt;
MyIt begin = vecSC.begin();
while(begin != vecSC.end())
{
MyIt mid = partition(begin,vecSC.end(),MyCompare42((*begin).cno));
partial_sort(begin,begin+2,mid,MyCompare43());
ResultView4 rv;
rv.cno = (*begin).cno;
rv.vecSno.push_back((*begin).sno);
begin ++;
rv.vecSno.push_back((*begin).sno);
vResult.push_back(rv);
begin = mid;
}
return true;
}
测试程序:
int main()
{
vector<Student> vecStud;
vector<Course> vecCour;
vector<SC> vecSC;
ifstream in("stud.dat");
Student s;
while(!in.eof())
{
in >> s.sno >> s.sname >> s.sage >> s.ssex;
vecStud.push_back(s);
}
in.close();
ifstream in2("cour.dat");
Course c;
while(!in2.eof())
{
in2 >> c.cno >> c.cname ;
vecCour.push_back(c);
}
in2.close();
ifstream in3("sc.dat");
SC sc;
while(!in3.eof())
{
in3 >> sc.sno >> sc.cno >> sc.grade;
vecSC.push_back(sc);
}
in.close();
MyFind obj(vecStud,vecCour,vecSC);
ResultView1 rv1;
obj.GetFactor1Result("1001",rv1);
cout << rv1.sno << "\t" << rv1.sname <<endl;
map<string,int>::iterator it = rv1.mapGrade.begin();
while(it != rv1.mapGrade.end())
{
cout << "\t" << (*it).first << "\t" << (*it).second << endl;
it ++;
}
return 0;
}
文件:
stud.dat:
1001 张 20 男
1002 李 21 女
1003 王 19 男
1004 赵 18 男
1005 周 22 女
1006 孙 23 男
sc.dat:
1001 c001 90
1002 c001 85
1003 c001 80
1001 c002 89
1001 c003 86
1003 c003 59
cour.dat:
c001 语文
c002 数学
c003 外语