2011-12-28 47 views
1

我創建了一個圖形用戶界面的計算器程序,以線性順序進行計算,但我希望它在「鴻溝訂單進行計算,乘加運算,減「編程執行在DMAS的運營秩序

我是個初學者,所以請建議我,如果有任何其他實現同樣的事情,我已經編寫簡單的方法。
請幫我用'DMAS'的事情。

我的代碼:

public class keypadGUI extends JFrame{ 
private JTextField lcd; 
private JButton n1,n2,n3,n4,n5,n6,n7,n8,n9,n0; 
private JButton plus,minus,multiply,divide,equalTo,dot; 
//private JButton[] buttons = new JButton[10]; 
//private JButton[] opButtons = new JButton[6]; 
private double ans = 0;      //For storing final ans 
char[] op;        //Character array for stroing operators 
private double[] nums;      //For storing the numbers 
public JPanel keypad; 
private StringBuilder sb = new StringBuilder();   //For storing the input of the user as string 

public keypadGUI(){ 
    setLayout(new BorderLayout(10,10)); 
    lcd = new JTextField(); 
    lcd.setEditable(false); 

    Border low = BorderFactory.createLoweredSoftBevelBorder(); 
    lcd.setBorder(low); 
    lcd.setHorizontalAlignment(JTextField.RIGHT); 
    lcd.setFont(new Font("Serif",Font.BOLD,30)); 
    lcd.setText("0"); 

    Font numFont = new Font("Serif",Font.BOLD,20); 


    n1 = new JButton("1"); n2 = new JButton("2"); n3 = new JButton("3"); n4 = new JButton("4"); 
    n5 = new JButton("5"); n6 = new JButton("6"); n7 = new JButton("7"); n8 = new JButton("8"); 
    n9 = new JButton("9"); n0 = new JButton("0"); dot = new JButton("."); 
    plus = new JButton("+"); 
    minus = new JButton("-"); 
    multiply = new JButton("*"); 
    divide = new JButton("/"); 
    equalTo = new JButton("="); 
    n1.setFont(numFont); n2.setFont(numFont); n3.setFont(numFont); n4.setFont(numFont); 
    n5.setFont(numFont); n6.setFont(numFont); n7.setFont(numFont); n8.setFont(numFont); 
    n9.setFont(numFont); n0.setFont(numFont); dot.setFont(numFont); plus.setFont(numFont); 
    minus.setFont(numFont); multiply.setFont(numFont); divide.setFont(numFont); equalTo.setFont(numFont); 

    plus.setForeground(Color.DARK_GRAY);  minus.setForeground(Color.DARK_GRAY); multiply.setForeground(Color.DARK_GRAY); 
    divide.setForeground(Color.DARK_GRAY);  equalTo.setForeground(Color.DARK_GRAY); 

    listen listener = new listen(); 
    n1.addActionListener(listener); n2.addActionListener(listener); n3.addActionListener(listener); n4.addActionListener(listener); 
    n5.addActionListener(listener); n6.addActionListener(listener); n7.addActionListener(listener); n8.addActionListener(listener); 
    n9.addActionListener(listener); n0.addActionListener(listener); plus.addActionListener(listener); minus.addActionListener(listener); 
    multiply.addActionListener(listener); divide.addActionListener(listener); 
    equalTo.addActionListener(new equalListener()); 

    keypad = new JPanel(new GridLayout(4,4,10,10)); 
    keypad.add(n7); keypad.add(n8); keypad.add(n9); keypad.add(divide); 
    keypad.add(n4); keypad.add(n5); keypad.add(n6); keypad.add(multiply); 
    keypad.add(n1); keypad.add(n2); keypad.add(n3); keypad.add(plus); 
    keypad.add(n0); keypad.add(dot); keypad.add(equalTo); keypad.add(minus); 

    add(lcd,BorderLayout.NORTH); 
    add(keypad,BorderLayout.CENTER); 
    setVisible(true); 
    setLookAndFeel(); 
    setSize(280,280); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setTitle("MY Calc"); 


} 


private void setLookAndFeel(){ 
    try{ 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    }catch(Exception ae){} 
} 

private class listen implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
      String bName = ((JButton)e.getSource()).getText(); 
      sb.append(bName); 
      lcd.setText(sb.toString()); 
    } 
} 

private class equalListener implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     String[] tokkens = sb.toString().split("-|\\+|\\*|\\/"); 
     nums = new double[tokkens.length]; 
     for(int i=0;i<nums.length;i++){ 
      nums[i] = Double.parseDouble(tokkens[i]); 
     } 
     op = new char[10]; 
     op[0]='+'; 
     int c =1; 
     for(int i=0;i<sb.length();i++){ 
      if(sb.charAt(i)=='+' || sb.charAt(i)=='-' || sb.charAt(i)=='*' || sb.charAt(i)=='/') 
      { op[c]=sb.charAt(i); c++; } 
     } 
     performOP(); 
     sb = sb.delete(0, sb.length()); 
     sb.append(ans); 
     lcd.setText(sb.toString()); 


     System.out.println(op); 
     System.out.println(Arrays.toString(tokkens)); 
    } 
} 

private void performOP(){ 
    for(int i=0;i<nums.length;i++){ 
     switch(op[i]){ 
      case '+': 
       ans = ans + nums[i]; 
      break; 
      case '-': 
       ans = ans - nums[i]; 
      break; 
      case '*': 
       ans = ans * nums[i]; 
      break; 
      case '/': 
       ans = ans/nums[i]; 
      break; 
      default: 
      System.out.println("INVALID CASE !!!"); 
     } 
    } 
} 
} 
+0

它是功課嗎? – amit 2011-12-28 06:56:37

+0

不,我只是在練習,現在高達我創造了所執行只有兩個操作數計算器,所以現在我想建立一個GUI鈣,可以在同一時間 – Jaydeep 2011-12-28 06:58:00

+0

@Jaydeep做最簡單的方式執行多個操作這個我認爲只是將它轉換成類似於後綴表示法的東西。 – Matt 2011-12-28 07:02:07

回答

1

您現在有理解表達的線性方法,構建運營商的列表,以便執行它們。

你需要更多的建立像一棵樹,這樣就可以給你想要表達的意思,以

3 + 4 * 5 

,你可能要允許括號太

2 + (3 * 4) + (5 * (6 + 7)) 

這是一個很常見的解析問題,一般稱爲遞歸下降解析。您將能夠找到實現這些解析器的庫。例如ANTLR。從你到這種東西的地方,這是一個很大的跳躍。如果你四處挖掘,你可能會發現你可以克隆的簡單實現,但是如果你真的想了解這個領域,那麼你需要學習很多東西:諸如this等文章可能會有所幫助。

-1

嗯,怎麼樣,如果你只是存儲您需要在一個鏈表操作數和運算的所有字符。根據其優先級將所有運算符存儲在數組中。比如,arr [] = {'/','*','+',' - '},遍歷這些運算符。當您正在檢測需要首先應用的任何操作時,請將其答案存儲在新節點中,然後刪除包含檢測到的操作和操作數的那些節點。將新節點鏈接到操作數的最後一個操作數正在執行。你可以重複這個過程,直到基本節點或頭節點的下一個指針變爲零。而且說實話,iam也是這個問題的初學者,所以這個解決方案顯然不是很好。我現在也有這種想法,而且現在還沒有自己實施這個想法。但是,如果你願意的話,你可以試試它。即使只是一點點,它也會有所幫助。