家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习。于是,自己在业余时间开发了一个四则运算算式生成器,名为:CalculateIt2。项目是开源的,源码地址是:https://github.com/daxnet/CalculateIt2。也可以在标准的.NET Framework 4.6.1的项目中,通过nuget来引用这个类库,nuget ID是:CalculateIt2.Engine。为什么名字后面有一个“2”呢?不是说这个项目比较二,而是之前做过一个简单的版本,但是功能太差,就被抛弃了。现在是第二个版本。

先睹为快

首先,打开Visual Studio 2015,新建一个.NET Framework 4.6.1的控制台应用程序,在项目上点击鼠标右键,选择Manage NuGet Packages,打开包管理界面,在搜索栏中输入CalculateIt2.Engine,此时就可以将本类库添加到项目中:

在Program.cs中,输入以下代码:

class Program
{
static void Main(string[] args)
{
var formation = "{10}+-*/|3";
var equation = new ArithmeticEquationGenerator(formation,
new AvoidNegativeResultRule(),
new DivisibilityEnsuranceRule());
for (var i = 0; i < 10; i++)
{
var calculation = equation.Generate();
Console.WriteLine($"{calculation.ToFormattedString(SpacingOption.Thin)} = {calculation.Value}");
}
}
}

以上代码会产生10个10以内,包含3个计算因子的四则混合运算算式,如下:

基本功能

此算式生成器类库(CalculateIt2.Engine)不仅可以根据指定的算式格式产生算式,而且还能自定义算式生成规则,并使用生成的算式产生各种不同的试题题型。

算式格式定义

在ArithmeticEquationGenerator类的构造函数中,第一个参数指定了需要生成的算式格式,例如,在上例的格式字符串{10}+-*/|3中:

  • {10}:指定了每个因子的取值范围,语义上表示10以内。{30}则表示30以内
  • +-*/:指定了算式中可以包含的运算符,这里是支持四则运算。如果只指定+-,那么生成的算式中只会出现加法和减法。至少需要指定一个运算符,相同的运算符不能出现多次
  • |:竖线是前半部分和后半部分的分割线。竖线及以后的部分都是可有可无的
  • 竖线之后的3:表示产生3个因子的算式,比如上例中所有的算式都是由三个因子组成。此处还可以指定因子个数的范围,最大数和最小数之间用减号隔开,比如:{10}+-|2-5,则表示需要生成10以内的加减法运算算式,每个算式最多可以包含5个因子,最少需要包含2个因子

算式生成规则

在ArithmeticEquationGenerator类的构造函数的第二个之后的参数中,指定了算式生成规则的类的实例。这些类都实现了CalculateIt2.Engine.Rules.IRule接口,目前在CalculateIt2.Engine类库中提供了以下几种生成规则:

  • AvoidDivideByZeroRule:当算式中出现除法的时候,避免除法运算出现“除以零”的错误。此规则是内建规则,由ArithmeticEquationGenerator产生的算式都适用该规则
  • AvoidNegativeResultRule:当算式中出现减法的时候,避免减法运算出现负数结果。此规则可以在构造ArithmeticEquationGenerator时选择指定,它的选择与否不会对算式的生成产生致命的影响。但如果是为低年级的小朋友生成算式,那么负数的概念就应该去掉(人家一年级还没有接触负数呢)
  • DivisibilityEnsuranceRule:当算式中出现除法的时候,确保被除数可以被除数整除。此规则可以在构造ArithmeticEquationGenerator时选择指定,同样,它的选择与否不会对算式的生成产生致命的影响。对于低年级小朋友,还没有小数的概念,因此,在生成算式的时候,加入这个规则也是很有必要的

除此之外,开发者可以自己扩展IRule接口,定义算式生成的一些特殊规则,比如:在算式中避免出现0这个因子。

多种题型的试题生成

目前支持三种题型的试题生成:标准题,填空题和比大小。不同题型的试题生成器都需要继承于CalculateIt2.Engine.Generation.QuestionGenerator{T}抽象类。目前默认提供了这三种题型的试题生成:

  • RegularQuestionGenerator:生成标准计算题题型,比如:2 + 3 – 1 = __________,同学们把计算结果写在横线上
  • ClozeQuestionGenerator:生成填空题,比如:5 – 3 + (   ) = 6,同学们在括号中填入数字,将算式补全
  • ComparisonQuestionGenerator:比大小题,比如:5 – 1 ○ 2,同学们在圆圈中填入>、<或者=符号

当然,开发者可以根据需要实现更多的题型。一个for循环下来,小朋友们要哭了。

实现

