队友学号:栗海辉 201421123121 黄良静 201421123103

题目描述:

我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:

1.记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
2.有计时功能,能显示用户开始答题后的消耗时间。
3.界面支持中文简体/中文繁体/英语,用户可以选择一种。

题目要求:

1.一个小组中的两个同学选取比较优秀的 作业1 (两个人的都独立完成了), 把它作为本次作业的基础,然后再修改。
2.结对编程实现上述功能,同样的,在程序正式开发之前,请先预估下PSP每个环节的消耗时间,并在过程中统计实际耗时,最后提交PSP表格。依然注意,这个主要是给你们自己看的,不必造假数据。
3.在两人合作的过程中, 请看下面的内容

a. 满足代码风格规范和代码设计规范(参考书第4章4.1-4.3内容)http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html

  • 请重视这点,在开发时两个人要有口头上的沟通:“好的,我们一起在开发中遵守一起认可的编码规范”
  • 请把你们约定的编码规范文档也提交到git

b. 给人提意见的方式——送一个汉堡包http://www.cnblogs.com/xinz/archive/2011/08/22/2148776.html
c. 理解领航员和驾驶员两种角色关系,并在结对编程中两个人轮流做对方的角色。两人都必须参与本次作业的编码工作,并在git提交日志上体现这点。

需求分析:

  • 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
    • 1.首先应该创建一个用于存放错误题目的.txt文件。
    • 2.在每次判断函数以后若判断为错误,应把生成的题目自动存放到txt文件中。
    • 3.每次增加错误题目的时候记录的错题数目应该+1.
    • 4.错误题目的数量也保存到一个文件中记录下来,每当有错误实时更新错误数量。
  • 有计时功能,能显示用户开始答题后的消耗时间。
    • 1.首先记录时间的计数器不能被界面覆盖应该放置在明显的顶部或者右上方。
    • 2.在运行过程中不应该应在未做完题目之前不能够终止计时,并且在答题完成以后终止技术工作。
    • 3.在每次重新开始答题的时候计时器自动清零。
  • 界面支持中文简体/中文繁体/英语,用户可以选择一种。
    • 1.引用SetThreadUILanguage函数用于转换语言
    • 2.添加改变语言的按钮,用于链接不同语言的切换
    • 3.用不同的按钮实现改变不同的语言。
    • 4.初始使用语言为系统语言。

程序设计:针对选择的新开发功能做设计,使用思维导图

代码展示:

初始化赋值正确错误题数


FILE * in;
	if (fopen_s(&in, "tf.txt", "r")!=0)
	{
		fopen_s(&in, "tf.txt", "w");
	}
	fscanf_s(in, "%d,%d", &t, &f);
	fclose(in);
	n = t + f;

写入


FILE * out;
             fopen_s(&out, "tf.txt", "w");
	fprintf_s(out, "%d,%d", t, f);
	fclose(out);

插入定时器


void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	static UINT s1 = 0;
	static UINT f1 = 0;
	static UINT h1 = 0;
	CString str;
	switch (nIDEvent) 
	{
	case 1:
		s1++;
		if (s1 == 60) { s1 = 0; f1++; }
		if (f1 == 60) { f1 = 0; h1++; }
		str.Format(_T("%02i:%02i:%02i"), h1, f1, s1);
		SetDlgItemText(IDC_EDIT6, str);
		break;
	case 2:
		s2++;
		if (s2 == 60) { s2 = 0; f2++; }
		if (f2 == 60) { f2 = 0; h2++; }
		str.Format(_T("%02i:%02i:%02i"), h2, f2, s2);
		SetDlgItemText(IDC_EDIT8, str);
		break;
	}
	CDialogEx::OnTimer(nIDEvent);
}

使用定时器

SetTimer(1, 1000, NULL);

使用代码实现在生成题目前无法提交答案,提交答案前无法生成下一道题。

GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);

切换语言

以改线程语言来切换使用的语言包

SetThreadUILanguage(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));  \\使用English(美式)

程序运行截图:

小结感受:结队编程真的能够带来1+1>2的效果吗?通过这次结队编程,请谈谈你的感受和体会。

经历了第一次结队编程明显的问题主要体现在不同人的心理上的差异。平时编程都是自己一个人搞定。无论是编程方向还是编程结构都是自己做主。但是结队编程是两个人的事情,编写代码用的基本语法和编写规范都要让两个人都看的舒服都要看的懂才可以。在开发过程中,要打起100%的精神。两个人在不断的审查过程中不论是编写代码的人还是审查的人都应该重新再讲代码重新审视。将每每段程序做到准确无误。

码市链接 https://git.coding.net/lenmo/MFC_sizeyunsuan.git

描述结队的过程,提供非摆拍的两人在讨论、细化和编程时的结队照片:

提供此次结队作业的PSP: