介紹一款原創的四則運算算式生成器: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,此時就可以將本類庫添加到項目中:

image

在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個計算因子的四則混合運算算式,如下:

image

基本功能

此算式生成器類庫(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模式提供了額外的功能。以下是主要類型的類圖(點擊查看大圖),具體的實現細節就不多介紹了,大家可以參考源代碼。

image

應用

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

image

請慎重干類似的事情,這樣做會讓小朋友不喜歡你的。

接下來。。。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM