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

📄 stuopt.cpp

📁 考试管理系统
💻 CPP
字号:
#include "main.h"	

/**************************************************
* 函数名:	CStudentOpt
* 参数:
*	形参:
* 返回值:	无
* 功能:
*			类的构造函数
			进行类中相关成员的初始化
* 作者:		谢金牛
* 编写明细:
*		完成时间	Created		作者名
		2009-2-14				谢金牛
**************************************************/

CStudentOpt::CStudentOpt()
{

	m_nQuesNum_1 = 0;

	m_nAlrdAnsNum = 0;

	m_nGainScore = 0;

	memset(m_szInput, '\0', SIZE1);

	m_pQuesCQuestion = new CMyFile;

	pKeepCMyTime = new CMyTime;

}

/**************************************************
* 函数名:	~CStudentOpt
* 参数:
*	形参:
* 返回值:	无
* 功能:
*			类的析构函数
			进行类中指针成员的释放
* 作者:		谢金牛
* 编写明细:
*		完成时间	Created		作者名
		2009-2-14				谢金牛
**************************************************/

CStudentOpt::~CStudentOpt()
{

	delete m_pQuesCQuestion;

	delete pKeepCMyTime;

}

/**************************************************
* 函数名:	GetText
* 参数:
*	形参:
* 返回值:	无
* 功能:
*			读取文件函数
			试题,答案,分值等信息的读取
			为学生答题做好铺垫
* 作者:		谢金牛
* 编写明细:
*		完成时间	Created		作者名
		2009-2-14				谢金牛
*		修改时间	Modify		修改者		修改位置或修改明细
		2009-2-18				谢金牛		设置题号
**************************************************/

void CStudentOpt::GetText()
{
	
	m_pQuesCQuestion->SetNum(nTestNum+1);
	
	m_pQuesCQuestion->ReadAnswer();

	m_pQuesCQuestion->ReadScore();

	m_pQuesCQuestion->ReadContent();

	m_pQuesCQuestion->SetItem();

}


/**************************************************
* 函数名:	Input
* 参数:
*	形参:
* 返回值:	整型
* 功能:
*			学生答题
			完成学生答题时输入的相关操作
			学生可进行答题,修改,提交等相关按键的操作
* 作者:		谢金牛
* 编写明细:
*		完成时间	Created		作者名
		2009-2-14				谢金牛
*		修改时间	Modify		修改者		修改位置或修改明细
		2009-2-18				谢金牛		增加对功能键的接收
**************************************************/

int CStudentOpt::Input()
{
	int nCnt = 0;//已输答案数

	char szName[g_nCUserNameSize] = "";
	ifstream RUserName(WRITEUSER, ios::in|ios::binary);
	RUserName >> szName;
	RUserName.close();					//将用户名读出

	//读已选答案szAlrdAnsr
	pKeepCMyTime->ReadTime(szName);
	if ((strlen(pKeepCMyTime->GetALAnswer(m_nQuesNum_1)) != 0) && (m_nQuesNum_1 < 10))
	{
		cout << pKeepCMyTime->GetALAnswer(m_nQuesNum_1);
		strcpy(m_szInput, pKeepCMyTime->GetALAnswer(m_nQuesNum_1));
		nCnt = strlen(m_szInput);
	}


	HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);	// 获取标准输出设备句柄
	HANDLE hKey = GetStdHandle(STD_INPUT_HANDLE);	// 获取标准输入设备句柄
	DWORD res;
	INPUT_RECORD keyRec;

	while (1)
	{
		ReadConsoleInput(hKey, &keyRec, 1, &res);
		if (keyRec.EventType == KEY_EVENT && keyRec.Event.KeyEvent.bKeyDown)
		{
			if (keyRec.Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)	//上一题
			{
				if (m_nQuesNum_1 >= 1)
				{
					--m_nQuesNum_1;
					break;
				}
			}
			if (keyRec.Event.KeyEvent.wVirtualKeyCode == VK_NEXT)//下一题
			{
				if (m_nQuesNum_1 < 9)
				{
					if (m_nQuesNum_1 < m_nAlrdAnsNum)
					{
						++m_nQuesNum_1;
						break;
					}
				}
			}
			if (keyRec.Event.KeyEvent.wVirtualKeyCode == VK_HOME)//第一题
			{
				m_nQuesNum_1 = 0;
				break;
			}
			if (keyRec.Event.KeyEvent.wVirtualKeyCode == VK_END)//现答最后一题
			{
			
				m_nQuesNum_1 = m_nAlrdAnsNum-1;
			
				break;

			}
		
			if (keyRec.Event.KeyEvent.wVirtualKeyCode == VK_F1)//帮助文档
			{
			
				CShow* pTempCShow = new CShow;
			
				pTempCShow->ShowHelp();
			
				m_pQuesCQuestion->ShowHead();
			
				delete pTempCShow;
			
				break;

			}

			if (keyRec.Event.KeyEvent.wVirtualKeyCode == VK_F5)//提交
			{

				if (m_nAlrdAnsNum == SIZE2)
				{
					
					char szName[g_nCUserNameSize] = "";
				
					ifstream RUserName(WRITEUSER, ios::in|ios::binary);
				
					RUserName >> szName;
				
					RUserName.close();					//将用户名读出

					CShow* pTempCShow = new CShow;
 				
					bF5 = true;
					
					pTempCShow->ShowScore(m_nGainScore, nSce/60, nSce%60, szName);
				
					delete pTempCShow;

					return 0;
				}

			}			
	
			int nCntTemp = nCnt;//此时所选答案位数

			if ((keyRec.Event.KeyEvent.wVirtualKeyCode == 8)&&(nCnt > 0))
			{
				
				cout << "\b \b";
			
				m_szInput[nCntTemp-1] = '\0';
			
				--nCnt;
			}
				
			if ((keyRec.Event.KeyEvent.wVirtualKeyCode == 13)&&(nCnt != 0))
			{
				
				if ((m_nQuesNum_1 <= 9)&&(m_nAlrdAnsNum <= 9))
				{					
				
					InOrder(m_szInput);//由小到大排序
				
					int nTemp = strlen(m_pQuesCQuestion->GetStaAnswer(m_nQuesNum_1));
				
					char szTemp[SIZE1];
				
					memset(szTemp, '\0', SIZE1);
				
					strcpy(szTemp, m_pQuesCQuestion->GetStaAnswer(m_nQuesNum_1));
				
					szTemp[nTemp-1] = '\0';
				
					pKeepCMyTime->SetALAnswer(m_nQuesNum_1, m_szInput);
									
					int nWMinute = nSce/60;
				
					int nWSecond = nSce%60;
				
					pKeepCMyTime->SetMinutes(nWMinute);
				
					pKeepCMyTime->SetSecond(nWSecond);
				
					char szName[g_nCUserNameSize] = "";
					
					ifstream RUserName(WRITEUSER, ios::in|ios::binary);
				
					RUserName >> szName;
					
					RUserName.close();					//将用户名读出

					pKeepCMyTime->WriteTime(szName);
					
					if (strcmp(szTemp, m_szInput) == 0)
					{

						m_nGainScore += 10;

					}

					if (m_nAlrdAnsNum == m_nQuesNum_1)
					{
						++m_nAlrdAnsNum;
					}
					
								
					if (m_nQuesNum_1 < 9)				//则m_nQuesNum_1最大为9
					{

						++m_nQuesNum_1;

					}
					
					break;
				}
			}
			
			if (nCnt == 7)
			{
				continue;
			}
		
			switch(keyRec.Event.KeyEvent.wVirtualKeyCode)
			{
		
			case '1':
				cout << 'a';
			
				++nCnt;
			
				break;

			case '2':
			
				cout << 'b';
				
				++nCnt;
			
				break;
		
			case '3':
			
				cout << 'c';
			
				++nCnt;
			
				break;
			
			case '4':
			
				cout << 'd';
				
				++nCnt;
			
				break;
			
			case '5':
			
				cout << 'e';
			
				++nCnt;
			
				break;
		
			case '6':
			
				cout << 'f';
				
				++nCnt;
			
				break;
			
			case '7':
			
				cout << 'g';
			
				++nCnt;
			
				break;
			
			default:

				break;

			}
		
			if ((nCntTemp != nCnt)&&(nCnt <= 7)&&(keyRec.Event.KeyEvent.wVirtualKeyCode != 8))
			{
				m_szInput[nCntTemp] = keyRec.Event.KeyEvent.wVirtualKeyCode+48;//将输入数字加48变为小写字母
				
				//m_szInput[nCntTemp+1] = '\0';//之前已将数组清零,因此不再末尾加0亦可
				
				//保存答案进数组m_szInput
			}

		}
		
	}		
	
	return -1;
}

/**************************************************
* 函数名:	StuOpt
* 参数:
*	形参:
* 返回值:	整型
* 功能:
*			学生操作函数
			读取文件和学生输入等函数的方法
			管理学生类
* 作者:		谢金牛
* 编写明细:
*		完成时间	Created		作者名
		2009-2-14				谢金牛
*		修改时间	Modify		修改者		修改位置或修改明细
		2009-2-18				谢金牛		把清屏改为将除提示信息外的内容用空格填充
**************************************************/

int CStudentOpt::StuOpt()
{
	
	GetText();
	
	HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);	//获取标准输出设备句柄

	COORD CurPos;

	m_nQuesNum_1 = 0;

	m_pQuesCQuestion->ShowHead();
	
	for (;;)
	{

		if (m_nQuesNum_1 < 10)
		{
		
			CurPos.X = 0;
			
			CurPos.Y = 5;
		
			SetConsoleCursorPosition(hCon, CurPos);	//移动光标
		
			for (int i=0;i<1520;++i)
			{
				cout<<" ";
			}

			CurPos.X = 0;
		
			CurPos.Y = 5;
		
			SetConsoleCursorPosition(hCon, CurPos);	//移动光标
		
			m_pQuesCQuestion->ShowQues(m_nQuesNum_1);

		}
				
		if (Input() == 0)//提交成功
		{

			return 0;

		}

	}	
}

/**************************************************
* 函数名:	InOrder
* 参数:
*	形参:
			char* szTemp:目标字符串
* 返回值:	无
* 功能:
*			排序函数
			对考生输入的答案进行从小到大排序
* 作者:		谢金牛
* 编写明细:
*		完成时间	Created		作者名
		2009-2-14				谢金牛
**************************************************/

void CStudentOpt::InOrder(char* szTemp)
{
	
	int nLong = strlen(szTemp);

	char ch;
	
	for (int i = 0; i < nLong; ++i)
	{
	
		for (int j = nLong-1; j > i; --j)
		{
			
			if (szTemp[j-1] > szTemp[j])
			{
				
				ch = szTemp[j-1];
				
				szTemp[j-1] = szTemp[j];
				
				szTemp[j] = ch;
			}

		}

	}

}

⌨️ 快捷键说明

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