天天看點

結對項目-四則運算 “軟體”之更新版

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
· 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
計算工作量
并提出過程改進計劃