介绍一款原创的四则运算算式生成器: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包的分發,接下來打算介紹一下這方面的內容。
轉載于:https://www.cnblogs.com/daxnet/p/5902057.html
總結
以上是生活随笔為你收集整理的介绍一款原创的四则运算算式生成器:CalculateIt2的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 网关系统架构
 - 下一篇: python怎么暂停运行_如何让pyth