201571030138《小學四則運算練習軟件》結對項目報告

github項目地址 : FundamentalOperationshtml

演示地址:小學生四則運算在線測試  git

測試帳號:admin 、admin一、admin二、admin三、admin4程序員

密碼:111github

注:因爲服務器環境緣由,請忽略驗證碼,直接登錄數據庫

結對同伴的園子:城塵
express

實驗要求編程

軟件基本功能要求以下:

 在《實驗二 軟件工程我的項目》中,同窗們實現了一個命令行四則運算出題小程序,本次實驗採用結對編程方式,設計開發一個小學生四則運算練習軟件,使之具備如下功能:小程序

(1)由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分;服務器

(2)題庫文件可採用實驗二的方式自動生成,也能夠手工編輯生成,文本格式以下:session

(3)程序爲用戶提供三種進階四則運算練習功能選擇:百之內整數算式(必作)、帶括號算式、真分數算式練習;

(4)程序容許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例以下:

           

(5)程序記錄用戶答題結果,當程序退出再啓動的時候,可爲用戶顯示最後一次測試的結果,並詢問用戶能否進行新一輪的測試;

(6)測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間。

(7)程序人機交互界面是GUI界面(WEB頁面、APP頁面均可),界面支持中文簡體(必作)/中文繁體/英語,用戶能夠進行語種選擇。

一、需求分析

  該項目要求程序有人機交互界面,且可評判成績。可爲用戶提供百之內整數算式、帶括號算式、真分數算式三種練習,可爲進行多輪測試並記錄成績生成柱狀圖而且記錄用戶消耗的時間。

二、功能分析

  • 可實現基本要求,便可生成數字在 0 和 100 之間,運算符在3個到5個之間的計算表達式,並計算出表達式的結果。
  • 隨機可生成帶括號的運算式。

三、設計實現

四、運行測試

  • 登陸頁面

 

  • 登錄成功後,跳轉主頁面,選擇題目,下方的柱狀圖爲用戶第一次進行答題到目前答題狀況的彙總。

  • 選擇試題類型後,進行答題,並計時

  • 答題結束後,提交併獲取分數,也可查看錯誤答案

  • 顏色爲紅色的是回答錯誤的問題答案,白色爲回答正確問題答案。

五、核心代碼

/**
 * 該類 從數據庫中 以不一樣的類別 隨機抽取試題
 */
@Controller
@RequestMapping(value = "/expression")
public class ExpressionController {
    @Autowired
    private ExpressionRepository expressionRepository;
    @RequestMapping(value = "/{type}")
    public String getExpressionPage(@PathVariable(value = "type") String type, Model model){
        List<ExpressionEntity> expressionEntityList = expressionRepository.findByTypeTwenty(type);
        model.addAttribute("expressions",expressionEntityList);
        return "views/expressionPage";
    }
}
表達式http請求接口
/**
 * 運算式的接口
 */
public interface ExpressionRepository extends JpaRepository<ExpressionEntity,String>{
        List<ExpressionEntity> findAll();
        List<ExpressionEntity> findAllByType(@Param(value = "type") String type);
        @Query(value = "select * from expression where type = ?1 order by rand() limit 20",nativeQuery = true)
        List<ExpressionEntity> findByTypeTwenty(String type);
}
表達式底層接口
   @RequestMapping("/chart")
    public List<VisualizationEntity> getChartData(HttpServletRequest httpServletRequest){
        HttpSession session = httpServletRequest.getSession();
        UserEntity userEntity = (UserEntity) session.getAttribute("user");
        List<VisualizationEntity> visualizationEntities = visualiRepository.findByUsername(userEntity.getUsername());
        return visualizationEntities;
    }
