本次作业所开发的程序已上传至Coding.net中
结对伙伴——王宗波
我在本次的作业中担任“驾驶员”的角色,王宗波同学担任“领航员”的角色
1. 题目及要求
在这里我们选择了“小学四则运算”自动生成的题目,其具体要求如下:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
2. 功能的设计
考虑到题目要求、开发难度和实际中的需求,我们决定开发的程序应具有如下功能:
- 自动生成四则(混合)运算题目
- 可以定制题目数量
- 可以定制最大值
- 可以定制四则运算符
- 可以切换小数/整数运算
- 可以添加括号改变运算顺序
- 可以输出到文件,并能让用户方便的直接打开生成的文件
- 可以调用系统接口进行打印的设置、页面的设置,进行打印预览和打印
- 提供简单的图形化界面
- 能对用户的非法操作进行容错处理
3. GUI(图形用户界面)的设计
我们选用了C#语言,开发Windows窗体应用程序来提供图形用户界面。
所设计的GUI如图所示
其中左侧的Rich Text Box(富文本文本框)用来显示自动生成的题目。
上面的三个按钮分别实现自动生成题目、(若有则)打开文件和清空富文本框的功能。
左上角的通过Menu Strip控件实现的菜单栏提供了将当前生成的题目进行打印,和进行打印前的设置及打印预览功能,如下图所示。
右侧的Check Box则提供了选择运算符、括号和小数,以及是否输出到文件的选项。
用户还可通过右侧的两个Text Box(文本框)输入题目的最大值和题目数。
GUI的设计代码由Visual Studio 2017完成。
4. 容错机制的设计
为了提高程序的Robustness,我们对用户的非法操作进行了容错处理。
4.1 选择运算符的容错处理
用户在点击“出题”按钮前,必须至少从“加”、“减”、“乘”、“除”四个运算符中选择一个,才能开始。
当用户没有选择运算符,直接进行出题操作是,进行如下的容错处理
if (Symbols.Count == 0)
{
MessageBox.Show("加、减、乘、除运算符至少需要选择一个!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
其效果如图所示
4.2 最大值和题目数输入的容错处理
用户在开始出题前,必须首先输入最大值和题目数。
当用户没有输入而直接点击“出题”按钮时,进行如下的容错处理
string max = tbxMax.Text;
string num = tbxNum.Text;
if (tbxMax.Text == String.Empty)
{
MessageBox.Show("最大值不能为空!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (tbxNum.Text == String.Empty)
{
MessageBox.Show("题目数不能为空!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
其效果如图所示
4.3 打开文件容错处理
用户在点击“打开文件”按钮前,必须已经有生成的文件
当用户未选择生成文件,又直接点击了“打开文件”按钮时,进行如下的容错处理
if(cbxFile.Checked==false)
{
MessageBox.Show("未生成文件,无法打开!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
其效果如图所示
4.4 打印的容错处理
在尝试打印自动生成的题目时若出错,则进行如下的容错处理
try
{
printPreviewDialog.ShowDialog();
}
catch(Exception excep)
{
MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
5. 程序的运行效果
为了全面的演示程序的运行效果,我们选择所有的运算符,带有小数和括号,并且输出到文件来进行演示。
点击“出题”按钮,成功生成题目,并且导出到文件
点击“打开生成的文件”按钮,打开文件
打开“打印”菜单,点击“打印设置”选项,进行打印前的设置
点击“页面设置”选项,进行页面格式的设置
点击“打印预览”选项,进行打印预览
点击“打印”选项,进行打印
这里我们采用了Adobe公司提供的PDF虚拟打印机,可以看到如下的效果
6. 对领航员的评价
本次我们这个项目的的领航员是王宗波同学。
在进行分析设计思路和用户需求时,领航员能够对整体开发思路有较清晰的统筹规划,结合实际提出了具有远见且实用的需求分析,并以此为基础,和我共同制定了清晰的包含了需要开发的功能的开发计划。
在开始编程前,领航员能够及时地审阅了我所大体设计地图形化用户界面,并提出了有针对性地建议有,与我进行了讨论。
在进行程序设计的时,领航员能够为程序代码地书写规范,程序中各功能的开发顺序和统筹兼顾实时的提出建议,为代码及时、准确的完成提供了帮助。
在编程结束后,能设计单元测试,及时发现和提出在开发时考虑不得当的地方和些许小错误。
美中不足的是,虽然领航员在结对编程时能及时地发现大部分的问题,但是代码中仍然有一些小问题是在编程结束后才发现并解决的。这可能是因为在进行开发时,驾驶员和领航员两个人的思路无法保持同步造成的。
总的来说,这次的结对编程,领航员在大多数术事件,都能正确、及时的完成领航员的职责。
结对编程时领航员和驾驶员的工作照片如图所示。
7. 总结
本次的作业要求的题目,从总体上来说虽然有一定的难度,但是并不复杂。
这次作业是我们第一次尝试进行具有图形用户界面的程序的设计,由于之前的学习和编程经历,我们主要进行的都是C和C ++的控制台应用的开发与设计,所以这次在尝试开发图形化用户界面时,走了不少弯路。为了设计图形化用户界面,我们考虑了多种方案,比如使用C ++进行UWP应用的开发,使用Java继续宁开发,使用C #开发Windows窗体应用程序等……
在考虑到时间限制、学习难度和开发难度等条件下,我们最终决定,学习并使用C #进行Windows窗体应用程序的开发。由于C #和C ++在许多地方一脉相承,学习的过程总体来说还算顺利,尤其是语法方面,联系C ++的语法,认清C #和C ++在诸如数组之类的地方的区别,掌握起来十分容易。但在窗体的设计和开发方面,由于涉及到的控件较多,而他们的方法又不尽相同,学习起来需要一定的时间和精力。
在编程的过程中,为了增加代码的可读性和遵循规范化的开发流程,我们有意识地对窗体的控件,控件的事件和变量名等使用了匈牙利命名法。在换行,函数的设计和命名,循环和判断体的设计中也遵循了一定的规则。
第一次开发图形化用户界面,让我们有机会接触到比之前所学的课程知识更接近于现代化商业软件开发流程和的内容。更让我们体会到了在现代软件设计开发中,对图形化界面美观度,对用户的需求等方面的考虑的重要性。
在从零开始自学了一门程序设计语言,并编写出了可以运行的具有图形用户界面的程序后,也带给了我们成就感,能够鼓励我们继续在软件开发的领域继续学习探索。
但是这次的程序设计也有不完善的地方。
最开始考虑到的可以让用户选择是否显示答案的功能,由于在生成题目时,我们将数字和运算符以及括号全部转换成字符串的格式显示,所以如果要显示答案,就要进行字符串的匹配、转换、找到正确的运算顺序并计算等等一系列的功能,受限于本次的开发时间,我们没有能够完成这一功能的设计和开发。
另外我们在构思设计的初期,还考虑到了能让用户填写某一特定问题的答案,并进行批改,还可以让用户手动切换当前题目的功能。但由于我们采用了边生成边显示的生成题目方式,除了窗体里的富文本框以外,并没有设计可以存储已经生成的题目的数据结构,所以如果要实现此功能,还是需要对文本进行遍历、匹配、识别、判断运算顺序和计算,考虑到时间因素我们也没有完成这项功能。
虽然代码仍然存在这两方面的问题,但是我们在源代码中预留了实现这两个功能的函数位置,在本次作业后,我们仍然会找时间尝试完善这个项目。
总体来说,完成这次作业,让我们掌握了一门全新的程序设计语言,学习了GUI的设计与开发,认识并亲身体会了结对编程的流程,收获颇丰。