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.
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;
}
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;
}
/**
* string轉array
* @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;
}
}
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"));
.......
}
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;
}
}
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或者是數字太大或者是表達式裏面有特殊字符,將錯誤信息儘量細的返回給用戶。