此算式生成器使用了组合模式经典Visitor模式,并结合动态Visitor模式提供了额外的功能。以下是主要类型的类图(点击查看大图),具体的实现细节就不多介绍了,大家可以参考源代码。

应用

我结合DocX这个开源类库,写了一个算术测试试卷的生成软件(就是一个控制台程序),它可以使用CalculateIt2.Engine类库产生10以内加减法的测试试卷,并输出到一个Microsoft Word文档,下面是效果:

请慎重干类似的事情,这样做会让小朋友不喜欢你的。

接下来。。。

这个类库我自己搭建了Jenkins服务器进行持续集成和nuget包的分发,接下来打算介绍一下这方面的内容。

介绍一款原创的四则运算算式生成器:CalculateIt2的更多相关文章

  1. 介绍一款docker管理工具——portainer

    介绍一款docker管理工具--portainer 目录 介绍一款docker管理工具--portainer 1.背景 1.1 管理docker方法上一般有两种 1.1.1 命令行形式 1.1.2 U ...

  2. Linux下介绍一款不错的HTML编辑器

    编写HTML文档需要编辑器,在windows平台上我们可以用NotePad++,下面介绍一款Linux下的编辑器Komodo Edit,这是一款免费,开源的编辑器. 他对HTML的支持有其独到之处,我 ...

  3. 《介绍一款开源的类Excel电子表格软件》续:七牛云存储实战(C#)

    两个月前的发布的博客<介绍一款开源的类Excel电子表格软件>引起了热议:在博客园有近2000个View.超过20个评论. 同时有热心读者电话咨询如何能够在SpreadDesing中实现存 ...

  4. 介绍4款json的java类库 及 其性能测试

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...

  5. 介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7

    原文:介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7 toad for sqlserver5.7 虽然SSMS很好很强大,不过有时候使用一些第三方工具可以 ...

  6. 介绍一款小众的IDE

    作为前端工程师的你们平时主要使用什么IDE,atom.webstorm.sublime还是vscode? 今天介绍一款比较小众的IDE,Adobe的开源项目Brackets,提供Windows和OS ...

  7. 介绍两款Linux文件恢复工具,ext3grep与extundelete https://www.cnblogs.com/lazyfang/p/7699994.html

    介绍两款Linux文件恢复工具,ext3grep与extundelete,可能在关键时刻会有所帮助.ext3grep仅对ext3文件系统有效,extundelete对ext3与ext4文件系统都有效  ...

  8. 介绍一款“对话框”组件之 “artDialog”在项目中的使用

    在实际开发项目中经常会用到对话框组件,提示一些信息.其实有很多,例如:在项目中常用到的“Jquery-UI.Jquery-EasyUI”的.Dialog,他们也很强大,Api文档也很多.今天就介绍一款 ...

  9. 介绍两款常用的“图表统计图"的插件

    一.相信朋友们在开发的过程中都会使用到“数据统计”的功能,图表的统计更为直观,在这里就介绍两款插件:fusionChart.DataVisualization. 1.fusionChart实际项目中用 ...

随机推荐

  1. mobx @computed的解读

    写在前面:我一开始看不懂官网的@computed的作用,因为即使我把@computed去掉,依然能正确的report,然后我百度谷歌都找不到答案,下面都是我自己的理解,如果是有问题的,不对的,请务必留 ...

  2. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  3. SQL Server2014 SP2新增的数据库克隆功能

    SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtest use testtest go --创建表 )) --插入数 ...

  4. 再谈CAAnimation动画

    CAAnimaton动画分为CABasicAnimation & CAKeyframeAnimation CABasicAnimation动画, 顾名思义就是最基本的动画, 老规矩先上代码: ...

  5. 【云知道】究极秒杀Loadrunner乱码

    Loadrunner乱码一击必杀 之前有介绍一些简单的针对Loadrunner脚本或者调试输出内容中乱码的一些设置,但是并没能完全解决一些小伙伴的问题,因为那些设置实在能力有限,还是有很多做不到的事情 ...

  6. C#项目中文件的具体含义

    1.Bin 目录 用来存放编译的结果,bin是二进制binary的英文缩写,因为最初C编译的程序文件都是二进制文件,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin ...

  7. StringUtils的isBlank与isEmply

    1.public static boolean isEmpty(String str) 判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0 StringUtil ...

  8. BPM助力企业数字化转型

    自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...

  9. SQL SERVER导入数据到ORACLE的方法总结

    我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去OR ...

  10. 如何编译Zookeeper源码

    1. 安装Ant Ant下载地址:http://ant.apache.org/bindownload.cgi 解压即可. 2. 下载Zookeeper源码包 https://github.com/ap ...