李永豪 201421123117 郑靖涛 201421123114
coding 地址:
一、题目描述
我们在中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:
- 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
- 有计时功能,能显示用户开始答题后的消耗时间。
- 界面支持中文简体/中文繁体/英语,用户可以选择一种;
二、题目要求
-
- 一个小组中的两个同学选取比较优秀的 作业1 (两个人的都独立完成了), 把它作为本次作业的基础,然后再修改。
- 结对编程实现上述功能,同样的,在程序正式开发之前,请先预估下PSP每个环节的消耗时间,并在过程中统计实际耗时,最后提交PSP表格。依然注意,这个主要是给你们自己看的,不必造假数据。
-
在两人合作的过程中, 请看下面的内容
a. 满足代码风格规范和代码设计规范(参考书第4章4.1-4.3内容)
- 请重视这点,在开发时两个人要有口头上的沟通:“好的,我们一起在开发中遵守一起认可的编码规范”- 请把你们约定的编码规范文档也提交到git b. 给人提意见的方式——送一个汉堡包http://www.cnblogs.com/xinz/archive/2011/08/22/2148776.htmlc. 理解领航员和驾驶员两种角色关系,并在结对编程中两个人轮流做对方的角色。两人都必须参与本次作业的编码工作,并在git提交日志上体现这点。
三、功能分析
- 实现GUI界面;
- 实现基础式子生成、计算以及判断对错;
- 记录过往的对错总数,并且在程序退出再启动时可以实现保存对错数量并增量计算;
- 实现计时功能;
四、思维导图
五、代码分析
1.使用MFC实现GUI界面
2.点击生成按钮自动生成式子
void C第二周Dlg::OnBnClickedButton1(){ CString num1; CString num2, result; CString oper; CString s1, s2; int b, c; char a; s1 = "正确答案"; s2 = "判断对错"; a = getopre(); b = random(0, 20); c = random(1, 20); oper.Format(_T("%c"), a); num1.Format(_T("%d"), b); num2.Format(_T("%d"), c); switch (a) { case '+': GetDlgItem(IDC_STA1)->SetWindowTextW(num1); GetDlgItem(IDC_STA2)->SetWindowTextW(oper); GetDlgItem(IDC_STA3)->SetWindowTextW(num2); break; case '-': GetDlgItem(IDC_STA1)->SetWindowTextW(num1); GetDlgItem(IDC_STA2)->SetWindowTextW(oper); GetDlgItem(IDC_STA3)->SetWindowTextW(num2); break; case '*': GetDlgItem(IDC_STA1)->SetWindowTextW(num1); GetDlgItem(IDC_STA2)->SetWindowTextW(oper); GetDlgItem(IDC_STA3)->SetWindowTextW(num2); break; case '/': b = c*b; num1.Format(_T("%d"), b); GetDlgItem(IDC_STA1)->SetWindowTextW(num1); GetDlgItem(IDC_STA2)->SetWindowTextW(oper); GetDlgItem(IDC_STA3)->SetWindowTextW(num2); break; } GetDlgItem(IDC_STA4)->SetWindowTextW(s1); GetDlgItem(IDC_STA5)->SetWindowTextW(s2); // TODO: 在此添加控件通知处理程序代码}
3.点击计算按钮,计算出正确答案并显示
void C第二周Dlg::OnBnClickedButton2(){ CString num1, oper, num2,s1,s2,s3,s4,answer; int result; GetDlgItem(IDC_STA1)->GetWindowText(num1); GetDlgItem(IDC_STA2)->GetWindowText(oper); GetDlgItem(IDC_STA3)->GetWindowText(num2); int a = _tstoi(LPCTSTR(num1)); int b = _tstoi(LPCTSTR(num2)); s1 = "+"; s2 = "-"; s3 = "*"; s4 = "/"; if (oper == s1) { result = a + b; } else if (oper == s2) { result = a - b; } else if (oper == s3) { result = a*b; } else { result = a / b; } answer.Format(_T("%d"), result); GetDlgItem(IDC_STA4)->SetWindowTextW(answer); // TODO: 在此添加控件通知处理程序代码}
4.输入用户计算结果后点击检验按钮,可以判断对错,并且记录保存对错数量
void C第二周Dlg::OnBnClickedButton5(){ CString num1, oper, num2, s1, s2, s3, s4,s5,s6,s7, answer,key,rights,mistakes; int result,right,mistake,i=0,t=0; CString strline; CStdioFile File1; CStdioFile File2; File1.Open(_T("TRUE.txt"), CFile::modeReadWrite); File2.Open(_T("FALSE.txt"), CFile::modeReadWrite); while (File1.ReadString(strline)) i++; while (File2.ReadString(strline)) t++; rights.Format(_T("%d"), i); mistakes.Format(_T("%d"), t); GetDlgItem(IDC_STA1)->GetWindowText(num1); GetDlgItem(IDC_STA2)->GetWindowText(oper); GetDlgItem(IDC_STA3)->GetWindowText(num2); int a = _tstoi(LPCTSTR(num1)); int b = _tstoi(LPCTSTR(num2)); s1 = "+"; s2 = "-"; s3 = "*"; s4 = "/"; s5 = "true"; s6 = "false"; s7 = "恭喜"; if (oper == s1) { result = a + b; } else if (oper == s2) { result = a - b; } else if (oper == s3) { result = a*b; } else { result = a / b; } answer.Format(_T("%d"), result); GetDlgItem(IDC_EDIT1)->GetWindowText(key); if (key == answer) { GetDlgItem(IDC_STA5)->SetWindowTextW(s5); GetDlgItem(IDC_STA4)->SetWindowTextW(s7); GetDlgItem(IDC_STA10)->SetWindowTextW(rights); File1.SeekToEnd(); File1.WriteString(rights); File1.Write("\n", 1); } else { GetDlgItem(IDC_STA5)->SetWindowTextW(s6); GetDlgItem(IDC_STA4)->SetWindowTextW(answer); GetDlgItem(IDC_STA11)->SetWindowTextW(mistakes); File2.SeekToEnd();//文件尾部 File2.WriteString(mistakes); File2.Write("\n", 1); } File1.Close(); File2.Close(); // TODO: 在此添加控件通知处理程序代码}
5.点击开始按钮开始计时,点击暂停按钮暂停计时
void C第二周Dlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialogEx::OnTimer(nIDEvent); static UINT mm = 0; static UINT ss = 0; static UINT mss = 0; CString str2; switch (nIDEvent) { case 1: mss++; if (mss == 60) { mss = 0; ss++; } if (ss == 60) { ss = 0; mm++; } str2.Format(_T("%02i:%02i:%02i"), mm, ss, mss); m_time.SetWindowTextW(str2); break; }}void C第二周Dlg::OnStnClickedSta6(){ // TODO: 在此添加控件通知处理程序代码}void C第二周Dlg::OnBnClickedButton4(){ // TODO: 在此添加控件通知处理程序代码 SetTimer(1, 1000, NULL);}void C第二周Dlg::OnBnClickedButton7(){ // TODO: 在此添加控件通知处理程序代码 KillTimer(1);}
六、PSP展示
PSP2.1 | Personal Software Process Stages | Time (%) Senior Student | Time (%) |
Planning | 计划 | 2h | 2.5h |
· Estimate | 估计这个任务需要多少时间 | 36h | 41h |
· Analysis | 需求分析 (包括学习新技术) | 1h | 2h |
· Coding Standard | 代码规范 | 1h | 1h |
· Design | 具体设计 | 2h | 3h |
· Coding | 具体编码 | 30h | 32h |
· Test | 测试(自我测试,修改代码,提交修改) | 1.5h | 2h |
Reporting | 报告 | 1h | 1h
|
七、总结
第一次尝试结对的方法进行编程,可以说是很不习惯的,因为从来编程都是一个人来完成的,两个人本来是可以分开写两个不同的模块,加快完成的速度,可是这样有的时候自己的思路和同伴的思路不相符,还需要解释,这样大大拉长了完成的时间。可有利有弊,有一个人在旁边复审,一段代码经过两双眼睛,这样减少了错误的发生,也可以集思广益想出更多的解决方法。但是即便如此我还是比较习惯于自己写代码,因为有个人在旁边看着让我感觉很不习惯,而且每一次的编程都需要调节两个人都有空的时间,感觉很麻烦。