介紹一款原創的四則運算算式生成器:CalculateIt2

家裏小朋友讀一年級了,最近天天都有一些10之內的加減法口算練習,做爲程序員爸爸,天然也是想辦法可以偷懶,讓電腦出題,給小朋友作些練習。因而,本身在業餘時間開發了一個四則運算算式生成器,名爲:CalculateIt2。項目是開源的,源碼地址是:https://github.com/daxnet/CalculateIt2。也能夠在標準的.NET Framework 4.6.1的項目中,經過nuget來引用這個類庫,nuget ID是:CalculateIt2.Engine。爲何名字後面有一個「2」呢?不是說這個項目比較二,而是以前作過一個簡單的版本,可是功能太差,就被拋棄了。如今是第二個版本。git

先睹爲快

首先,打開Visual Studio 2015,新建一個.NET Framework 4.6.1的控制檯應用程序,在項目上點擊鼠標右鍵,選擇Manage NuGet Packages,打開包管理界面,在搜索欄中輸入CalculateIt2.Engine,此時就能夠將本類庫添加到項目中:程序員

image

在Program.cs中,輸入如下代碼:github

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個計算因子的四則混合運算算式,以下:服務器

image

基本功能

此算式生成器類庫(CalculateIt2.Engine)不只能夠根據指定的算式格式產生算式,並且還能自定義算式生成規則,並使用生成的算式產生各類不一樣的試題題型。ide

算式格式定義

在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這個因子。orm

多種題型的試題生成

目前支持三種題型的試題生成:標準題,填空題和比大小。不一樣題型的試題生成器都須要繼承於CalculateIt2.Engine.Generation.QuestionGenerator{T}抽象類。目前默認提供了這三種題型的試題生成:blog

  • RegularQuestionGenerator:生成標準計算題題型,好比:2 + 3 – 1 = __________,同窗們把計算結果寫在橫線上
  • ClozeQuestionGenerator:生成填空題,好比:5 – 3 + (   ) = 6,同窗們在括號中填入數字,將算式補全
  • ComparisonQuestionGenerator:比大小題,好比:5 – 1 ○ 2,同窗們在圓圈中填入>、<或者=符號

固然,開發者能夠根據須要實現更多的題型。一個for循環下來,小朋友們要哭了。繼承

實現

此算式生成器使用了組合模式經典Visitor模式,並結合動態Visitor模式提供了額外的功能。如下是主要類型的類圖(點擊查看大圖),具體的實現細節就很少介紹了,你們能夠參考源代碼。

image

應用

我結合DocX這個開源類庫,寫了一個算術測試試卷的生成軟件(就是一個控制檯程序),它可使用CalculateIt2.Engine類庫產生10之內加減法的測試試卷,並輸出到一個Microsoft Word文檔,下面是效果:

image

請慎重幹相似的事情,這樣作會讓小朋友不喜歡你的。

接下來。。。

這個類庫我本身搭建了Jenkins服務器進行持續集成和nuget包的分發,接下來打算介紹一下這方面的內容。

相關文章
相關標籤/搜索