1. 程式人生 > >2016012098+小學四則運算練習軟件項目報告

2016012098+小學四則運算練習軟件項目報告

基本功 博客 如果 化簡 pop 自動化 出現 算法 neo

項目地址:https://git.coding.net/meiyoupiqidefan/Four-Operations.git

目錄:

一、需求分析

二、功能設計

三、設計實現

四、算法詳解

五、測試運行

六、粘貼代碼

七、總結

八、展示PSP

————————————————————————————

一、需求分析

由於每次出題的數目不定,所以要求題數參數n由控制臺輸入

小學生水平有限,故每個數字在 0 100 之間,運算符在3個到5個之間。

為了讓小學生得到充分鍛煉,每個練習題至少要包含2種運算符。同時,由於小學生沒有分數與負數的概念,所出的練習題在運算過程中不得出現負數與非整數

————————————————————————————

二、功能設計

  基本功能:

    實現3~5個運算符的,兩位數以內的,不含小數點的加減乘除四則運算

  擴展功能:

    支持有括號的運算式

    擴展程序功能支持真分數加減法的出題與運算

    支持運算時分數的自動化簡

————————————————————————————

三、設計實現

  設計包括你會有哪些類,這些類分別負責什麽功能,他們之間的關系怎樣?你會設計哪些重要的函數,關鍵的函數是否需要畫出流程圖?函數之間的邏輯關系如何?

  一個類,Main類,實現基本功能的所有要求

  Main類下有3個函數:main,evaluateExpression,processOneOperator

    main: 生成四則運算式子

    evaluateExpression:計算後綴表達式

    processOneOperator:對操作符棧頂的一個操作符進行計算

技術分享圖片

————————————————————————————

四、算法詳解

  請描述你生成題目與解答題目用到的算法,並說明在求解題目時你是如何使用調度場算法 或其他算法來處理不同運算符的優先級的?

   利用了棧,調度場算法等

   調度場算法思想:

從左到右遍歷中綴表達式的每個數字和符號,若是數字就輸出,即成為後綴表達式的一部分;若是符號,則判斷其與棧頂符號的優先級,優先級不高於棧頂符號則棧頂元素一次出棧並輸出,並將當前符號進棧,一直到最終輸出後綴表達式為止。

  逆波蘭表達式求值:

從左到右遍歷後綴表達式的每個數字和字符,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧進行運算,運算結果進棧,一直到最終獲得結果。

一個棧存放數字,一個棧存放操作符

————————————————————————————

五、測試運行

你的程序必須是可運行的,請展示程序的運行截圖,包括題目要求實現功能對應的運行截圖。這些截圖說明你的程序確實完成了項目需求,如果程序實現了擴展需求,也請大方秀出來。

技術分享圖片

技術分享圖片

技術分享圖片

————————————————————————————

六、粘貼代碼

  粘貼自己覺得比較獨特的或滿意的代碼片段,用博客園正確的代碼控件來顯示。(提示:要有必要的註釋說明,提示:不要貼所有代碼!不符合規定的要倒扣分)

 1 //生成算術式
 2 int size = list.size();
 3             String[] array = (String[]) list.toArray(new String[size]);
 4             
 5             Random random = new Random();
 6             String str ="";
 7             int[] number=new int[6];
 8             boolean flag2 = true;
 9             while (flag2) {
10                 int[] index = null;
11                 int op_number = random.nextInt(3) + 3; // 3-5個運算符,運算符個數
12                 index = new int[op_number];
13                 for (int j = 0; j < op_number; j++){
14                     index[j] = random.nextInt(4);
15                     number[j] = random.nextInt(100);
16                     str += number[j]+array[index[j]];
17                     }
18                 // 隨機選擇運算符
19                 for (int j = 1; j < op_number; j++) {
20                     if (index[0] != index[j])
21                         flag2 = false;
22                 }
23                 str=str+random.nextInt(100);
24             }
        // 後綴表達式
        for (int i = 0; i < result.size(); i++) {
            if (result.get(i).equals("+") || result.get(i).equals("-")) {
                // 若字符串為"+"或者"-",則執行棧中已存數據的加減乘除計算
                while (!operatorStack.isEmpty()
                        && (operatorStack.peek() == ‘+‘
                                || operatorStack.peek() == ‘-‘
                                || operatorStack.peek() == ‘*‘ || operatorStack
                                .peek() == ‘/‘)) {
                    processOneOperator(operandStack, operatorStack);
                }
                operatorStack.push(result.get(i).charAt(0));// 將操作符壓入操作符棧中
            } else if (result.get(i).equals("*") || result.get(i).equals("/")) {
                // 若字符串為"*"或者"/",則執行棧中已存數據的乘除計算
                while (!operatorStack.isEmpty()
                        && (operatorStack.peek() == ‘*‘ || operatorStack.peek() == ‘/‘)) {
                    processOneOperator(operandStack, operatorStack);
                }
                operatorStack.push(result.get(i).charAt(0));
            } else {
                // 若遇到的是操作數,則將操作數直接壓入操作數棧中
                operandStack.push(Integer.parseInt(result.get(i)));
            }
        }
        // 對棧中數據進行計算,直到棧為空為止
        while (!operatorStack.isEmpty()) {
            processOneOperator(operandStack, operatorStack);
        }
        // 此時操作數棧中的棧頂元素也就是計算結果
        return operandStack.pop();
    }

————————————————————————————

七、總結

  你設計的程序如何實現軟件設計的模塊化原則

  模塊化:模塊化是以分治法為依據。簡單說就是把軟件整體劃分,劃分後的塊組成了軟件。這些塊都相對獨立,之間用接口(協議)通信,每個塊完成一個功能,多個塊組合可以完成一系列功能。

  模塊化目的:降低軟件的復雜性,提高工作效率,提高軟件質量

  我的模塊化:將功能分為3個函數,main函數用於生成四則運算式子;evaluateExpression函數用於計算後綴表達式;processOneOperator用於對操作符棧頂的一個操作符進行計算。再通過main函數調用evaluateExpression函數,evaluateExpression函數規定優先級,分解成簡單的兩個數字,一個操作符的運算,以實現全部的計算功能。

————————————————————————————

八、展示PSP

這個環節重要的是讓自己看到自己的估計和實際消耗時間,哪個環節耗時最多,哪個環節估計和實踐相差巨大?為什麽?

PSP

任務內容

計劃共完成需要的時間(min)

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

Planning

計劃

10

12

Estimate

估計這個任務需要多少時間,並規劃大致工作步驟

5

10

Development

開發

5*60

3*60

Analysis

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

10*60

8*60

Design Spec

生成設計文檔

30

50

Design Review

設計復審 (和同事審核設計文檔)

20

1*60

Coding Standard

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

10

10

Design

具體設計

30

45

Coding

具體編碼

10*60

10*60

Code Review

代碼復審

30

40

Test

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

2*60

1*60

Reporting

報告

2*60

60

Test Report

測試報告

1*60

30

Size Measurement

計算工作量

20

20

Postmortem & Process Improvement Plan

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

30

20

在技術學習和具體編碼環節花費時間比較多,我在一開始設計思路的時候,有一些具體的函數不會使用,也學習了調度場算法,從吸收到掌握花費了比較多的時間,在具體的編碼上也是一邊寫一邊改,所以也不好說一些具體的時間分配是什麽樣的。但是大體上說,估計用的時間和實際使用的情況差不多,我想,課本上的psp相關內容和老師推薦博客給予了很大幫助。

這次的任務,花費了不少時間,只有去實踐才能進步,查缺補漏,鍛煉自我。

2016012098+小學四則運算練習軟件項目報告