介绍一款原创的四则运算算式生成器:CalculateIt2
家里小朋友读一年级了,最近每天都有一些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的更多相关文章
- 介绍一款docker管理工具——portainer
介绍一款docker管理工具--portainer 目录 介绍一款docker管理工具--portainer 1.背景 1.1 管理docker方法上一般有两种 1.1.1 命令行形式 1.1.2 U ...
- Linux下介绍一款不错的HTML编辑器
编写HTML文档需要编辑器,在windows平台上我们可以用NotePad++,下面介绍一款Linux下的编辑器Komodo Edit,这是一款免费,开源的编辑器. 他对HTML的支持有其独到之处,我 ...
- 《介绍一款开源的类Excel电子表格软件》续:七牛云存储实战(C#)
两个月前的发布的博客<介绍一款开源的类Excel电子表格软件>引起了热议:在博客园有近2000个View.超过20个评论. 同时有热心读者电话咨询如何能够在SpreadDesing中实现存 ...
- 介绍4款json的java类库 及 其性能测试
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...
- 介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7
原文:介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7 toad for sqlserver5.7 虽然SSMS很好很强大,不过有时候使用一些第三方工具可以 ...
- 介绍一款小众的IDE
作为前端工程师的你们平时主要使用什么IDE,atom.webstorm.sublime还是vscode? 今天介绍一款比较小众的IDE,Adobe的开源项目Brackets,提供Windows和OS ...
- 介绍两款Linux文件恢复工具,ext3grep与extundelete https://www.cnblogs.com/lazyfang/p/7699994.html
介绍两款Linux文件恢复工具,ext3grep与extundelete,可能在关键时刻会有所帮助.ext3grep仅对ext3文件系统有效,extundelete对ext3与ext4文件系统都有效 ...
- 介绍一款“对话框”组件之 “artDialog”在项目中的使用
在实际开发项目中经常会用到对话框组件,提示一些信息.其实有很多,例如:在项目中常用到的“Jquery-UI.Jquery-EasyUI”的.Dialog,他们也很强大,Api文档也很多.今天就介绍一款 ...
- 介绍两款常用的“图表统计图"的插件
一.相信朋友们在开发的过程中都会使用到“数据统计”的功能,图表的统计更为直观,在这里就介绍两款插件:fusionChart.DataVisualization. 1.fusionChart实际项目中用 ...
随机推荐
- 前端开发中SEO的十二条总结
一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...
- Windows server 2012 添加中文语言包(英文转为中文)(离线)
Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
- 强强联合,Testin云测&云层天咨众测学院开课了!
Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱? 2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...
- css样式之background详解
background用法详解: 1.background-color 属性设置元素的背景颜色 可能的值 color_name 规定颜色值为颜色名称的背景颜色(比如 red) he ...
- es6小白学习笔记(一)
1.let和const命令 1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域) { let a = 1; v ...
- 编译器开发系列--Ocelot语言3.类型名称的消解
"类型名称的消解"即类型的消解.类型名称由TypeRef 对象表示,类型由Type 对象表示.类型名称的消解就是将TypeRef 对象转换为Type 对象. TypeResolve ...
- Android开发学习——画横线竖线
画横线/竖线 竖线 <View android:layout_width="1dp" android:layout_height="match_parent&quo ...
- 如何给FineReport设置自定义消息提醒工具
FineReport设计器有自动的消息推送功能,可设置报表定时推送和常规的日报周报推送.官方有自己的消息推送的接口,不过有些用户旺旺希望自己开发,符合自己需求的推送界面. 下面这个方案就从逻辑层面简单 ...
- java的poi技术读取Excel数据到MySQL
这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...