介绍一款原创的四则运算算式生成器:CalculateIt2
家里小朋友讀一年級(jí)了,最近每天都有一些10以內(nèi)的加減法口算練習(xí),作為程序員爸爸,自然也是想辦法能夠偷懶,讓電腦出題,給小朋友做些練習(xí)。于是,自己在業(yè)余時(shí)間開發(fā)了一個(gè)四則運(yùn)算算式生成器,名為:CalculateIt2。項(xiàng)目是開源的,源碼地址是:https://github.com/daxnet/CalculateIt2。也可以在標(biāo)準(zhǔn)的.NET Framework 4.6.1的項(xiàng)目中,通過nuget來引用這個(gè)類庫,nuget ID是:CalculateIt2.Engine。為什么名字后面有一個(gè)“2”呢?不是說這個(gè)項(xiàng)目比較二,而是之前做過一個(gè)簡(jiǎn)單的版本,但是功能太差,就被拋棄了。現(xiàn)在是第二個(gè)版本。
先睹為快
首先,打開Visual Studio 2015,新建一個(gè).NET Framework 4.6.1的控制臺(tái)應(yīng)用程序,在項(xiàng)目上點(diǎn)擊鼠標(biāo)右鍵,選擇Manage NuGet Packages,打開包管理界面,在搜索欄中輸入CalculateIt2.Engine,此時(shí)就可以將本類庫添加到項(xiàng)目中:
在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}");}} }以上代碼會(huì)產(chǎn)生10個(gè)10以內(nèi),包含3個(gè)計(jì)算因子的四則混合運(yùn)算算式,如下:
基本功能
此算式生成器類庫(CalculateIt2.Engine)不僅可以根據(jù)指定的算式格式產(chǎn)生算式,而且還能自定義算式生成規(guī)則,并使用生成的算式產(chǎn)生各種不同的試題題型。
算式格式定義
在ArithmeticEquationGenerator類的構(gòu)造函數(shù)中,第一個(gè)參數(shù)指定了需要生成的算式格式,例如,在上例的格式字符串{10}+-*/|3中:
- {10}:指定了每個(gè)因子的取值范圍,語義上表示10以內(nèi)。{30}則表示30以內(nèi)
- +-*/:指定了算式中可以包含的運(yùn)算符,這里是支持四則運(yùn)算。如果只指定+-,那么生成的算式中只會(huì)出現(xiàn)加法和減法。至少需要指定一個(gè)運(yùn)算符,相同的運(yùn)算符不能出現(xiàn)多次
- |:豎線是前半部分和后半部分的分割線。豎線及以后的部分都是可有可無的
- 豎線之后的3:表示產(chǎn)生3個(gè)因子的算式,比如上例中所有的算式都是由三個(gè)因子組成。此處還可以指定因子個(gè)數(shù)的范圍,最大數(shù)和最小數(shù)之間用減號(hào)隔開,比如:{10}+-|2-5,則表示需要生成10以內(nèi)的加減法運(yùn)算算式,每個(gè)算式最多可以包含5個(gè)因子,最少需要包含2個(gè)因子
算式生成規(guī)則
在ArithmeticEquationGenerator類的構(gòu)造函數(shù)的第二個(gè)之后的參數(shù)中,指定了算式生成規(guī)則的類的實(shí)例。這些類都實(shí)現(xiàn)了CalculateIt2.Engine.Rules.IRule接口,目前在CalculateIt2.Engine類庫中提供了以下幾種生成規(guī)則:
- AvoidDivideByZeroRule:當(dāng)算式中出現(xiàn)除法的時(shí)候,避免除法運(yùn)算出現(xiàn)“除以零”的錯(cuò)誤。此規(guī)則是內(nèi)建規(guī)則,由ArithmeticEquationGenerator產(chǎn)生的算式都適用該規(guī)則
- AvoidNegativeResultRule:當(dāng)算式中出現(xiàn)減法的時(shí)候,避免減法運(yùn)算出現(xiàn)負(fù)數(shù)結(jié)果。此規(guī)則可以在構(gòu)造ArithmeticEquationGenerator時(shí)選擇指定,它的選擇與否不會(huì)對(duì)算式的生成產(chǎn)生致命的影響。但如果是為低年級(jí)的小朋友生成算式,那么負(fù)數(shù)的概念就應(yīng)該去掉(人家一年級(jí)還沒有接觸負(fù)數(shù)呢)
- DivisibilityEnsuranceRule:當(dāng)算式中出現(xiàn)除法的時(shí)候,確保被除數(shù)可以被除數(shù)整除。此規(guī)則可以在構(gòu)造ArithmeticEquationGenerator時(shí)選擇指定,同樣,它的選擇與否不會(huì)對(duì)算式的生成產(chǎn)生致命的影響。對(duì)于低年級(jí)小朋友,還沒有小數(shù)的概念,因此,在生成算式的時(shí)候,加入這個(gè)規(guī)則也是很有必要的
除此之外,開發(fā)者可以自己擴(kuò)展IRule接口,定義算式生成的一些特殊規(guī)則,比如:在算式中避免出現(xiàn)0這個(gè)因子。
多種題型的試題生成
目前支持三種題型的試題生成:標(biāo)準(zhǔn)題,填空題和比大小。不同題型的試題生成器都需要繼承于CalculateIt2.Engine.Generation.QuestionGenerator{T}抽象類。目前默認(rèn)提供了這三種題型的試題生成:
- RegularQuestionGenerator:生成標(biāo)準(zhǔn)計(jì)算題題型,比如:2 + 3 – 1 = __________,同學(xué)們把計(jì)算結(jié)果寫在橫線上
- ClozeQuestionGenerator:生成填空題,比如:5 – 3 + (?? ) = 6,同學(xué)們?cè)诶ㄌ?hào)中填入數(shù)字,將算式補(bǔ)全
- ComparisonQuestionGenerator:比大小題,比如:5 – 1 ○ 2,同學(xué)們?cè)趫A圈中填入>、<或者=符號(hào)
當(dāng)然,開發(fā)者可以根據(jù)需要實(shí)現(xiàn)更多的題型。一個(gè)for循環(huán)下來,小朋友們要哭了。
實(shí)現(xiàn)
此算式生成器使用了組合模式和經(jīng)典Visitor模式,并結(jié)合動(dòng)態(tài)Visitor模式提供了額外的功能。以下是主要類型的類圖(點(diǎn)擊查看大圖),具體的實(shí)現(xiàn)細(xì)節(jié)就不多介紹了,大家可以參考源代碼。
應(yīng)用
我結(jié)合DocX這個(gè)開源類庫,寫了一個(gè)算術(shù)測(cè)試試卷的生成軟件(就是一個(gè)控制臺(tái)程序),它可以使用CalculateIt2.Engine類庫產(chǎn)生10以內(nèi)加減法的測(cè)試試卷,并輸出到一個(gè)Microsoft Word文檔,下面是效果:
請(qǐng)慎重干類似的事情,這樣做會(huì)讓小朋友不喜歡你的。
接下來。。。
這個(gè)類庫我自己搭建了Jenkins服務(wù)器進(jìn)行持續(xù)集成和nuget包的分發(fā),接下來打算介紹一下這方面的內(nèi)容。
轉(zhuǎn)載于:https://www.cnblogs.com/daxnet/p/5902057.html
總結(jié)
以上是生活随笔為你收集整理的介绍一款原创的四则运算算式生成器:CalculateIt2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网关系统架构
- 下一篇: 高速数据采集卡如何在高速下进行采集