第二次做業

GitHub地址

https://git.coding.net/songofjoy/softwareProject.git

PSP

PSP2.1java

Personal Software Process Stagesgit

預估耗時(分鐘)數組

實際耗時(分鐘)ide

Planning函數

計劃工具

20學習

10測試

·Estimate字體

· 預估時間優化

10

10

Development

開發

370

330

·Analysis

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

30

40

·Design Spec

· 生成設計文檔

10

30

·Design Review

· 設計複審

20

30

·Coding Standard

· 代碼規範

40

30

·Design

· 具體設計

60

100

·Coding

· 具體編碼

220

180

·Code Review

· 代碼複審

30

40

·Test

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

140

170

Reporting

報告

250

250

·Test Report

· 測試報告

220

220

·Size Measurement

· 計算工做量

20

20

·Postmortem&Process Improvement Plan

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

20

30

合計

 

630

830

需求分析

目標

作一個多功能的四則混合運算器

特性

1.支持分數的四則運算

2.能夠實現打分功能

3.計時功能

4.儲存歷史得分記錄

5.實現了中英文繁體的切換

面向用戶

主要用於小學生使用,經過這樣的一個四則運算工具,能夠進行打分測評,能夠用來訓練計算準確率

假定約束

開發方法:面向對象的開發技術
開發語言:Java
開發期限:1周

需求規定

1.表達式計算:在文本框輸入一個表達式,能夠返回結果

2.表達式計算判斷功能:在文本框輸入一個含有=的式子,能夠返回是否計算正確

3.中英簡繁體轉化功能:能夠實現java語言的國際化

4.計分功能:能夠用來記錄歷史得分狀況

5.計時功能:能夠用來計時

6.GUI用戶界面:能夠更方便的進行用戶操做

 

運行環境規定

設備:PC
支持:PC支持Windows操做系統
控制:本軟件主要GUI界面運行

詳細設計

設計思路

1.將表達式進行數字運算符分離,存入數組

2.經過1中的數組進行一箇中綴到逆波蘭表達式額轉換,運用了雙棧來完成

3.分別編寫加減乘除等函數

4.根據展轉相除法實現一個求最大公約數、最小公倍數的函數

5.編寫判斷函數,判斷式子是否正確

6.讀寫文件的函數實現,關閉系統時能夠將計算正確率、正確題目等信息保存至文件,下次打開自動調用

7.計時功能、計算正確率統計,中英文繁體轉換的函數實現

8.用戶交互界面:製做了一個簡單的UI界面,使操做更加方便。

 

用戶交互界面展現

 

 

 

界面說明

1.右下角是能夠實現簡體繁體英文的切換。

2.左下角是歷史的正確率、正確題目和錯誤題目,關閉系統數據依然保留。

3.「重置」按鈕是使正確率、正確題目和錯誤題目歸0

4.「清除」按鈕是使TextField清空。

5.「退格」按鈕是使TextField刪除末尾的字符。

6.’=’=的區別:

1’=’指在TextField添加一個’=’字符到末尾。

2= 指運算或者判斷對錯,若是TextField裏面沒有含=,則計算表達式的結果;若是TextField裏面含=,就判斷該式子是否正確。

7.「計」實現了計時功能,第一次點擊是開始計時,第二此點是中止,第三次點是清0.

 

核心代碼說明

 

ComputeController.java 加減乘除計算控制器

package calculator;

 

 

/**

 * 加減乘除計算

 * 冒號:表示一個分數,左邊是分子,右邊是分母

 *

 * @author Song

 *

 */

public class ComputeController {

 

/**

 * 執行計算

 * @param data1

 * @param data2

 * @param sign

 * @return

 */

public static String exec(String a1,String a2,String sign){

 

String retString="";

switch (sign) {

case "+":retString=add(a1, a2);break;

case "-":retString=substract(a1, a2);break;

case "×":retString=mutiply(a1, a2);break;

case "÷":retString=devide(a1, a2);break;

}

return retString;

 

}

 

/**

 * 是不是加減乘除運算符

 * @param string

 * @return

 */

public static boolean isSign(String string){

 

if(string.equals("+")||string.equals("-")||

string.equals("×")||string.equals("÷")){

return true;

}

return false;

}

/**

 * 求最大公約數

 * @param a1

 * @param a2

 * @return

 */

public static int gcd(int a1,int a2){

 

if(a1==0||a2==0){System.out.println("Error:the data is zero.");}

int min=a1;

int max=a1;

if(a1<a2){

max=a2;

}

else{

min=a2;

}

if(max%min==0){

return min;

}

int temp=max%min;

max=min;

min=temp;

while(max%min!=0){

temp=max%min;

max=min;

min=temp;

}

return min;

}

/**

 * 求最小公倍數

 * @param a1

 * @param a2

 * @return

 */

public static int lcm(int a1,int a2){

 

if(a1==0||a2==0){System.out.println("Error:the data is zero.");}

int gcd=gcd(a1,a2);

 

return a1/gcd*a2;

}

/**

 * stringdata轉化爲分數的表示形式

 * @param data

 * @return

 */

public static int [] string2fac(String data){

int [] retfac=new int[2];

if(data.contains("/")){

String strings[]=data.split("/");

retfac[0]=Integer.valueOf(strings[0]);

retfac[1]=Integer.valueOf(strings[1]);

}

else{

int integer=Integer.valueOf(data);

retfac[0]=integer;

retfac[1]=1;

}

return retfac;

}

DoubleStack.java 處理計算優先級(雙棧和逆波蘭表達式)

package calculator;

 

import java.util.ArrayList;

import java.util.Stack;  

 

/**

 * 高級軟件工程

 * @author Song

 *

 */

public class DoubleStack {  

 

private ArrayList<String> testString=new ArrayList<>();

