1. 源代码Github链接:
https://github.com/zhouhuiwei/exam/tree/test
2.PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 2100 | - |
Development | 开发 |
|
|
· Analysis | · 需求分析 (包括学习新技术) | 360 | 300 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 180 | 240 |
· Coding | · 具体编码 | 600 | 720 |
· Code Review | · 代码复审 | 240 | 240 |
· Test | · 测试(自我测试,修改代码,提交修改) | 540 | 600 |
Reporting | 报告 |
|
|
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 30 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
| 合计 | 2130 | 2265 |
3.团队编程
4.解题思路——需求分析:
【题目要求】将命令行方式的四则运算判题程序进一步做成图形化界面的程序
基于原始个人作业,两人原始均为C++语言编程,代码规范基本采用谷歌提出C++风格指南。
本程序采用VS2013 IDE 编程,采用MFC做界面和应用程序设计。主要完成的功能有:
作业要求选择 :
- 记录用户的历史做题情况,并且能够方便的进行查询或统计,再次运行程序时不会丢失。
- 用户可以选择练习模式或考试模式,设计不同的界面和交互逻辑。
- 有计时功能,能显示用户开始答题后的消耗时间。
选择题目包含数字的范围和运算符,答题结束后可回看错题,给出正误结果和正确率。
如何限定数据运算范围、如何限制使用的运算符种类、如何限定生成题目的数量、如何保证题目生成的随机性、如何输出题目到屏幕以及如何输出题目到文件
5.设计实现过程
1)参数初始化
用户选择数据范围,设置运算符符号和数目,输入此次题目数量
2)题目生成
借助单人作业基础,随机生成操作符和运算数据,在屏幕上输出,记录各个题目正确答案
3)判断正误
用户输入答案,与正确答案比对,判断正误,记录正误情况
4)保存
设置文件输出路径,将题目和判断结果输出到文本
6.代码说明
考试模式
void CTest::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
// TODO: 在此添加控件通知处理程序代码
/*以下程序功能为将CString类的路径转换为(const char*)*/
UpdateData(TRUE);
int nLength = spr.GetLength();
int nBytes = WideCharToMultiByte(CP_ACP, 0, spr, nLength, NULL, 0, NULL, NULL);
char *VoicePath = new char[nBytes + 1];
memset(VoicePath, 0, nLength + 1);
WideCharToMultiByte(CP_OEMCP, 0, spr, nLength, VoicePath, nBytes, NULL, NULL);
VoicePath[nBytes] = 0;
ofstream fout(VoicePath);
if (fout) { // 如果创建成功
fout << "共有" << inum << "道题目" << endl;
fout << "正确率为" << equat.okr << "%" << endl;
fout << "题目号" << " 题目" << " 用户答案" << " 正确答案" << " 是否正确" << endl;
for (int i = 0; i < inum; i++)
{
if (*(equat.temp + i))
{
/*输出题目号*/
fout << " ";
fout << i + 1 << " ";
/*输出题目*/
fout << *(equat.num1 - inum + i) << " ";
fout << *(equat.oper - inum + i) << " ";
fout << *(equat.num2 - inum + i) << " ";
/*输出用户答案*/
fout << *(equat.error_result - inum + i) << " ";
/*输出正确答案*/
fout << *(equat.ok_result - inum + i) << " ";
/*输出每道题的正误*/
fout << "正确" << endl << endl;
}
else
{
fout << " ";
fout << i + 1 << " ";;
fout << *(equat.num1 - inum + i) << " ";
fout << *(equat.oper - inum + i) << " ";
fout << *(equat.num2 - inum + i) << " ";
fout << *(equat.error_result - inum + i) << " ";
fout << *(equat.ok_result - inum + i) << " ";
fout << "错误" << endl << endl;
}
}
fout.close(); // 执行完操作后关闭文件句
}
spr = "文件已成功保存";
spr += "\r\n";
spr += "若重新做题,请首先初始化参数";
spr += "\r\n";
spr += "若退出,请单击“回到首页”按钮";
UpdateData(FALSE);
}
打印
void CPrint::OnBnClickedOk4()
{
// TODO: 在此添加控件通知处理程序代码
/***************************打印输出***********************************/
/*以下程序功能为将CString类的路径转换为(const char*)*/
UpdateData(TRUE);
int nLength = str.GetLength();
int nBytes = WideCharToMultiByte(CP_ACP, 0, str, nLength, NULL, 0, NULL, NULL);
char *VoicePath = new char[nBytes + 1];
memset(VoicePath, 0, nLength + 1);
WideCharToMultiByte(CP_OEMCP, 0, str, nLength, VoicePath, nBytes, NULL, NULL);
VoicePath[nBytes] = 0;
ofstream fout(VoicePath);
if (fout) { // 如果创建成功
fout << "题目号" << " 答案" << endl;
for (int i = 0; i < inum; i++)
{
/*输出题目号*/
fout << " ";
fout << i + 1 << " ";
/*输出正确答案*/
fout << *(equatio.ok_result - inum + i) << " " << endl;
}
fout.close(); // 执行完操作后关闭文件句
}
str = "答案已成功打印";
UpdateData(FALSE);
}
7.测试运行
运行截图: