劉 濤 閔鵬瑾肖 漢
(1.鄭州師范學(xué)院信息科學(xué)與技術(shù)學(xué)院 鄭州 450044)(2.吉林大學(xué)數(shù)學(xué)學(xué)院 長春 130012)
多媒體技術(shù)的普及促使多媒體教學(xué)廣泛應(yīng)用于課堂教學(xué)中。好的多媒體教學(xué)軟件更能使教學(xué)效果事半功倍,而目前的多媒體教學(xué)軟件往往只是將多媒體信息在教學(xué)中展現(xiàn)與播放,大多缺少靈活性和交互性[1]。加、減、乘、除四則運(yùn)算是小學(xué)數(shù)學(xué)課程中的基礎(chǔ)內(nèi)容[2],在小學(xué)數(shù)學(xué)知識(shí)體系中占有舉足輕重的地位。由于四則運(yùn)算具有一定的抽象性,而小學(xué)生的思維又以具體形象思維為主,對(duì)較抽象內(nèi)容的理解存在一定的認(rèn)知負(fù)擔(dān)。因此,在實(shí)際的教學(xué)中,運(yùn)用一些符合學(xué)生認(rèn)知特點(diǎn)的且具有交互性和靈活性的多媒體教學(xué)軟件來幫助學(xué)生學(xué)習(xí)是十分必要的。本文針對(duì)小學(xué)數(shù)學(xué)四則運(yùn)算的教學(xué)實(shí)際,設(shè)計(jì)了一種具有隨機(jī)出題、交互解答,并能對(duì)答案進(jìn)行自動(dòng)測評(píng)的教學(xué)系統(tǒng),該系統(tǒng)能更好地完善教與學(xué)的過程,滿足教學(xué)的實(shí)際需求。
MVC就是指模型-視圖-控制器(Mod?el-View-Controller),是一種先進(jìn)的設(shè)計(jì)結(jié)構(gòu),其目的是以會(huì)話方式為GUI(圖形用戶接口)設(shè)計(jì)提供支持[3]。MVC模式使GUI設(shè)計(jì)更具有對(duì)象化特性,也更便于維護(hù)。因此,在GUI程序設(shè)計(jì)時(shí),可以將存儲(chǔ)有數(shù)據(jù)的某個(gè)對(duì)象作為模型,然后為模型指定合適的顯示組件,該組件就是視圖。為了響應(yīng)用戶的交互操作,應(yīng)選用某個(gè)組件作控制器使用,當(dāng)控制器觸發(fā)事件時(shí),啟動(dòng)事件處理機(jī)制來對(duì)視圖修改或獲取模型中所維護(hù)的數(shù)據(jù),最后使視圖更新顯示。
GUI設(shè)計(jì)中除了要完成靜態(tài)設(shè)計(jì),還要為作為控制器的組件提供響應(yīng)與處理事件的能力,從而使程序具備與用戶或外部程序進(jìn)行交互的能力,使得程序“活起來”。事件處理關(guān)注程序的動(dòng)態(tài)特征,控制器組件依據(jù)用戶交互操作來產(chǎn)生不同類型的事件對(duì)象[4]。在處理事件時(shí),控制器組件本身并不參與,而是交由第三方即事件監(jiān)聽器來處理。這一處理方式緣于JAVA采用了委托事件處理模式。事件處理過程中執(zhí)行相關(guān)的處理方法,以完成預(yù)定任務(wù)。圖1即展示了JAVA中事件產(chǎn)生和處理的過程。
圖1 事件處理流程
系統(tǒng)基于JAVA語言實(shí)現(xiàn),體系結(jié)構(gòu)設(shè)計(jì)遵循MVC模式,整個(gè)系統(tǒng)按功能模塊劃分為四大模塊:年級(jí)模塊、運(yùn)算模塊、選題模塊、測評(píng)模塊。其中年級(jí)模塊用于教師設(shè)定授課年級(jí),年級(jí)不同該模塊中設(shè)置的試題難度系數(shù)(maxCount)不同,年級(jí)越高難度系數(shù)越大,試題也就越難,該模塊確保了系統(tǒng)能夠勝任更多年級(jí)學(xué)生的教學(xué)工作。運(yùn)算模塊又分為加、減、乘、除,四則運(yùn)算五個(gè)子模塊,前四個(gè)模塊用于設(shè)定單一運(yùn)算模式。例如:教師當(dāng)前需要進(jìn)行乘法教學(xué)了,就可以設(shè)定乘法運(yùn)算模式,系統(tǒng)就處于乘法模式當(dāng)中,那么在之后隨機(jī)出題模塊中就只會(huì)產(chǎn)生乘法試題。第五個(gè)子模塊四則運(yùn)算模塊主要用于學(xué)生日常四則運(yùn)算測試練習(xí)使用,設(shè)定該模塊后,系統(tǒng)進(jìn)入四則運(yùn)算模式,那么隨機(jī)產(chǎn)生的試題就會(huì)包含加、減、乘,除各種運(yùn)算了。選題模塊用于自動(dòng)產(chǎn)生不同運(yùn)算模式的試題,用于教學(xué)或?qū)W生練習(xí)測試使用。測評(píng)模塊可以對(duì)學(xué)生輸入的答題結(jié)果進(jìn)行判斷,并顯示判斷結(jié)果。系統(tǒng)的體系結(jié)構(gòu)如圖2所示。
圖2 JAVA四則運(yùn)算教學(xué)系統(tǒng)的體系結(jié)構(gòu)
系統(tǒng)的設(shè)計(jì)開發(fā)基于MVC模式,該系統(tǒng)設(shè)計(jì)3個(gè)類,其中Teacher對(duì)象充當(dāng)監(jiān)視器,負(fù)責(zé)給出運(yùn)算題目,并判斷回答者的答案是否正確;Computer?Demo對(duì)象負(fù)責(zé)為運(yùn)算題目提供視圖,例如用戶可以通過ComputerDemo對(duì)象提供的GUI界面看到題目,并通過該GUI界面顯示題目的判定結(jié)果;Main_C是系統(tǒng)的主類負(fù)責(zé)系統(tǒng)的運(yùn)行。
Step1:使用 JFrame、JMenuBar、JMenu、JMenu?Item、JLabel、JTextField、JButton、FlowLayout、Con?tainer等類設(shè)計(jì)GUI界面。該GUI中包含有9個(gè)事件源組件,其中2個(gè)年級(jí)菜單項(xiàng)組件;5個(gè)表示加、減、乘、除以及四則運(yùn)算模式的菜單項(xiàng)組件;用于隨機(jī)出題的選題按鈕組件;進(jìn)行智能測評(píng)的查看答案按鈕組件。
Step2:調(diào)用 addActionListener(new Teacher())方法為這些JMenuItem對(duì)象、JButton對(duì)象注冊(cè)監(jiān)聽器。
Step3:在Teacher類中通過重寫ActionListener接口中 actionPerformed(ActionEvent e)方法,對(duì)事件源對(duì)象產(chǎn)生的ActionEvent事件進(jìn)行處理。因?yàn)橄到y(tǒng)中存在觸發(fā)同一事件的多個(gè)事件源,所以當(dāng)它們觸發(fā)事件時(shí),在 actionPerformed(ActionEvent e)方法中處理代碼也不相同。當(dāng)菜單項(xiàng)“三年級(jí)”或“四年級(jí)”觸發(fā)ActionEvent事件時(shí),處理該事件的代碼用于設(shè)定試題難度系數(shù)(maxCount),maxCount是Teacher的類成員變量,在Teacher類定義setMax?Count方法為maxCount賦值,該方法定義如下:
public void setMaxCount(int num){
maxCount=num;}
maxCount大小由num來確定,當(dāng)菜單項(xiàng)選中“三年級(jí)”或“四年級(jí)”時(shí)就可以調(diào)用setMax(num)方法來設(shè)定不同的試題難度系數(shù)。Teacher類還定義了public void setLeap(String str)方法用于當(dāng)加、減、乘、除、四則運(yùn)算菜單項(xiàng)觸發(fā)ActionEvent事件時(shí),設(shè)置計(jì)算模式變量temp。
Step4:在Teacher類中定義public void createR?andom(String s)方法,該方法滿足以下功能:
1)產(chǎn)生兩個(gè)用于計(jì)算的操作數(shù),并將其顯示在對(duì)應(yīng)的文本框中;
2)獲取計(jì)算模式變量temp,并將其顯示在對(duì)應(yīng)的標(biāo)簽中;
3)激活智能測評(píng)按鈕,為下一步測評(píng)解答結(jié)果作好準(zhǔn)備;
4)調(diào)用pack()方法,是窗口能夠自適應(yīng)調(diào)節(jié)大小。
Step5:對(duì)解題結(jié)果進(jìn)行智能測評(píng)。點(diǎn)擊“查看答案”按鈕組件可以對(duì)學(xué)生輸入的答案進(jìn)行對(duì)錯(cuò)判斷,并顯示判斷結(jié)果。在Step4呈現(xiàn)出來的2個(gè)操作數(shù)、運(yùn)算符,被放置在2個(gè)JTextField和1個(gè)JLa?bel組件上,學(xué)生將此試題的答案輸入到第3個(gè)JTextField組件中。利用智能測評(píng)功能模塊,可以方便快捷地獲取JTextField組件中操作數(shù)與JLabel中的運(yùn)算符。接著對(duì)運(yùn)算符進(jìn)行判斷,并按判斷結(jié)果進(jìn)行相應(yīng)的算數(shù)運(yùn)算,最后將運(yùn)算結(jié)果與學(xué)生輸入的答案進(jìn)行驗(yàn)證,顯示驗(yàn)證結(jié)果。
該子系統(tǒng)實(shí)現(xiàn)了教學(xué)年級(jí)設(shè)定、加法運(yùn)算選擇、隨機(jī)出題以及對(duì)輸入的結(jié)果進(jìn)行正無誤評(píng)判等功能。該系統(tǒng)實(shí)現(xiàn)效果如圖3所示。
圖3 加法運(yùn)算子系統(tǒng)
該子系統(tǒng)運(yùn)行時(shí),首先選擇年級(jí)模式,設(shè)定教學(xué)年級(jí),如果未設(shè)定教學(xué)年級(jí),那么運(yùn)算模式、選題、查看答案等對(duì)象均處于未激活狀態(tài);接著選擇運(yùn)算模式,這時(shí)選題按鈕處于激活狀態(tài),查看答案按鈕仍處于未激活狀態(tài);接下來選擇選課按鈕,產(chǎn)生加法運(yùn)算習(xí)題,查看答案按鈕由未激活變?yōu)榧せ顮顟B(tài);最后輸入計(jì)算結(jié)果,點(diǎn)擊查看答案按鈕可以對(duì)計(jì)算結(jié)果進(jìn)行正誤判斷。該加法運(yùn)算子系統(tǒng)執(zhí)行流程如圖4所示。其它運(yùn)算子系統(tǒng)的執(zhí)行流程與此類似。
圖4 加法運(yùn)算子系統(tǒng)執(zhí)行流程
在加法的計(jì)算表達(dá)式中,需要呈現(xiàn)出來的有操作數(shù)、加法運(yùn)算符以及計(jì)算結(jié)果,其中操作數(shù)和加法運(yùn)算符由系統(tǒng)中選題模塊來隨機(jī)生成,計(jì)算結(jié)果需要首先存儲(chǔ)下來,以便與學(xué)生輸入的題目解答結(jié)果進(jìn)行測評(píng)。
在系統(tǒng)中,通過“選擇年級(jí)”來設(shè)定教學(xué)的難度系數(shù)。將int型難度系數(shù)變量maxCount通過set?MaxCount方法設(shè)定難度值,然后選定“加法運(yùn)算”菜單項(xiàng),該菜單項(xiàng)觸發(fā)ActionEvent事件,將“+”運(yùn)算符存儲(chǔ)在字符串變量temp中,并激活選題按鈕為下一步生成加法運(yùn)算練習(xí)題作好準(zhǔn)備。其設(shè)計(jì)代碼如下:
public void setLeap(String s){
temp=s;
bt1.setEnabled(false);
bt2.setEnabled(true);//激活選題按鈕}
接下來通過單擊“選題”按鈕來隨機(jī)生成加法運(yùn)算習(xí)題。該運(yùn)算習(xí)題生成步驟如下:
Step1:使用new Random()生成隨機(jī)類對(duì)象r,r調(diào)用nextInt(int x)方法來隨機(jī)生成操作數(shù),該操作數(shù)取值范圍由難度系數(shù)maxCount決定。難度系數(shù)越大,操作數(shù)取值范圍越大,生成的加法運(yùn)算題也越難。
Step2:定義 createRandom(String s)方法來生成操作數(shù)和運(yùn)算符,將操作數(shù)放進(jìn)文本框?qū)ο髏ext1、text2中,將運(yùn)算符放進(jìn)標(biāo)簽對(duì)象lab1中。字符串s表示運(yùn)算符。該代碼定義如下:
public void createRandom(String s){
int i=r.nextInt(maxCount)+1;
int j=r.nextInt(maxCount)+1;
text1.setText(String.valueOf(i));
text2.setText(String.valueOf(j));
lab1.setText(s);
bt1.setEnabled(true);
text3.setText(null);
pack();}
Step3:單擊“選題”按鈕觸發(fā)ActionEvent事件,調(diào)用createRandom方法將temp存儲(chǔ)的運(yùn)算符傳遞給s。代碼如下:
else if(e.getSource()==bt2){//bt2表示選題按鈕
if(temp.equals(“+”)){
createRandom(temp);}
最后進(jìn)行結(jié)果判定,該過程由“查看答案”按鈕bt1觸發(fā)ActionEvent事件,該事件處理將對(duì)兩個(gè)操作數(shù)求和與學(xué)生輸入的結(jié)果進(jìn)行比較,如結(jié)果相等則給出正確結(jié)果,相反給出錯(cuò)誤結(jié)果。設(shè)計(jì)代碼如下:
else if(e.getSource()==bt1){
String s=lab1.getText();
if(s.equals(“+”)){
int i=Integer.parseInt(text1.getText())+Inte?ger.parseInt(text2.getText());
if(String.valueOf(i).equals(text3.getText())){
lab3.setText(“恭喜!答對(duì)了!”);
pack();}
else{lab3.setText(“抱歉!答錯(cuò)了,再想想!”);
pack();}}
至此,加法測試子系統(tǒng)設(shè)計(jì)完成,下面對(duì)加法測試子系統(tǒng)進(jìn)行測試。在菜單中分別設(shè)定“四年級(jí)”和“+”菜單項(xiàng)后,用鼠標(biāo)單擊“選題”按鈕,系統(tǒng)會(huì)自動(dòng)產(chǎn)生一個(gè)100以內(nèi)的加法運(yùn)算習(xí)題。當(dāng)交互輸入一個(gè)計(jì)算結(jié)果后,單擊“查看答案”按鈕,系統(tǒng)會(huì)根據(jù)所填答案,自動(dòng)地給出正確或錯(cuò)誤的評(píng)判結(jié)果,并顯示在lab3中。如圖5所示。
圖5 加法運(yùn)算子系統(tǒng)運(yùn)行效果
減法運(yùn)算子系統(tǒng)的設(shè)計(jì)與加法基本一致,系統(tǒng)里包含三個(gè)文本框?qū)ο蠓謩e為text1、text2和text3,它們分別用來存放被減數(shù)、減數(shù)和輸入結(jié)果。因?yàn)樾W(xué)數(shù)學(xué)還沒有學(xué)習(xí)到負(fù)數(shù),所以在隨機(jī)產(chǎn)生操作數(shù)時(shí),要確保大的操作數(shù)作被減數(shù)。因此,減法運(yùn)算初始化時(shí),可以使用if判定語句比較操作數(shù)i和j的大小,然后將大的操作數(shù)放入text1中。其設(shè)計(jì)代碼如下:
int i=r.nextInt(maxCount)+1;
int j=r.nextInt(maxCount)+1;f
(s.equals(“-”)&&i<j){//s表示運(yùn)算符
text1.setText(String.valueOf(j));
text2.setText(String.valueOf(i));}
lab1.setText(s);
bt1.setEnabled(true);
text3.setText(null);
pack();
類似地,可實(shí)現(xiàn)乘法運(yùn)算和除法運(yùn)算子系統(tǒng)。需要注意的是除法運(yùn)算的答案可能存在余數(shù),所以在text3中輸入結(jié)果時(shí)應(yīng)在商后帶上余數(shù),例如:5…2這種形式的結(jié)果。這樣才能判定出除法答案的正確性。其設(shè)計(jì)代碼如下:
else if(s.equals(“/”)){
int l=Integer.parseInt(text1.getText
())%Integer.parseInt(text2.getText());
int i1=Integer.parseInt(text1.getText
())/Integer.parseInt(text2.getText());
if(l!=0){
if(((new StringBuilder()).append
(i1).append(“...”).append(l).toString()).equals
(text3.getText()))
{lab3.setText(“恭喜!答對(duì)了!”);
pack();}else
{lab3.setText(“抱歉!答錯(cuò)了,再想想!”);
pack();}
}}
運(yùn)行結(jié)果如圖6所示。
圖6 帶余數(shù)除法運(yùn)算解答、與判定
四則運(yùn)算子系統(tǒng)主要用于學(xué)生課下自測練習(xí)使用,該系統(tǒng)能夠通過“選題”按鈕隨機(jī)生成加、減、乘、除四種運(yùn)算類型的習(xí)題,能較為全面地幫助學(xué)生牢固掌握加、減、乘、除四則運(yùn)算法則。系統(tǒng)首先使用Math.random()方法產(chǎn)生[0,1)內(nèi)的實(shí)數(shù)d,接著,根據(jù)d取值來確定運(yùn)算符s1是哪種類型的運(yùn)算符,最后調(diào)用createRandom(String s)方法將隨機(jī)產(chǎn)生的運(yùn)算符傳遞給參數(shù)s。代碼如下:
double d=Math.random();
String s1=“”;
if(d>=0.75D){
s1=“+”;}
else if(d>=0.5D&&d<0.75D){
s1=“-”;}
else if(d>=0.25D&&d<0.5D){
s 1=“*”;}
else{s1=“/”;}
createRandom(s1);
在小學(xué)數(shù)學(xué)四則運(yùn)算教學(xué)系統(tǒng)測試中,功能測試部分是核心,該部分的測試要完成對(duì)系統(tǒng)各模塊的驗(yàn)證和檢查,主要包含選題、判定等按鈕的功能是否正常。以下對(duì)系統(tǒng)性能、功能進(jìn)行測試如表1~2所示。
表1 系統(tǒng)性能測試結(jié)果
表2 系統(tǒng)功能測試結(jié)果
根據(jù)以上的測試結(jié)果,并結(jié)合多名學(xué)生進(jìn)行的300次以上的反復(fù)測試效果,可以證實(shí)該系統(tǒng)確實(shí)能方便地隨機(jī)出題,自行評(píng)判正誤,評(píng)判正確率達(dá)到100%。
基于JAVA SE技術(shù)的小學(xué)數(shù)學(xué)四則運(yùn)算教學(xué)系統(tǒng)已真正用于教學(xué)實(shí)踐,受到教師、學(xué)生用戶的一致好評(píng)。因此,該系統(tǒng)符合最初的需求設(shè)計(jì)。在實(shí)際應(yīng)用中,系統(tǒng)界面友好、操作流程清晰簡練,整體運(yùn)行效果良好,為數(shù)學(xué)四則運(yùn)算教學(xué)工作帶來極大便利。
[1]何克抗,李文光.教育技術(shù)學(xué)[M].北京:北京師范大學(xué)出版社,2009:81-126.HE Kekang,LI Wenguang.Educational technology[M].Beijing:Beijing Normal University Press,2009:81-126.
[2]采明才.游戲化教學(xué)模式在小學(xué)數(shù)學(xué)教學(xué)中的應(yīng)用分析[J].吉林教育,2010(12):92-94.CAI Mingcai.Analysis of the application of gamification based teaching model in primary school mathematics teaching[J].Jilin education,2010(12):92-94.
[3]耿祥義,張躍平.Java程序設(shè)計(jì)實(shí)用教程[M].北京:人民郵電出版社,2015:367-389.GENG Xiangyi,ZHANG Yueping.Java programming prac?tical tutorial[M].Beijing:Posts and Telecommunications Press,2015:367-389.
[4]Bruce Eckel.Java編程思想(第4版)[M].北京:機(jī)械工業(yè)出版社,2007:759-803.Bruce Eckel.Thinking In java(4th edition)[M].Beijing:Machinery Industry Press,2007:759-803.