⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.cpp

📁 设计模式:工厂模式、单例模式的基本实现
💻 CPP
字号:
#include "Test.h"

CTest::CTest()
{
	m_nScore = 10;
}

CTest::~CTest()
{
}

string CTest::GetTitle()
{
	return m_strTitle;
}

int CTest::SetTitle(string strTitle)
{
	if(strTitle.length() > TITLE_NUM)
		return 1;
	m_strTitle = strTitle;
	return 0;
}

int CTest::GetScore()
{
	return m_nScore;
}

int CTest::SetScore(int nScore)
{
	if(nScore < 0 || nScore > 100)
		return 1;
	m_nScore = nScore;
	return 0;
}

int CTest::GetOpt(vector<string>& vtOpt)
{
	vector<string>::iterator pos;
	for(pos=m_arrOpt.begin(); pos!=m_arrOpt.end(); ++pos)
	{
		vtOpt.push_back(*pos);
	}
	return 0;
}

int CTest::SetOpt(vector<string>& vtOpt)
{
	m_arrOpt.clear();
	vector<string>::iterator pos;
	for(pos=vtOpt.begin(); pos!=vtOpt.end(); ++pos)
	{
		m_arrOpt.push_back(*pos);
	}
	return 0;
}

int CTest::GetAns(vector<char>& vtAns)
{
	vector<char>::iterator pos;
	for(pos=m_arrAns.begin(); pos!=m_arrAns.end(); ++pos)
	{
		vtAns.push_back(*pos);
	}
	return 0;
}

int CTest::SetAns(vector<char>& vtAns)
{
	m_arrAns.clear();
	vector<char>::iterator pos;
	for(pos=vtAns.begin(); pos!=vtAns.end(); ++pos)
	{
		m_arrAns.push_back(*pos);
	}
	return 0;
}

void CTest::Serialize(CFileOpt& ar)
{
	if(ar.IsRead())
	{
		ar >> m_strTitle;
		int nNum = 0;
		ar >> nNum;
		for(int i=0; i<nNum; ++i)
		{
			string strTmp;
			ar >> strTmp;
			m_arrOpt.push_back(strTmp);
		}
		ar >> nNum;
		for(i=0; i<nNum; ++i)
		{
			char ch;
			ar >> ch;
			m_arrAns.push_back(ch);
		}
		ar >> m_nScore;
	}
	else
	{
		ar << m_strTitle;
		int nNum = m_arrOpt.size();
		ar << nNum;
		for(int i=0; i<nNum; ++i)
		{
			ar << m_arrOpt[i];
		}
		nNum = m_arrAns.size();
		ar << nNum;
		for(i=0; i<nNum; ++i)
		{
			ar << m_arrAns[i];
		}
		ar << m_nScore;
	}
}

void CTest::WriteUserFile(CFileOpt& ar) // 写入用户定义的文件
{
	string strText;
	
	strText = "[QAnswer]";
	ar.WriteLine(strText);
	strText = "";
	vector<char>::iterator pos;
	for(pos=m_arrAns.begin(); pos!=m_arrAns.end(); ++pos)
	{
		strText += (*pos);
	}
	ar.WriteLine(strText);
	strText = "[QScore]";
	ar.WriteLine(strText);
	char szNum[10];
	itoa(m_nScore, szNum, 10);
	strText = szNum;
	ar.WriteLine(strText);

	strText = "[QContent]";
	ar.WriteLine(strText);
	ar.WriteLine(m_strTitle);
	strText = "[QItem]";
	ar.WriteLine(strText);
	
	char ch = 'a';
	vector<string>::iterator pos1;
	for(pos1=m_arrOpt.begin(); pos1 != m_arrOpt.end(); ++pos1)
	{
		string strTmp(1, ch);
		strTmp += " ";
		strTmp += (*pos1);
		ar.WriteLine(strTmp);
		++ ch;
	}

}

CPaper::CPaper()
{
	m_nCurTest = NULL;
}

CPaper::~CPaper()
{
	CTestVT::iterator pos;
	for(pos=m_vtTest.begin(); pos!=m_vtTest.end(); ++pos)
	{
		delete (*pos);
	}
	m_vtTest.clear();
}

// 合格:0
// 不合格:
// -1:题目数量不合格
// -2:分数不合格
// nm: n表示第几题,第一题为0;m:1表示题干;2表示选项;3表示答案;4表示分数
// 以此类推

int CPaper::IsValid()
{
	if(m_vtTest.size() != 10)
		return -1;
	int nScore = 0;
	CTestVT::iterator pos;
	for(pos=m_vtTest.begin(); pos!=m_vtTest.end(); ++pos)
	{
		nScore += (*pos)->GetScore();
	}
	if(nScore != 100)
		return -2;
	return 0;
}

int CPaper::GetTestNum()
{
	return m_vtTest.size();
}

int CPaper::GetTotalScore()
{
	int nScore = 0;
	CTestVT::iterator pos;
	for(pos=m_vtTest.begin(); pos!=m_vtTest.end(); ++pos)
	{
		nScore += (*pos)->GetScore();
	}
	return nScore;
}

int CPaper::AddTest()
{
	int nSize = m_vtTest.size();
	if(m_vtTest.size() == TEST_NUM)
	{
		CTestVT::iterator pos = m_vtTest.end();
		-- pos;
		if(m_nCurTest != pos)
			return -1;
		else
			return 1;
	}
	CTest* pTest = new CTest;
	if(m_nCurTest != NULL)
		++ m_nCurTest;
	m_nCurTest = m_vtTest.insert(m_nCurTest, pTest);

	return 0;
}

int CPaper::MovePrev()
{
	if(m_nCurTest == m_vtTest.begin())
		return 1;
	-- m_nCurTest;
	return 0;
}

int CPaper::MoveNext()
{
	++ m_nCurTest;
	if(m_nCurTest == m_vtTest.end())
	{
		-- m_nCurTest;
		return 1;
	}
	return 0;
}

int CPaper::MoveFirst()
{
	m_nCurTest = m_vtTest.begin();
	return 0;
}

int CPaper::MoveLast()
{
	m_nCurTest = m_vtTest.end();
	-- m_nCurTest;
	return 0;
}

int CPaper::DelTest()
{
	CTestVT::iterator pos = m_nCurTest;
	if(m_nCurTest == m_vtTest.end())
	{
		if(m_nCurTest == m_vtTest.begin())
			m_nCurTest = NULL;
		else
			-- m_nCurTest;
	}
	else
		++ m_nCurTest;
	delete *pos;
	m_vtTest.erase(pos);
	return 0;
}

int CPaper::Edit(string strTitle, string strAns, string strScore, string strOptA,
		string strOptB, string strOptC, string strOptD, string strOptE, string strOptF, string strOptG)
{
	vector<string> vtOpt;
	if(!strOptA.empty())
	{
		vtOpt.push_back(strOptA);
		if(!strOptB.empty())
		{
			vtOpt.push_back(strOptB);
			if(!strOptC.empty())
			{
				vtOpt.push_back(strOptC);
				if(!strOptD.empty())
				{
					vtOpt.push_back(strOptD);
					if(!strOptE.empty())
					{
						vtOpt.push_back(strOptE);
						if(!strOptF.empty())
						{
							vtOpt.push_back(strOptF);
							if(!strOptG.empty())
								vtOpt.push_back(strOptG);
						}
					}
				}
			}
		}
	}

	vector<char> vtAns;
	int nLen = strAns.length();
	for(int i=0; i<nLen; ++i)
	{
		char szAns = strAns[i];
		vtAns.push_back(szAns);
	}

	int nScore = atoi(strScore.c_str());

	(*m_nCurTest)->SetTitle(strTitle);
	(*m_nCurTest)->SetOpt(vtOpt);
	(*m_nCurTest)->SetAns(vtAns);
	(*m_nCurTest)->SetScore(nScore);

	return 0;
}

int CPaper::GetContext(string &strTitle, string &strAns, string &strScore, string &strOptA,
	string &strOptB, string &strOptC, string &strOptD, string &strOptE, string &strOptF, string &strOptG)
{
	if(m_nCurTest == NULL)
		return -1;

	// 题干
	strTitle = (*m_nCurTest)->GetTitle();

	// 选项
	vector<string> vtOpt;
	(*m_nCurTest)->GetOpt(vtOpt);
	int nSize = vtOpt.size();
	strOptA = nSize >= 1 ? vtOpt[0] : "";
	strOptB = nSize >= 2 ? vtOpt[1] : "";
	strOptC = nSize >= 3 ? vtOpt[2] : "";
	strOptD = nSize >= 4 ? vtOpt[3] : "";
	strOptE = nSize >= 5 ? vtOpt[4] : "";
	strOptF = nSize >= 6 ? vtOpt[5] : "";
	strOptG = nSize >= 7 ? vtOpt[6] : "";

	// 答案
	vector<char> vtAns;
	(*m_nCurTest)->GetAns(vtAns);
	vector<char>::iterator pos;
	for(pos=vtAns.begin(); pos!=vtAns.end(); ++pos)
	{
		strAns.append(1, *pos);
	}
	// 分数
	char szScore[10];
	itoa((*m_nCurTest)->GetScore(), szScore, 10);
	strScore = szScore;

	return 0;
}

int CPaper::GetTestIndex(int& nIndex)
{
	if(m_nCurTest == NULL)
		return -1;
	nIndex = 1;
	CTestVT::iterator pos;
	for(pos=m_vtTest.begin(); pos!=m_nCurTest; ++pos)
	{
		nIndex ++;
	}
	return 0;
}

void CPaper::Serialize(CFileOpt& ar)
{
	if(ar.IsRead())
	{
		int nNum = 0;
		ar >> nNum;
		for(int i=0; i<nNum; ++i)
		{
			CTest *pTest = new CTest;
			pTest->Serialize(ar);
			m_vtTest.push_back(pTest);
		}
		if(nNum > 0)
		{
			m_nCurTest = m_vtTest.begin();
		}
		else
		{
			m_nCurTest = NULL;
		}
	}
	else
	{
		int nNum = m_vtTest.size();
		ar << nNum;
		for(int i=0; i<nNum; ++i)
		{
			CTest *pTest = m_vtTest[i];
			pTest->Serialize(ar);
		}
	}
}

void CPaper::WriteUserFile(CFileOpt& ar) // 写入用户定义的文件
{
	string strTitle1("*******************");
	string strTitle2("*******************");
	string strTitle;
	int nNum = 1;
	CTestVT::iterator pos;
	for(pos=m_vtTest.begin(); pos!=m_vtTest.end(); ++pos)
	{
		CTest* pTest = *pos;
		char szNum[10];
		itoa(nNum, szNum, 10);
		strTitle = strTitle1 + szNum + strTitle2;
		ar.WriteLine(strTitle);
		pTest->WriteUserFile(ar);
		++ nNum;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -