软件工程——结对编程第二次作业

目录

  • 1. 题目及要求
  • 2. 功能的设计
  • 3. GUI(图形用户界面)的设计
  • 4. 容错机制的设计
    • 4.1 选择运算符的容错处理
    • 4.2 最大值和题目数输入的容错处理
    • 4.3 打开文件容错处理
    • 4.4 打印的容错处理
  • 5. 程序的运行效果
  • 6. 对领航员的评价
  • 7. 总结

本次作业所开发的程序已上传至Coding.net中

结对伙伴——王宗波

我在本次的作业中担任“驾驶员”的角色,王宗波同学担任“领航员”的角色

1. 题目及要求

在这里我们选择了“小学四则运算”自动生成的题目,其具体要求如下:

  • 能够自动生成四则运算练习题
  • 可以定制题目数量
  • 用户可以选择运算符
  • 用户设置最大数(如十以内、百以内等)
  • 用户选择是否有括号、是否有小数
  • 用户选择输出方式(如输出到文件、打印机等)
  • 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

2. 功能的设计

考虑到题目要求、开发难度和实际中的需求,我们决定开发的程序应具有如下功能:

  • 自动生成四则(混合)运算题目
  • 可以定制题目数量
  • 可以定制最大值
  • 可以定制四则运算符
  • 可以切换小数/整数运算
  • 可以添加括号改变运算顺序
  • 可以输出到文件,并能让用户方便的直接打开生成的文件
  • 可以调用系统接口进行打印的设置、页面的设置,进行打印预览和打印
  • 提供简单的图形化界面
  • 能对用户的非法操作进行容错处理

3. GUI(图形用户界面)的设计

我们选用了C#语言,开发Windows窗体应用程序来提供图形用户界面。
所设计的GUI如图所示
avator

其中左侧的Rich Text Box(富文本文本框)用来显示自动生成的题目。

上面的三个按钮分别实现自动生成题目、(若有则)打开文件和清空富文本框的功能。

左上角的通过Menu Strip控件实现的菜单栏提供了将当前生成的题目进行打印,和进行打印前的设置及打印预览功能,如下图所示。
avator

右侧的Check Box则提供了选择运算符、括号和小数,以及是否输出到文件的选项。

用户还可通过右侧的两个Text Box(文本框)输入题目的最大值和题目数。

GUI的设计代码由Visual Studio 2017完成。

4. 容错机制的设计

为了提高程序的Robustness,我们对用户的非法操作进行了容错处理。

4.1 选择运算符的容错处理

用户在点击“出题”按钮前,必须至少从“加”、“减”、“乘”、“除”四个运算符中选择一个,才能开始。

当用户没有选择运算符,直接进行出题操作是,进行如下的容错处理

if (Symbols.Count == 0)
{MessageBox.Show("加、减、乘、除运算符至少需要选择一个!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}

其效果如图所示
avator

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;
}

其效果如图所示
avatoravator

4.3 打开文件容错处理

用户在点击“打开文件”按钮前,必须已经有生成的文件

当用户未选择生成文件,又直接点击了“打开文件”按钮时,进行如下的容错处理

if(cbxFile.Checked==false)
{MessageBox.Show("未生成文件,无法打开!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}

其效果如图所示
avator

4.4 打印的容错处理

在尝试打印自动生成的题目时若出错,则进行如下的容错处理

try
{printPreviewDialog.ShowDialog();
}
catch(Exception excep)
{MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

5. 程序的运行效果

为了全面的演示程序的运行效果,我们选择所有的运算符,带有小数和括号,并且输出到文件来进行演示。

点击“出题”按钮,成功生成题目,并且导出到文件
avator
avator

点击“打开生成的文件”按钮,打开文件
avator

打开“打印”菜单,点击“打印设置”选项,进行打印前的设置
avator

点击“页面设置”选项,进行页面格式的设置
avator

点击“打印预览”选项,进行打印预览
avator

点击“打印”选项,进行打印
这里我们采用了Adobe公司提供的PDF虚拟打印机,可以看到如下的效果
avator

6. 对领航员的评价

本次我们这个项目的的领航员是王宗波同学。

在进行分析设计思路和用户需求时,领航员能够对整体开发思路有较清晰的统筹规划,结合实际提出了具有远见且实用的需求分析,并以此为基础,和我共同制定了清晰的包含了需要开发的功能的开发计划。

在开始编程前,领航员能够及时地审阅了我所大体设计地图形化用户界面,并提出了有针对性地建议有,与我进行了讨论。

在进行程序设计的时,领航员能够为程序代码地书写规范,程序中各功能的开发顺序和统筹兼顾实时的提出建议,为代码及时、准确的完成提供了帮助。

在编程结束后,能设计单元测试,及时发现和提出在开发时考虑不得当的地方和些许小错误。

美中不足的是,虽然领航员在结对编程时能及时地发现大部分的问题,但是代码中仍然有一些小问题是在编程结束后才发现并解决的。这可能是因为在进行开发时,驾驶员和领航员两个人的思路无法保持同步造成的。

总的来说,这次的结对编程,领航员在大多数术事件,都能正确、及时的完成领航员的职责。

结对编程时领航员和驾驶员的工作照片如图所示。

avator

7. 总结

本次的作业要求的题目,从总体上来说虽然有一定的难度,但是并不复杂。

这次作业是我们第一次尝试进行具有图形用户界面的程序的设计,由于之前的学习和编程经历,我们主要进行的都是C和C ++的控制台应用的开发与设计,所以这次在尝试开发图形化用户界面时,走了不少弯路。为了设计图形化用户界面,我们考虑了多种方案,比如使用C ++进行UWP应用的开发,使用Java继续宁开发,使用C #开发Windows窗体应用程序等……

在考虑到时间限制、学习难度和开发难度等条件下,我们最终决定,学习并使用C #进行Windows窗体应用程序的开发。由于C #和C ++在许多地方一脉相承,学习的过程总体来说还算顺利,尤其是语法方面,联系C ++的语法,认清C #和C ++在诸如数组之类的地方的区别,掌握起来十分容易。但在窗体的设计和开发方面,由于涉及到的控件较多,而他们的方法又不尽相同,学习起来需要一定的时间和精力。

在编程的过程中,为了增加代码的可读性和遵循规范化的开发流程,我们有意识地对窗体的控件,控件的事件和变量名等使用了匈牙利命名法。在换行,函数的设计和命名,循环和判断体的设计中也遵循了一定的规则。

第一次开发图形化用户界面,让我们有机会接触到比之前所学的课程知识更接近于现代化商业软件开发流程和的内容。更让我们体会到了在现代软件设计开发中,对图形化界面美观度,对用户的需求等方面的考虑的重要性。

在从零开始自学了一门程序设计语言,并编写出了可以运行的具有图形用户界面的程序后,也带给了我们成就感,能够鼓励我们继续在软件开发的领域继续学习探索。

但是这次的程序设计也有不完善的地方。

最开始考虑到的可以让用户选择是否显示答案的功能,由于在生成题目时,我们将数字和运算符以及括号全部转换成字符串的格式显示,所以如果要显示答案,就要进行字符串的匹配、转换、找到正确的运算顺序并计算等等一系列的功能,受限于本次的开发时间,我们没有能够完成这一功能的设计和开发。

另外我们在构思设计的初期,还考虑到了能让用户填写某一特定问题的答案,并进行批改,还可以让用户手动切换当前题目的功能。但由于我们采用了边生成边显示的生成题目方式,除了窗体里的富文本框以外,并没有设计可以存储已经生成的题目的数据结构,所以如果要实现此功能,还是需要对文本进行遍历、匹配、识别、判断运算顺序和计算,考虑到时间因素我们也没有完成这项功能。

虽然代码仍然存在这两方面的问题,但是我们在源代码中预留了实现这两个功能的函数位置,在本次作业后,我们仍然会找时间尝试完善这个项目。

总体来说,完成这次作业,让我们掌握了一门全新的程序设计语言,学习了GUI的设计与开发,认识并亲身体会了结对编程的流程,收获颇丰。

转载于:https://www.cnblogs.com/martinzhang98/p/10795247.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RUNOOB python练习题 32 列表的中括号符号小tips

用来练手的python练习题,原题链接: python练习实例32 题干: 按相反的顺序输出列表的值 拿到题目首先写下如下代码: a [1,2,3,4] for i in range(len(a)):print(a[len(a)-i-1])输出结果如下: 使用一个简单的循环就可以完成这个操作。但其实python有利用中括号操…

redis启动后出现WARNING you have Transparent Huge Pages (THP) support enabled in your kernel问题...

问题描述:启动redis后出现:WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command echo never > /sys/kernel/mm/trans…

Anaconda安装第三方包(whl文件)

先说下环境 Anaconda 对应Python3.5的版本 win7,64位系统。 step1:下载whl文件 step2:打开‘Anaconda Command Prompt‘, 如下图: step3:命令行窗口pip安装,代码如下: pip install 路径whl…

RUNOOB python练习题33 使用join方法实现用逗号分隔列表

用来练手的python练习题,原题链接:python练习实例33 题干: 按逗号分隔列表 用逗号分隔列表,我们就想到了join方法。 str.join(sequence)可以用自定的str字符串分隔一个序列,这个序列可以是字符串,列表,元组&#xff…

Use Vim as a Python IDE

Use Vim as a Python IDE I love vim and often use it to write Python code. Here are some useful plugins and tools for building a delightful vim python environment, escpecially for Vim8: 我喜欢vim,经常用它来编写Python代码。以下是一些有用的插件和工…

sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一、右击系

sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一、右击系统数据库master&…

RUNOOB python练习题 35 python print各色字体及背景

用来练手的python练习题,原题链接: python练习实例35 题干: 文本颜色设置 python中通过指令可以控制输出的背景颜色,前景颜色,以及显示方式。指令的语法如下: ’\033[显示方式;前景色;背景色m 输出字符 \033[0m’ 其…

ubuntu18.04 qemu环境搭建【学习笔记】

一、准备工具   1.1 安装相关工具     sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential 1.2 下载kernel(linux-4.0)与busybox(1.24)源码 https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ https://busybox.net/downloads/busy…

for else语句小tips : RUNOOB python练习题36

用来练手的python练习题,原题链接: python练习实例36 题干: 求100之内的素数 求某个范围内的素数,和之前的一个例题其实是一样的,上次的同类例题链接如下: python练习实例12 在实现题目要求时,这次用了for else语句&#xff0c…

Linux 下杀毒软件 clamav 的安装和使用

Linux 下杀毒软件 clamav 的安装和使用 安装依赖: 1 2 3 yum install -y pcre* zlib zlib-devel libssl-devel libssl yum install -y openssl yum install -y epel-release openssl version 0.9.8 or higher 1. yum 安装 clamav 安装后会自动生成服务文件&#…

列表,元组和range

内容大纲 列表的初识列表的索引切片列表的增删改查列表的嵌套元组的初识元组的简单应用range 昨日内容回顾以及作业讲解 int str boolstr 索引 s[x:y:z] 常用操作方法 upper lower startswith endswith split 分割:默认按照空格.将字符串分割成列表.可以知道分隔符 strip …

RUNOOB python练习题37 对一个序列的数进行排序

用来练手的Python练习题,原题链接: python练习实例37 题干: 对10个数进行排序 在我们使用Numpy模块时,这个问题是非常简单的,下面放出降序排列和升序排列的代码: 升序排列 import numpy as npresult np.zeros(10) for i in range(result…

Linux服务器不停的向外发包,且CPU持续100%

服务器不停的向外发包,且CPU持续100%,远程登录后查看发现有一长度为10的随机字符串进程,kill掉,会重新生成另外长度为10的字符串进程。删除文件也会重复生成,非常痛苦。查阅crond相关日志,发现实际执行的内…

逆向学习-IDApython(一)

背景 IDAPython 由三个分离的模块组成,他们分别是 idc,idautils 和 idaapi。 idc(注意大小写,不是 IDA 中的 IDC)是一个封装了 IDA 的 IDC 的兼容性模块,idautils 是 IDA 的高级实用功能模块,idaapi 允许了我们访问更加底层的数据。 基本操作 idc.Screen或者here()返回此时的地…

RUNOOB python练习题 39 数组排序

用来练手的python练习题,原题链接: python练习实例39 题干: 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 这个题目用列表List的sort,append方法非常简单,如下: 想要升序排列的话,就直接…

IIS 部署asp.net Provisional headers are shown 在VS2005返回值,部署不返回值

IIS 部署asp.net Provisional headers are shown 在VS2005调试返回值,部署到IIS不返回值 首先当时为了跨域的问题,在上面 后来把跨域的内容放在IIS去解决 其次,在每次返回结束的时候,加一句话 Response.End();

背包

学习博客https://www.cnblogs.com/fengziwei/p/7750849.html //为了不误导初学者,和给老手diss的机会,我就把以前发的删了, 有兴趣的看看那个博客就行了 (明明写好了,却被老师关机子...不开心转载于:https://www.cnblo…

POSIX线程

POSIX线程 标签(空格分隔): Linux程序设计 什么是线程 线程是一个进程内部的一个控制序列。 当在进程中创建一个新线程时,新的执行线程将拥有自己的栈(因此也有自己的局部变量),但与它的创建者共…

RUNOOB python练习题44

用来练手的python练习题,原题链接:python练习实例44 题干: 两个 3 行 3 列的矩阵,实现其对应位置的数据相加,并返回一个新矩阵 使用基本的List类写起来就比较麻烦,需要初始化一个3*3的全0矩阵,之后通过遍历将矩阵对应…

ImportError: No module named 'matplotlib'(python 安装各种 )

matplotlib 怎么弄啊 我应该是安装matplotlid了的 怎么还说我没有 编辑于:2017.03.22 12:28 0 分享 |评论0|收藏0|浏览7261 qq_37926784 声望: -4 3个回答 按赞数排序 用pip 也显示已经安装了matplotlib 编辑于:2018.03.26 19:43 分…