JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區 » 學習筆記  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 簡單的計算器
say_ken





發文: 41
積分: 0
於 2018-04-14 15:13 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
前面嘗試了一種寫法,後來因為各物件間的耦合太嚴重導致難以閱讀而放棄,現在試著用另一種架構來寫。
有興趣的可以下載附件,裡面有我之前的屍體(Calculator_burst.jar (沒註解)),以及現在正在寫的(calculator.jar(有註解))。

目前只寫了一點點,明天再繼續。

Doc.7z (27.45k)


reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
作者 Re:簡單的計算器 [Re:say_ken]
say_ken





發文: 41
積分: 0
於 2018-04-15 16:15 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這是今天卡最久的部分,尤其一直在考慮到底要怎麼表達優先權的問題嘗試了好多次。
其實我也知道若真要寫一個逐步計算的計算器是有很多更好的方法的,不過這次寫它是為了給javaSE做一個總練習,寫完它就要開始學JavaWeb了。
P.S.有興趣的朋友們可以下載附件,裡面有完整的原始碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package calculator.arithmetic;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import calculator.CalcException;
import calculator.item.Item;
import calculator.item.Items;
import calculator.item.bracket.LeftBracket;
import calculator.item.bracket.Rightbracket;
 
/**
 * 主要計算邏輯: 譬如一算式 : 1+((2-4*5)+6)/7-(8+9)
 *  1.提取最小括號內算式:
 *     原式 : 1+((2-4*5)+6)/7-(8+9)
 *     提取: X= (2-4*5)
 *        Y= (8+9) 
 *     原式=> 1+(X+6)/7-Y
 *  2.計算最高優先權的運算符號
 *    (2-4*5) => (2-20)
 *     (8+9) => (17)
 *  3.把它塞回去
 *    原式=> 1+(X+6)/7-Y
 *       => 1+((2-20)+6)/7-17
 *  4.回傳
 *     1+((2-20)+6)/7-17
 */
public class Arithmetic {
  static boolean isDone = false;
 
  private Arithmetic() {
  }
 
  /**
   * 將算式加上優先權重並依照括號切割 然後喔照優先權重計算切割後的算式(只計算最高權重) 傳回計算結果
   */
  public static Item[] calc(Item[] input) throws CalcException {
    // 取得實例
    Arithmetic instance = new Arithmetic();
    // 取得按照順序的最高優先權的算式片段陣列
    LinkedList<Object[]>[] calcAble = instance.getTopPrioritys(input);
    // 計算結果
    LinkedList<Object[]>[] calcAfter = new LinkedList[calcAble.length];
 
    // 將算式陣列分別計算出答案並存入陣列
    for (int index = 0; index < calcAble.length; ++index) {
      // 不包含括號的算式
      calcAfter[index] = instance.calcFormula(calcAble[index]);
    }
    // 等待各執行緒結束
    waitDone();
    // 將修改加入原算式並回傳
    Item[] output = instance.changeTopPrioritys(calcAfter);
    return output;
  }
 
  // Thread !!
  private LinkedList<Object[]> calcFormula(LinkedList<Object[]> linkedList) {
    // TODO Auto-generated method stub
    return null;
  }
 
  // 等待所有計算執行緒結束
  private static void waitDone() {
    // TODO Auto-generated method stub
  }
 
  /** 附優先權的完整算式暫存 */
  LinkedList<Object[]> subPriorityFormula = new LinkedList<>();
 
  /** 取得最高優先權的算式片段陣列 */
  private LinkedList<Object[]>[] getTopPrioritys(Item[] input) {
    // 符號優先權(需複寫Equals)
    HashMap<Item, Integer> ItemPriorityMap = Items.getItemPriorityMap();
    /** 待回傳的陣列 */
    ArrayList<LinkedList<Object[]>> subFormula = new ArrayList<>();
    // 最高優先權
    int maxPriority = 0;
    // 填入subPriorityFormula
    for (int index = 0, priority = 0; index < input.length; index++) {
      // 當前元素的優先權
      priority = ItemPriorityMap.get(input[index]);
      // 存入暫存
      subPriorityFormula.add(new Object[] { priority, input[index] });
      // 設定最高優先權
      maxPriority = (priority > maxPriority) ? priority : maxPriority;
    }
 
    // 開始提取
    cutLoop: for (int index = 0; index < subPriorityFormula.size(); ++index) {
      Object[] obj = subPriorityFormula.get(index);
      // 當前物件
      Item item = (Item) obj[1];
      int LeftbracketIndex = -1;
      // 若為括號則直接提取最小括號內算式
      if (item instanceof LeftBracket) {
        LeftbracketIndex = index;
        int RightbracketIndex = 0;
        for (int indexx = index; indexx < subPriorityFormula.size(); ++indexx) {
          if (item instanceof Rightbracket) {
            LeftbracketIndex = indexx;
            index = indexx;
            break;
          } else if (item instanceof LeftBracket) {
            LeftbracketIndex = indexx;
          }
        }
        subFormula.add(
            (LinkedList<Object[]>) subPriorityFormula.subList(LeftbracketIndex + 1, RightbracketIndex + 1));
        continue cutLoop;
      }
      // 沒有括號
      if (LeftbracketIndex == -1)
        subFormula.add(subPriorityFormula);
    }
    return subFormula.toArray(new LinkedList[subFormula.size()]);
  }
 
  // 將計算完畢的部分算式塞回原式
private Item[] changeTopPrioritys(LinkedList<Object[]>[] ans) {
    // TODO Auto-generated method stub
    return null;
  }
 
}