    private Stack<String> stack = null;  

    private ArrayList<String> createStrings=new ArrayList<>();

    

    public DoubleStack(String testString) {  

        this.testString = string2array(testString);  

        this.stack = new Stack<String>();  

    }  

    /**

     * 打印逆波蘭表達式和

     */

    public void printCreString(){

     System.out.println(createStrings);

    }

    /**

     * 根據逆波蘭表達式計算值

     */

    public String compute(){

    

     String ERRORINFO="The Function Is Wrong!";

     try{

         if(createStrings==null||createStrings.size()==0){

         return ERRORINFO;

         }

         while(createStrings.size()!=1){

         int i;

         for(i=0;i<createStrings.size();i++){

         if(ComputeController.isSign(createStrings.get(i))){

         if(i-2<0){return ERRORINFO;}

         String compute=ComputeController.exec(createStrings.get(i-2), createStrings.get(i-1), createStrings.get(i));

         createStrings.set(i-2, compute);

         createStrings.remove(i);

         createStrings.remove(i-1);

         break;

         }

         else if(i==createStrings.size()-1){return ERRORINFO;}

         }

         }

     }

     catch(Exception e){

     return ERRORINFO;

     }

    

     return createStrings.get(0);

    }

    /**

     * 逆波蘭 雙棧

     */

    public ArrayList<String> analysisString() {  

        for (int i = 0; i < testString.size(); i++) {  

            String c = testString.get(i);  

            if (c.equals("+") || c.equals("-")) {  

                if (stack.isEmpty() || stack.peek().equals("(")) {  

                    stack.push(c);  

                } else {  

                    while (!stack.isEmpty()  

                            && (stack.peek().equals("×") || stack.peek().equals("÷")  

                                    || stack.peek().equals("+") || stack.peek().equals("-"))) {  

                     createStrings.add(stack.pop());

                    }  

                    stack.push(c);  

                }  

            } else if (c.equals("×")|| c.equals("÷")) {  

                if (stack.isEmpty() || stack.peek().equals("+")

                        || stack.peek().equals("-") || stack.peek().equals("(")) {  

                    stack.push(c);  

                } else {  

                    while (!stack.isEmpty()  

                            && (stack.peek().equals("÷") || stack.peek().equals("×"))) {  

                      createStrings.add(stack.pop());

                    }  

                    stack.push(c);  

                }  

            } else if (c.equals("(")) {  

                stack.push(c);  

            } else if (c.equals(")") ){  

                String temp = "";  

                while (!(temp = stack.pop()).equals("(")) {  

                  createStrings.add(temp);

                }  

            } else {  

             createStrings.add(c);

            }  

        }  

        if (!stack.isEmpty()) {  

            while (!stack.isEmpty()) {  

             createStrings.add(stack.pop());

            }  

        }  

        return createStrings;

    }  

    /**

     * stringarray

     * @param input

     * @return

     */

    public static ArrayList<String> string2array(String input){

    

     String curString="";

     ArrayList<String> strings=new ArrayList<>();

     for(int i=0;i<input.length();i++){

     char curchar=input.charAt(i);

     if(curchar<58&&curchar>47||curchar=='/'){curString+=curchar;}

     else{

     if(!curString.equals("")){strings.add(curString);}

     strings.add(""+curchar);curString="";

     }

     }

     if(!curString.equals("")) {strings.add(curString);}

     return strings;

    }

    

  

}  

Frame.java 簡易GUI用戶界面

package calculator;

 

import java.awt.EventQueue;

 

public class Frame extends JFrame {

 

/**

 *

 */

private static final long serialVersionUID = 1L;

private JPanel contentPane;

private JTextField textField;

 

