管理查询系统中的STL

本文介绍了一个学生选课系统的实现细节,包括如何通过多种算法对学生选课记录进行查询和统计分析。该系统使用C++编程语言,并利用标准模板库STL进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

广交天下好友:

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	外语


 

 

 

 

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值