2011-12-28 4 views
1

선형 계산기로 계산을 수행하는 GUI 계산기 프로그램을 만들었지 만, 계산을 수행하려면 "나누기, 곱하기, 더하기, 빼기 ".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

+0

아니, 지금은 연습하고 있습니다. 이제는 두 개의 숫자 연산 만 수행하는 계산기를 만들었으므로 한 번에 두 개 이상의 연산을 수행 할 수있는 GUI 계산기를 만들려고했습니다. – Jaydeep

+0

@Jaydeep 가장 쉬운 방법은 이것은 postfix 표기법과 같은 것으로 변환하는 것입니다. – Matt

답변

1

당신은 표현을 이해하는 선형 접근 방식을 가지고, 당신은 운영자의 목록을 작성하고 순서대로 실행합니다.

당신은 당신이

3 + 4 * 5 

에 원하는 의미를 부여 할 수 있도록 나무처럼 뭔가 더를 구축 할 필요가 당신은 아마 이것은 매우 일반적인 분석이다 괄호에게 너무

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

을 허용 할 일반적으로 재귀 적 하강 파싱이라고 알려진 문제. 그러한 파서를 구현하는 라이브러리를 찾을 수 있습니다. 예 : ANTLR. 당신이있는 곳에서부터 이런 종류의 물건에 이르기까지 꽤 큰 도약입니다. 당신이 주위를 파다 보면 당신은 복제 할 수있는 간단한 구현을 찾을 수있을 것입니다.하지만 실제로이 영역을 이해하기를 원한다면 상당히 공부할 필요가 있습니다 : this과 같은 기사가 도움이 될 수 있습니다.

-1

음, 링크 된 목록에서 피연산자와 연산자로 사용하는 모든 문자를 저장하는 것은 어때? 우선 순위에 따라 모든 연산자를 배열에 저장합니다. 예를 들어, arr [] = { '/', '*', '+', '-'}는 이러한 연산자를 반복합니다. 첫 번째로 적용해야하는 작업을 감지하는 동안 새 노드에 응답을 저장 한 다음 감지 된 작업과 피연산자가 포함 된 노드를 삭제합니다. 마지막 노드에서 작업을 마친 후 노드에 새 노드를 연결합니다 수행되고 있었다. 기본 또는 헤드 노드의 다음 포인터가 0이 될 때까지이 과정을 반복 할 수 있습니다. 솔직히 말하자면,이 문제에 대한 초보자이기도합니다. 따라서이 솔루션은 분명히 좋지 않습니다. 나 또한 일종의 생각이 바로 지금 당장이 아이디어를 직접 구현했다. 하지만 그래, 네가 원한다면 총소리를 낼 수있어. 조금이라도 도움이 되었길 바래.

관련 문제