標籤:src 改進 col nal 照片 可視化 content nio analysis
201606120038李家俊
部落格園:https://www.cnblogs.com/-QAQ/
201606120043曾鵬菲
部落格園:https://www.cnblogs.com/zpfs/
github:https://github.com/rg-zpf/rg-software
一.基本要求
- 自動產生題目,單個題目最多不能超過4個運算子,運算元小於100。
- 使用者可以輸入答案
- 若使用者輸入答案正確,則提示正確;若答案錯誤,則提示錯誤,並要提示正確答案是多少。
二.開發環境
程式所使用的開發環境是:IntelliJ IDEA 2018.2.2x
三.擴充方向
1.使用者可以選擇出題的個數(最多不能超過5個題目),答題結束可以顯示使用者答錯的題目個數和答對的題目個數,並且顯示使用者的得分(曾鵬菲)
2.程式可以出單個整數階乘的題目:如:4!=24(階層在10以內隨機產生)(曾鵬菲)
3.使用者答題結束以後,程式可以顯示使用者答題所用的時間(以00:00形式顯示)(李家俊)
4.程式可以設定答題時間,時間設定為整數,單位為秒,最大不能超過120秒,若超過了答題時間未答題,則提示:時間已到,不能答題。(每一題的答題時間)(曾鵬菲)
5.程式設定總時間5分鐘,若5分鐘內還未完成所有題目,時間到則當程式結束,未作答的題目當錯誤(程式總時間)(李家俊)
四.程式實現
結隊項目的實現,需要有可視化介面的顯示。
1.首先,程式採用javafx表單架構的編程,介面設計略顯簡單粗糙。
請輸入題目數按鈕:在輸入框內輸入題目數,點擊按鈕,觸發點擊按鈕事件,num=輸入數
產生題目按鈕:在輸入題目數後,點擊產生題目按鈕會產生題目,每做完一道題目,就需要點擊一次,產生題目,如果做完最後一道題,點擊產生題目按鈕,就會顯示最後得分和用時
確定按鈕:輸入框內輸入答案,點擊確定提交,判斷答案對錯
2.程式運行,即總時間開始倒計時5分鐘,若倒計時完畢還未答題完畢,則不能再作答,直接輸出最後得分和做對題目數和做錯題目數。
tis = new Timer(); tis.schedule(new TimerTask() { public void run() { if (times==0){ code = num - count; string = string + "\n" + "正確:" +count +"\t"+"錯誤:" + code +"\n"+ "你的最後分數是:"+(float)count/num*100; Content.setText(string); tis.cancel(); timer.cancel(); n=-1; }else { times--; long hh = times / 60 / 60 % 60; long mm = times / 60 % 60; long ss = times % 60; StrOut = "還剩" + hh + "小時" + mm + "分鐘" + ss + "秒"; outTime.setText(StrOut); } } }, 0, 1000);
3.輸入題目數,題目數不能超過5題,輸入完題目數,點擊按鈕的同時,做題開始計算做題時間(總時間與做題計算時間不同步)
Number.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { num = Integer.parseInt(NumText.getText()); if (num>5){ string = string + "\n" + "題目數不能超過5題,請重新輸入!"+ "\n" + "請輸入題目數目:"; Content.setText(string ); }else { string = string + NumText.getText(); Content.setText(string); } TimerTask task1 = new TimerTask() { @Override public void run() { StrTime = String.format("%1$tM:%1$tS",System.currentTimeMillis()-time); } }; new Timer().schedule(task1, 1, 1000); } });
4.產生題目按鈕,點擊後,會隨機產生題目,產生題目的同時,還同時啟動了一個計時器,改計時器的作用是規定每一道題目的答題時間不能超過120秒,超過則當該題答案錯誤處理;每產生一道題目,都必須要點擊一次按鈕,已經做完最後一題,則在點擊按鈕後,會輸入最後的得分和用時、題目的對錯數量。
newCode.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { n++; if(n<num){ string = string+ "\n"+Code(); Content.setText(string); //每一道題目的規定答題時間 timer = new Timer();//第二個計時器:計算每一題的規定時間 long nowTime = System.currentTimeMillis(); TimerTask task2 = new TimerTask() { @Override public void run() { endTime = (System.currentTimeMillis()-nowTime)/1000; //System.out.println(endTime); if (endTime>120){ string = string + "\n" + "此題逾時,答案錯誤!"; Content.setText(string); code++; timer.cancel(); } } }; timer.schedule(task2,1,1000); //所有題目答題完畢 }else { tis.cancel();//總時間 new Timer().cancel();//答題所用時間(所有題目) string = string + "\n" + "正確:" +count +"\t"+"錯誤:" + code + "\n"+ "你的最後分數是:"+(float)count/num*100; Content.setText(string + "\n" + "你的用時:" + StrTime); n=-1; } } });
5.填寫答案框中輸入答案,點擊確定按鈕提交,則會判斷答案對錯,在點擊按鈕後的同時,計算每一題的答題時間定時器也會同時關閉,相當於該題答題完畢,下一題再建立新的計時器計數。判斷答案對錯,還會分別統計正確和錯誤的數量。
Answer.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { timer.cancel();//每一道題的結束 answer = Integer.parseInt(AnswerText.getText()); if(Math.abs(answer-result())<0.1){ string = string + AnswerText.getText() + "\n" +"恭喜你,計算正確,答案是:"+result(); Content.setText(string); count=count+1; }else{ string = string + AnswerText.getText() + "\n" +"很遺憾,計算錯誤,答案是:"+result(); Content.setText(string); code++; } } });
6.清除按鈕,點擊則清除所有資料,再重新輸入題目數目開始,總時間倒計時也回到5分鐘,重新開始倒計時。
clear.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { NumText.setText(null); AnswerText.setText(null); Content.setText(null); string = "請輸入題目數目:"; Content.setText(string); time=System.currentTimeMillis(); count=0; code=0; //複位總時間 times=300; tis = new Timer(); tis.schedule(new TimerTask() { public void run() { if (times == 0) { code = num - count; string = string + "\n" + "正確:" + count + "\t" + "錯誤:" + code + "\n" + "你的最後分數是:" + (float) count / num * 100; Content.setText(string); tis.cancel(); timer.cancel(); n = -1; } else { times--; long hh = times / 60 / 60 % 60; long mm = times / 60 % 60; long ss = times % 60; StrOut = "還剩" + hh + "小時" + mm + "分鐘" + ss + "秒"; outTime.setText(StrOut); } } }, 0, 1000); } });
五.問題與解決
1.javafx的表單設定介面,之前已經學過這個,但學的不深入,所以現在用起來也不熟練,甚至,在該程式中,介面的設定也是過於簡單的,並且有些控制項的位置,我感覺自己不能隨心所欲想讓它放在哪邊就在哪邊,在遇到這個問題的時候,我也只能自己上網去查相關資訊,但也比較難找到適合自己問題並解決的。
2.變數的範圍。該程式的變數大部分是採取了全域變數的,因為大部分變數都是涉及到各個功能中的;其實我個人認為一個程式定義過多的全域變數是不怎麼好的,能盡量用局部變數解決問題的就盡量用,這樣好像更低耦合,實在沒辦法再考慮全域變數。
3.定時器的使用。一個定時器很容易管理, 但2個或多個以上,就會容易出現混淆了,該程式中運用了三個定時器,總時間倒計時定時器、答題時間計時器、每一道題目規定時間定時器;一開始我也混淆了,結果導致不能關閉某一個定時器,後來查閱相關資料後, 我採取了兩種方式建立定時器,就比較好的區分開來了。
4.清除、複位功能。清除按鈕,等於複位,重新開始,該功能中,要注意所有相關的資料,都必須複位,恢複一開始的資料狀態,時間、題目數,正確題目數、錯誤題目數都要複位。
六.感悟
程式是需要編碼和無數次的測試才完成的,有時候,編碼編程是困難的,當你沒有思路的時候,它的確是很困難,這個時候可以先停下來想一想,思考一下,該如何去做,還可以先查閱相關資料,才動手去做,或者,有時候已經編碼很長時間了,可以先停一停,去運動一下先,一直剛下去,或者效果反而沒有那麼高效;然而測試,有時候比編碼難很多,是因為它運行出錯了,你卻無法發現,或者,你發現出錯了,但你不知道它錯在哪裡,如何去調試才能發現問題所在,所以,需要測試過很多,很多情況都能出現過並解決,這才是一個比較完整的程式,我的這個程式中,也有一個我無法發現錯在什麼地方的bug,查看了很多次都不知道如何修改。
總而言之,花了時間去做事情,無論做得好壞,都會有一個結果,但不花時間,就別談結果了,所有的成果,都是用時間和精力去堆積成的,所以,每一件事情都需要花時間下去,才能做出一些成果,好壞就看個人而言了。
七.結隊工作照片
八.統計表
PSP2.1 |
Personal Software Process Stages |
Time Senior Student(h) |
Time(h) |
Planning |
計劃 |
1 |
1 |
· Estimate |
估計這個任務需要多少時間 |
50 |
55 |
Development |
開發 |
3 |
3 |
· Analysis |
需求分析 (包括學習新技術) |
1 |
1 |
· Design Spec |
產生設計文檔 |
1 |
1 |
· Design Review |
設計複審 |
2 |
2 |
· Coding Standard |
代碼規範 |
5 |
5 |
· Design |
具體設計 |
1 |
1 |
· Coding |
具體編碼 |
20 |
22 |
· Code Review |
代碼複審 |
5 |
5 |
· Test |
測試(自我測試,修改代碼,提交修改) |
10 |
13 |
Reporting |
報告 |
2 |
2 |
· |
測試報告 |
0.5 |
0.5 |
· |
計算工作量 |
1 |
1 |
· |
並提出流程改善計劃 |
0.5 |
0.5
|
結對項目-四則運算 “軟體”之升級版