圖表數據接口
//計算逆波蘭式的結果
    private static boolean evoe(ArrayList<String> strArr){
        String str = ele.getOperations();
        boolean flag = true;//判斷過程當中是否有負數或小數點
        int temp = 0;//存放臨時計算結果
        Stack<String> stack = new Stack<String>();
        for(String s : strArr){
            if(!str.contains(s)){//若是是數字,放入棧中
                stack.push(s);
            }else{
                int a = Integer.valueOf(stack.pop());
                int b = Integer.valueOf(stack.pop());
                try {
                    switch(s){
                        case "+" :
                            stack.push(String.valueOf(a+b));
                            break;
                        case "-" :
                            temp = b-a;
                            if(temp < 0) flag=false;
                            stack.push(String.valueOf(temp));
                            break ;
                        case "*" :
                            stack.push(String.valueOf(a*b));
                            break;
                        case "/" :
                            if(a == 0) {a = 1;flag = false;}
                            temp = b/a;
                            if(a*temp != b) flag = false;
                            stack.push(String.valueOf(temp));
                            break ;
                    }
                } catch (Exception e) { }
            }
        }
        ele.setResult(Integer.parseInt(stack.pop()));
        return flag;
    }
    //將逆波蘭式轉化爲運算式
    private static void pro_exp(ArrayList<String> strArr){
        String str = ele.getOperations();
        String ea,eb;
        String fh = " ";//臨時的符號
        boolean lastisnum = false;//記錄臨時符號後的一位是否爲數字
        Stack<String> expstack = new Stack<String>();
        for(String s : strArr){
            if(!str.contains(s)){//若是是數字,放入棧中
                expstack.push(s);
                lastisnum = true;
            }else{
                ea = expstack.pop();
                eb = expstack.pop();
                switch(s){
                    case "+" :
                        expstack.push(eb+"+"+ea);
                        break;
                    case "-" :
                        expstack.push(eb+"-"+ea);
                        break ;
                    case "*" :
                        if("+-".contains(fh)){
                            if(!lastisnum) ea = "("+ea+")";
                            else eb = "("+eb+")";
                        }
                        expstack.push( eb+"*"+ea);
                        break;
                    case "/" :
                        if("+-".contains(fh)){
                            if(!lastisnum) ea = "("+ea+")";
                            else eb = "("+eb+")";
                        }
                        expstack.push( eb+"/"+ea);
                        break ;
                }
                fh = s;
                lastisnum = false;
            }
        }
        ele.setExp(expstack.pop());
    }
    //隨機生成逆波蘭式
    public static void test(){
        ArrayList<String> strArr=new ArrayList<String>();
        List list = Collections.synchronizedList(strArr);
        N = new Random().nextInt(4)+2;
        synchronized(list) {
            strArr.clear();
            for (int i = 0; i < N; i++) {
                strArr.add(ele.random_N());
            }
            for (int i = 0; i < N - 2; i++) {
                strArr.add(new Random().nextInt(strArr.size() - N + 1) + N - 1, ele.random_E());
            }
            strArr.add(strArr.size(), ele.random_E());
        }
        ele.setStrArr(strArr);
    }
逆波蘭式

6.結對編程過程

 

七、展現PSP

PSP2.1

任務內容

計劃完成須要的時間(min)

實際完成須要的時間(min)

Planning

計劃

30

30

 Estimate

估計這個任務須要多少時間,並規劃大體工做步驟

30

30

Development

開發

360

300

Analysis

需求分析 (包括學習新技術)

100

60

 Design Spec

生成設計文檔

10

10

Design Review

設計複審 (和同事審覈設計文檔)

20

10

Coding Standard

代碼規範 (爲目前的開發制定合適的規範)

10

5

Design

具體設計

60

35

Coding

具體編碼

120

120

Code Review

代碼複審

10

20

est

測試(自我測試,修改代碼,提交修改)

30

40

Reporting

報告

30

43

Test Report

測試報告

25

30

Size Measurement

計算工做量

2

3

Postmortem & Process

Improvement Plan

過後總結 ,並提出過程改進計劃

3

10

八、對小夥伴的評價

此次合做的小夥伴是個人舍友@城塵。每當個人雙手中止敲擊鍵盤,沉浸在對於項目完成品幻想中時(誤),小夥伴認真的態度以及對於項目內容的堅持老是能把我帶回現實世界(繼續敲代碼)。小夥伴對於項目的態度,對我產生了極大的影響。爲何這麼說呢?由於我自己是一個很容易受到周圍氛圍影響的人。此次的項目我原本準備下降對於交互界面的追求,讓小學生在白色和黑色交織的題海里徜徉一下。可是在小夥伴跟我提出了多個界面方案以後,我只能將個人想法壓制在了內心,並無說。畢竟另外一我的在堅持,我又憑什麼輕言放棄(畢竟舍友,萬一被。。。)。

總而言之,小夥伴是一個能經過規範自身行爲來影響他人的準程序員,我也於這種影響力中受到了極大的鼓舞。

九、 結對編程真的可以帶來1+1>2的效果嗎?經過此次結對編程,請談談你的感覺和體會。

首先1+1>2是一個抽象的概念,難道說是兩我的結對編程的代碼多於兩人單幹的代碼量就是>2嗎?我想應該不是這樣的。結合此次項目來看,我最滿意的功能是查看答案模塊,點擊查看答案後題目下方浮現出答案模塊,其中白色背景是正確的題目答案,紅色背景則相反。我在對小夥伴的評價中說過我一開始實際上是準備放棄界面的,然後面受到了夥伴的影響才選擇認真完成界面內容。

若是沒有合做,我想就是十個我也作不出這個效果。不是由於技術水平不夠,而是當你一我的思考時,老是會陷入偏執。合做則讓多我的的思想交融,固然前提是這些人內心的真實目標是一致的,這樣纔是一個團體。此次項目的效果在我看來,顯然是1+1>10個我,由於顯然十個我在一塊兒,怕是會更加堅決的放棄界面(笑)。

相關文章
相關標籤/搜索