Calculator.jar (22.09k)


reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
作者 Re:簡單的計算器 [Re:say_ken]
say_ken





發文: 41
積分: 0
於 2018-04-18 16:25 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
...是的我又重寫了...
原因是我看了看自己寫的東西感覺繞了好多彎道,不用想就知道執行效率會很慢...
所以這次我打算特別留意資源的重複利用,盡可能的減少轉型與判斷式
花了點時間建立起一個大概的架構出來了
p.s.附件是半成品原始檔

以下是主要流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package calculator;
 
import calculator.arithmetic.Arithmetic;
import calculator.arithmetic.Formula;
import calculator.ui.UI;
import myexception.CalcException;
import myexception.IncorrectFormat;
 
/**
 * 依據使用者輸入的算式一步步計算出解答
 * */
public class Calculator {
  public static void main (String[] args) {
    UI.initialize();
    String input = UI.getTextInput(UI.STARTASK);
    mainMethod(input);
  }
  
  /**主要流程*/
  private static void mainMethod(String input) {
    //取得使用者輸入
    Formula formula = getInputLoop(input);
    //計算迴圈
    calcLoop(formula);
  }
  
  /**逐步計算並列印結果,最後詢問是否繼續*/
  private static void calcLoop(Formula formula) {
    Arithmetic calc = new Arithmetic(formula);
    //一步步計算並列印
    for (int step = 1 ; !calc.isEnd() ; ++step){
      UI.printText("Step %d : %n",step);
      Formula fa = null;
      try {
        fa= calc.calculate(formula);
      }catch(CalcException e) {
        UI.printExceptionText(e);
        mainMethod(UI.getTextInputAgain());
      }
      UI.printText("%s%n",fa.toString());
    }
    UI.printText("Final Answer : %d%n",calc.getResult());
    String input = UI.getTextInput(UI.ENDASK);
    if(input.equals("Q"))
      return;
    mainMethod(input);
  }
 
  /**取得合乎邏輯的算式輸入*/
  private static Formula getInputLoop(String stringFormula) {
    Formula itemFormula;
    while(true) {
      try {
        itemFormula = new Formula(stringFormula);
      }catch(IncorrectFormat e) {
        UI.printExceptionText(e);
        stringFormula = UI.getTextInputAgain();
        continue;
      }
      break;
    }
    return itemFormula;
  }
}


Calculator_beta.jar (16.21k)


reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
作者 Re:簡單的計算器 [Re:say_ken]
kentyeh





發文: 643
積分: 6
於 2018-04-19 06:28 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你的Jar檔是不能執行的,且打開來看,程式實做都是空的,
若要進行運算式計算實在不用這麼搞剛。
先參考一下良葛格的中序式轉後序式
再回來做吧


reply to postreply to post
作者 Re:簡單的計算器 [Re:kentyeh]
say_ken





發文: 41
積分: 0
於 2018-04-27 13:20 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝您的提醒Big Smile,這個程式還沒完成,目前只搭起了一個架子而已,寫它的主要目的在於複習基本語法(尤其一些平常比較少用的寫法),所以很多地方會故意用複雜的方式寫。

附件的jar檔只是原始碼的壓縮檔(順手用Eclipse導出的)

這篇我有看過了,並且您曾經寫的計算器我也有看過,並且打算借鑑一部分

這個計算器我打算遵循以下原則製作:
1.盡可能的用上所有基礎語法
2.盡可能的做好物件導向處理
3.盡可能的增加其可擴充性(譬如將來想新增一個log運算的功能,或是修改使用者介面為GUI,只要寫一個類別加進去小改一下就行)
4.盡可能保證其穩定性與可讀性
5.盡可能的增進效能並節省資源

p.s.最近在學javaEE的東西,導致想到很多新想法想要用進去,一直刪刪改改的,平時白天也有事要忙,但我還是會把它做完的。


say_ken edited on 2018-04-28 05:15
reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
作者 Re:簡單的計算器 [Re:say_ken]
say_ken





發文: 41
積分: 0
於 2018-05-12 16:39 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
結果越寫越複雜了+.+ 看來我還有很大的進步空間

附件是最新版的半成品,目前已經做到
1.輸入元素控制(例外捕捉未完成)
2.字串解析為LinkedList<Item>
3.中序轉前序
4.分離運算符號實做

歡迎試玩(雖然還只是樣子貨沒有實際功能)

Calculator0.3.jar (50.74k)


reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
作者 Re:簡單的計算器 [Re:say_ken]
say_ken





發文: 41
積分: 0
於 2018-05-12 16:50 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
原始檔(還沒註解)

Calculator0.3.zip (85.9k)


reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
作者 Re:簡單的計算器 [Re:say_ken]
say_ken





發文: 41
積分: 0
於 2018-05-13 16:57 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
加了點註解

Calculator0.3.rar (102.01k)


say_ken edited on 2018-05-13 16:59
reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
作者 完成了,歡迎試玩^^ [Re:say_ken]
say_ken





發文: 41
積分: 0
於 2018-05-27 05:22 user profilesend a private message to usersend email to say_kenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
終於完成了,雖然(-X)這種負號表示法有點問題,但之後再說吧,總之基本的運算邏輯算是完成了

檔案如下

Calculator0.5.jar (59.11k)


reply to postreply to post
剛開始學java,99%菜鳥
lineID : flingcat
» JWorld@TW »  Java 新手區 » 學習筆記

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8