    JLabel lblNewLabel_1 = new JLabel("0");

JLabel label_2 = new JLabel("0");

JLabel label_3 = new JLabel("0.0%");

 

static JLabel lblNewLabel = new JLabel("正確題目");

static JLabel label = new JLabel("錯誤題目");

static JLabel label_1 = new JLabel("正確率");

static JButton button_20 = new JButton("重置");

static JButton button_19 = new JButton("清除");

static JButton button_18 = new JButton("退格");

static JButton button_23 = new JButton("簡");

static JButton button_21 = new JButton("繁");

static JButton button_22 = new JButton("英");

 

static final String EN="resource_english";

static final String CH="resource_zh_CN_1";

static final String HARD="resource_hard";

 

static Score curScore=new Score();

DecimalFormat df= new DecimalFormat("######0.0");   

 

/**

 * 字體中英繁切換

 * @param resource

 */

public static void changeCharacter(String resource){

 

ResourceBundle rb = ResourceBundle.getBundle(resource);

lblNewLabel.setText(rb.getString("rightAmount"));

label.setText(rb.getString("wrongAmount"));

label_1.setText(rb.getString("radioAmount"));

button_20.setText(rb.getString("reset"));

button_19.setText(rb.getString("clear"));

button_18.setText(rb.getString("back"));

button_23.setText(rb.getString("simply"));

button_21.setText(rb.getString("hard"));

button_22.setText(rb.getString("english"));

 .......

}

 

 

Score.java 評分模型

package calculator;

 

public class Score {

 

private int rightAmount;

private int wrongAmount;

private double radioAmount;

 

public int getRightAmount() {

return rightAmount;

}

public void setRightAmount(int rightAmount) {

this.rightAmount = rightAmount;

}

public int getWrongAmount() {

return wrongAmount;

}

public void setWrongAmount(int wrongAmount) {

this.wrongAmount = wrongAmount;

}

public double getRadioAmount() {

return radioAmount;

}

public void setRadioAmount(double radioAmount) {

this.radioAmount = radioAmount;

}

}

 

Util.java 公共類(文件的讀取寫入)

package calculator;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.text.ParseException;

import java.util.Date;

 

 

public class Util {

 

static String FILENAME="score.dat";

public static String SPLITSTRING = "&HHS&";

//建立Score

public static void createScore() throws IOException {

 

Score score=new Score();

 

FileWriter writer = new FileWriter(FILENAME);

writer.write(score.getRightAmount() + SPLITSTRING);

writer.write(score.getWrongAmount() + SPLITSTRING);

writer.write(score.getRadioAmount() + SPLITSTRING);

writer.close();

}

//讀取分數

public static Score readScore() throws IOException, ParseException {

 

Score score=new Score();

BufferedReader reader = new BufferedReader(new FileReader(FILENAME));

String line = reader.readLine();

String []infos=line.split(SPLITSTRING);

score.setRightAmount(Integer.valueOf(infos[0]));

score.setWrongAmount(Integer.valueOf(infos[1]));

score.setRadioAmount(Double.valueOf(infos[2]));

 

return score;

 

}

//寫分數

public static void saveScore(Score score) throws IOException, ParseException {

 

FileWriter writer = new FileWriter(FILENAME);

writer.write(score.getRightAmount() + SPLITSTRING);

writer.write(score.getWrongAmount() + SPLITSTRING);

writer.write(score.getRadioAmount() + SPLITSTRING);

 

writer.close();

}

 

/**

 *

 * 獲取目錄下的全部文件名 By Hhs

 */

public static String[] getFileName(String path) {

File file = new File(path);

String[] fileName = file.list();

return fileName;

}

}

 

resource_zh_CN_1.properties等配置文件

 

實現了java語言的國際化,能夠實現中文英文簡體繁體的切換。

 

項目小結

這個做業功能是實現了,可是有些細節還須要改進,好比當計算結果取=時,若是輸入下一個式子,TextField裏面的內容不會自動清空,後期能夠對這個進行一個優化,加一個字段的判斷,若是按下=,該字段置爲true,表示下個字符若是是數字就首先把TextField清空再放入數據。

在測試的時候出現一些小bug,好比對負數的處理等等,會獲得使人意想不到的結果,當輸入的表達式不合法時也加入了一個異常處理,返回The Function is Wrong!給前臺界面,後期能夠對此作改進,將異常返回作的細一點,好比是分母不能爲0或者是數字太大或者是表達式裏面有特殊字符,將錯誤信息儘量細的返回給用戶。

相關文章
相關標籤/搜索