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窗體架構的程式設計,界面設計略顯簡單粗糙。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukDN4YjN0MTN10SM5IzM1gTMxEzMyATM4EDMy0SMycTM4QTMvwFMxgTMwIzLcFjM3EDO0EzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
請輸入題目數按鈕:在輸入框内輸入題目數,點選按鈕,觸發點選按鈕事件,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 | |
· Estimate | 估計這個任務需要多少時間 | 50 | 55 |
Development | 開發 | 3 | |
· Analysis | 需求分析 (包括學習新技術) | ||
· Design Spec | 生成設計文檔 | ||
· Design Review | 設計複審 | 2 | |
· Coding Standard | 代碼規範 | 5 | |
· Design | 具體設計 | ||
· Coding | 具體編碼 | 20 | 22 |
· Code Review | 代碼複審 | ||
· Test | 測試(自我測試,修改代碼,送出修改) | 10 | 13 |
Reporting | 報告 | ||
· | 測試報告 | 0.5 | |
計算工作量 | |||
并提出過程改進計劃 |