2 总体方案设计
2.1 设计任务及要求
本次设计的主要功能要求:
- 试题录入:可随时对题库中的题目实现增删改查,要求题库中不少于50个题目;
- 试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入);
- 试题的分组:可以增加删除分组,可自由选择分组进行答题;
- 答题:用户可实现自己选择答案;
- 自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩;
- 最后要求能显示出错题目和正确答案,并保留此次答题记录,下次测试之前可以查看上次记录。
2.2 总体方案设计
系统的层次方框图如图2.1所示。
3 详细设计
本程序采用文本文件操作用的时CStdioFile类将题库以文本文件的形式保存在电脑中,如图3.1所示。
3.1登录窗口
登录窗口如3.2所示,若登录错误,则出现图3.3。
- 插入dialog,添加类,然后在QuestionBank.cpp文件中的BOOL CQuestionBankApp::InitInstance()函数的最前面加上以下一段代码
while (TRUE)
{
CDlgLogin login_Dialog;
//模态对话框
int nReturn = login_Dialog.DoModal();//返回IDOK或IDCANCEL。如果返回的是IDCANCEL,则要调用WindowsCommDlgExtendedError函数来确定是否发生了一个错误。IDOK和IDCANCEL都是常量,它表明用户选择的是OK按钮还是Cancel按钮
if (nReturn == IDCANCEL) {//点击取消
return FALSE;
}
if (nReturn == IDOK) {//点击确定
HWND login_Hwnd = GetDlgItem(login_Dialog, IDD_LOGIN);
CString str_User = login_Dialog.m_strUser;
CString str_Password = login_Dialog.m_strPassword;
if (!(str_User == "admin" && str_Password == "123456")) {//如果用户名密码不是admin/123456,则报错,提示重新输入,直至正确为止。
if (IDOK == MessageBox(NULL, "用户ID或密码错误!\n 请重新输入!", "登录失败!", MB_OKCANCEL | MB_ICONERROR))
continue;
else
return FALSE;
}
else
break;}}
图3.1.1 登录窗口图 图3.1.2 登录错误
3.2主窗口
登录成功后可显示主窗口如图3.2.1主窗口所示,通过主窗口进入不同的窗口,可以查看上次答题记录,也可以进入管理模式实现对试题的增删改查和试题的分组,可以进入练习模式进行试题的练习,还可以进入测试模式进行抽题测试。
图3.2.1主窗口
3.3查看上次错题
点击查看上次错题可以查看上次的答题记录,如图3.3.1查看上次答题记录所示,该窗口同时也是测试模式中点击提交按钮后的判卷界面。
。。
图3.3.1查看上次答题记录
3.4管理模式
管理模式中具有试题的分组以及在分组中进行增删改查打开管理模式的界面,组名的下拉框默认选中第0个组名,打开以其为名的文件,并将其显示在列表控件中。
- 在ListControl中显示文本文件内容:
//初始化函数中设置每一列的名称:
m_Test_List.InsertColumn(0, _T("题目"), LVCFMT_LEFT, 200);
m_Test_List.InsertColumn(1, _T("A"), LVCFMT_LEFT, 300);
m_Test_List.InsertColumn(2, _T("B"), LVCFMT_LEFT, 300);
m_Test_List.InsertColumn(3, _T("C"), LVCFMT_LEFT, 300);
m_Test_List.InsertColumn(4, _T("D"), LVCFMT_LEFT, 300);
m_Test_List.InsertColumn(5, _T("答案"), LVCFMT_LEFT, 100);
m_Test_List.SetExtendedStyle( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//设置风格;整行选中;网格显示(属性中设置report报表风格)
//将文本内容读出来并显示在listcontrol控件中的函数:
//初始化函数中以及修改文件内容后都要调用这个函数,打开界面默认读出第一个组的文本内容
void CDlgAdmin::list_control_display()//从文件读出来并显示在列表控件中
{m_Test_List.SetRedraw(FALSE);
if (m_Test_List.GetItemCount() > 0)
m_Test_List.DeleteAllItems();//将文本内容显示在控件前先要清空控件的内容
CStdioFile myfile;
CString tt;
CString mArray[6];//将每一行分割成六份
if (myfile.Open(path, CFile::typeText | CFile::modeRead))//path为选择的组别,默认第一项
{while (myfile.ReadString(tt))
{for (int i = 0; i < 6; i++)
AfxExtractSubString(mArray[i], tt, i, ' '); //以空格字符拆分为不同数组以便操作
int n = m_Test_List.GetItemCount();//列表视图控件中的项数。
m_Test_List.InsertItem(n, mArray[0]);//插入第n排1列
m_Test_List.SetItemText(n, 1, mArray[1]);//插入第n排2列
m_Test_List.SetItemText(n, 2, mArray[2]);
m_Test_List.SetItemText(n, 3, mArray[3]);
m_Test_List.SetItemText(n, 4, mArray[4]);
m_Test_List.SetItemText(n, 5, mArray[5]);}
myfile.Close();
m_Test_List.SetRedraw(TRUE); //指定每次修改控件属性后是否自动重绘控件。
m_Test_List.Invalidate();
m_Test_List.UpdateWindow();}
else
MessageBox(_T("文件不存在!"), _T("读取失败"));
}
进入管理模式后,操作界面如图3.4.1所示。
........
........
图片好像需要保存到电脑才能上传,后面就不复制了