2015-07-14 5 views
-1

Я пытаюсь закодировать научный калькулятор на Java. Однако у меня возникают трудности с попыткой рассчитать программу. Вы можете видеть в приведенном ниже коде, мне удалось заставить графический интерфейс работать с печатью чисел в графическом интерфейсе. Я также добавил функциональность к кнопке «+», чтобы сначала проверить ее, чтобы увидеть, работает ли программа.Java GUI Scientific Calculator

public class Gui extends JFrame { 
    private static JButton [] button = new JButton[36]; 
    private static TextField tf; 
    private JPanel panel; 
    private JPanel panel1; 



public Gui(){ 
    super("Scientific Calculator"); 
    panel = new JPanel(); 
    panel1 = new JPanel(new GridLayout(0,4)); 

    tf = new TextField(20); 
    tf.setEditable(false); 
    panel.add(tf); 

    button[0]=new JButton("Rad/Deg"); 
    button[1]=new JButton("x!"); 
    button[2]=new JButton("sqrt"); 
    button[3]=new JButton("sin"); 
    button[4]=new JButton("cos"); 
    button[5]=new JButton("tan"); 
    button[6]=new JButton("ln"); 
    button[7]=new JButton("log"); 
    button[8]=new JButton("1/x"); 
    button[9]=new JButton("e^x"); 
    button[10]=new JButton("x^2"); 
    button[11]=new JButton("y^x"); 
    button[12]=new JButton("|x|"); 
    button[13]=new JButton("pi"); 
    button[14]=new JButton("e"); 

    button[15]=new JButton("C"); 
    button[16]=new JButton("("); 
    button[17]=new JButton(")"); 
    button[18]=new JButton("%"); 
    button[19]=new JButton("/"); 
    button[20]=new JButton("7"); 
    button[21]=new JButton("8"); 
    button[22]=new JButton("9"); 
    button[23]=new JButton("*"); 
    button[24]=new JButton("4"); 
    button[25]=new JButton("5"); 
    button[26]=new JButton("6"); 
    button[27]=new JButton("-"); 
    button[28]=new JButton("1"); 
    button[29]=new JButton("2"); 
    button[30]=new JButton("3"); 
    button[31]=new JButton("+"); 
    button[32]=new JButton("."); 
    button[33]=new JButton("0"); 
    button[34] =new JButton("+/-"); 
    button[35] =new JButton("="); 



    for(int i = 0; i<button.length;i++){ 
     panel1.add(button[i]); 
    } 


    panel.add(panel1); 
    add(panel); 

    HandlerClass handler = new HandlerClass(); 
    for(int i = 0; i<button.length;i++){ 
     button[i].addActionListener(handler); 
    } 

} 
private class HandlerClass implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     double num1 = 0,num2; 

     String alreadyDisplayed = tf.getText(); 
     String toDisplay = ""; 

     if(e.getSource()==button[33]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[33].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[28]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[28].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[29]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[29].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[30]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[30].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[24]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[24].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[25]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = (button[25].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[26]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[26].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[20]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[20].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[21]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[21].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[22]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[22].getText()); 
      tf.setText(toDisplay); 
     } 
     if(e.getSource()==button[31]){ 
      alreadyDisplayed = tf.getText(); 
      toDisplay = alreadyDisplayed + (button[31].getText()); 
      tf.setText(toDisplay); 
     } 

Однако моя проблема заключается в том, что делать потом. Я пытаюсь сделать блок try и catch, чтобы увидеть, является ли первый вход числом, а затем преобразовать его в double, а затем сохранить в массиве, чтобы впоследствии использовать функцию оператора, а затем продолжать добавлять номера пока пользователь не захочет остановиться и выполнить расчет. Моя попытка этого кода ниже, но это неправильно. Может кто-нибудь, пожалуйста, предложите, что я делаю неправильно? Благодаря

try{ 
    num1 = Double.parseDouble(toDisplay); 
} 
catch(NumberFormatException e1){ 
    System.out.println("You have not entered a number"); 
} 
double[] arr = new double[10]; 
for(int i=0; i<arr.length;i++){ 
    arr[i]=num1; 
    String test = String.valueOf(arr[i]); 
    tf.setText(test); 
} 

EDIT Я написал новый код для простого калькулятора, как это рекомендовано другим пользователем, и это работает для двух входов. Однако я все еще получаю ошибки, когда пытаюсь реализовать несколько входов. Ниже приведен рабочий код для двух входных калькуляторов.

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 

public class CalcGui extends JFrame { 

    private JButton buttonZero; 
    private JButton buttonOne; 
    private JButton buttonTwo; 
    private JButton buttonThree; 
    private JButton buttonFour; 
    private JButton buttonFive; 
    private JButton buttonSix; 
    private JButton buttonSeven; 
    private JButton buttonEight; 
    private JButton buttonNine; 

    private JButton opButtonPlus; 
    private JButton opButtonMinus; 
    private JButton opButtonDivide; 
    private JButton opButtonMultiply; 
    private JButton opButtonEquals; 
    private JButton opButtonClear; 

    private TextField tf; 

    private JPanel numButtonPanel; 
    private JPanel opButtonPanel; 
    private JPanel basePanel; 

    public CalcGui(){ 
     super("Scientific Calculator"); 
     basePanel = new JPanel(); 
     numButtonPanel = new JPanel(new GridLayout(0,4)); 
     opButtonPanel = new JPanel(new GridLayout(0,1)); 

     tf = new TextField(20); 
     tf.setEditable(false); 
     basePanel.add(tf); 

     buttonZero = new JButton("0"); 
     numButtonPanel.add(buttonZero); 
     buttonOne = new JButton("1"); 
     numButtonPanel.add(buttonOne); 
     buttonTwo = new JButton("2"); 
     numButtonPanel.add(buttonTwo); 
     buttonThree = new JButton("3"); 
     numButtonPanel.add(buttonThree); 
     buttonFour = new JButton("4"); 
     numButtonPanel.add(buttonFour); 
     buttonFive = new JButton("5"); 
     numButtonPanel.add(buttonFive); 
     buttonSix = new JButton("6"); 
     numButtonPanel.add(buttonSix); 
     buttonSeven = new JButton("7"); 
     numButtonPanel.add(buttonSeven); 
     buttonEight = new JButton("8"); 
     numButtonPanel.add(buttonEight); 
     buttonNine = new JButton("9"); 
     numButtonPanel.add(buttonNine); 

     basePanel.add(numButtonPanel); 

     opButtonPlus = new JButton("+"); 
     opButtonMinus = new JButton("-"); 
     opButtonDivide = new JButton("/"); 
     opButtonMultiply = new JButton("*"); 
     opButtonEquals = new JButton("="); 
     opButtonClear = new JButton("C"); 

     opButtonPanel.add(opButtonPlus); 
     opButtonPanel.add(opButtonMinus); 
     opButtonPanel.add(opButtonDivide); 
     opButtonPanel.add(opButtonMultiply); 
     opButtonPanel.add(opButtonEquals); 
     opButtonPanel.add(opButtonClear); 

     basePanel.add(opButtonPanel); 

     add(basePanel); 

     HandlerClass handler = new HandlerClass(); 

     buttonZero.addActionListener(handler); 
     buttonOne.addActionListener(handler); 
     buttonTwo.addActionListener(handler); 
     buttonThree.addActionListener(handler); 
     buttonFour.addActionListener(handler); 
     buttonFive.addActionListener(handler); 
     buttonSix.addActionListener(handler); 
     buttonSeven.addActionListener(handler); 
     buttonEight.addActionListener(handler); 
     buttonNine.addActionListener(handler); 

     opButtonPlus.addActionListener(handler); 
     opButtonMinus.addActionListener(handler); 
     opButtonDivide.addActionListener(handler); 
     opButtonMultiply.addActionListener(handler); 
     opButtonEquals.addActionListener(handler); 
     opButtonClear.addActionListener(handler); 

    } 


    private class HandlerClass implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      String alreadyDisplayed = tf.getText(); 
      if(e.getSource()==buttonZero){ 
       String buttonZeroText = alreadyDisplayed + buttonZero.getText(); 
       tf.setText(buttonZeroText); 
      }else if(e.getSource()==buttonOne){ 
       String buttonOneText = alreadyDisplayed + buttonOne.getText(); 
       tf.setText(buttonOneText); 
      }else if(e.getSource()==buttonTwo){ 
       String buttonTwoText = alreadyDisplayed + buttonTwo.getText(); 
       tf.setText(buttonTwoText); 
      }else if(e.getSource()==buttonThree){ 
       String buttonThreeText = alreadyDisplayed + buttonThree.getText(); 
       tf.setText(buttonThreeText); 
      }else if(e.getSource()==buttonFour){ 
       String buttonFourText = alreadyDisplayed + buttonFour.getText(); 
       tf.setText(buttonFourText); 
      }else if(e.getSource()==buttonFive){ 
       String buttonFiveText = alreadyDisplayed + buttonFive.getText(); 
       tf.setText(buttonFiveText); 
      }else if(e.getSource()==buttonSix){ 
       String buttonSixText = alreadyDisplayed + buttonSix.getText(); 
       tf.setText(buttonSixText); 
      }else if(e.getSource()==buttonSeven){ 
       String buttonSevenText = alreadyDisplayed + buttonSeven.getText(); 
       tf.setText(buttonSevenText); 
      }else if(e.getSource()==buttonEight){ 
       String buttonEightText = alreadyDisplayed + buttonEight.getText(); 
       tf.setText(buttonEightText); 
      }else if(e.getSource()==buttonNine){ 
       String buttonNineText = alreadyDisplayed + buttonNine.getText(); 
       tf.setText(buttonNineText); 
      }else if(e.getSource()==opButtonPlus){ 
       String opButtonPlusText = alreadyDisplayed + opButtonPlus.getText(); 
       tf.setText(opButtonPlusText); 
      }else if(e.getSource()==opButtonEquals){ 
       String opButtonEqualsText = alreadyDisplayed + opButtonEquals.getText(); 
       tf.setText(opButtonEqualsText); 
      }else if(e.getSource()==opButtonMinus){ 
       String opButtonMinusText = alreadyDisplayed + opButtonMinus.getText(); 
       tf.setText(opButtonMinusText); 
      }else if(e.getSource()==opButtonMultiply){ 
       String opButtonMultiplyText = alreadyDisplayed + opButtonMultiply.getText(); 
       tf.setText(opButtonMultiplyText); 
      }else if(e.getSource()==opButtonDivide){ 
       String opButtonDivideText = alreadyDisplayed + opButtonDivide.getText(); 
       tf.setText(opButtonDivideText); 
      }else if(e.getSource()==opButtonClear){ 
       String opButtonClearText = ""; 
       tf.setText(opButtonClearText); 
      } 


      double result; 
      for(int i=0; i<alreadyDisplayed.length();i++){ 

       if(e.getSource()==opButtonEquals){ 

        if(alreadyDisplayed.charAt(i)=='+'){ 
         result = Double.parseDouble(alreadyDisplayed.substring(0,i)) + Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length())); 
         tf.setText(alreadyDisplayed + "=" + result); 
        }else if(alreadyDisplayed.charAt(i)=='-'){ 
         result = Double.parseDouble(alreadyDisplayed.substring(0,i)) - Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length())); 
         tf.setText(alreadyDisplayed + "=" + result); 
        }else if(alreadyDisplayed.charAt(i)=='/'){ 
         result = Double.parseDouble(alreadyDisplayed.substring(0,i))/Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length())); 
         tf.setText(alreadyDisplayed + "=" + result); 
        }else if(alreadyDisplayed.charAt(i)=='*'){ 
         result = Double.parseDouble(alreadyDisplayed.substring(0,i)) * Double.parseDouble(alreadyDisplayed.substring(i+1,alreadyDisplayed.length())); 
         tf.setText(alreadyDisplayed + "=" + result); 
        } 
       } 
      } 
     } 
    } 
} 

Часть У меня возникли трудности с получает номер и хранить его так, что я могу позволить пользователю вводить более двух значений. Так, например, если я вытащил цикл for в конце вышеприведенного кода и заменил его на это;

double []num1=new double[10]; 
    double []num2=new double[10]; 
    //double num1 = 0; 
    double temp =0; 
    String str[] = new String [10]; 
    String []str1 = new String[10]; 
    if(e.getActionCommand().equals("+")) 
    if(e.getSource() == opButtonEquals) 
     for(int i = 0; i<alreadyDisplayed.length(); i++){ 

      if(alreadyDisplayed.charAt(i)=='+') 
      str[i] = alreadyDisplayed.substring(0,i); 
      num1[i] = Double.parseDouble(str[i]); 
      str1[i+1] = alreadyDisplayed.substring(i+1,alreadyDisplayed.length()); 
      num2[i+1] = Double.parseDouble(str1[i]); 

      temp += num1[i] + num2[i+1]; 

      tf.setText(Double.toString(temp)); 

     }System.out.println(temp); 
    } 
} 

Так что, когда я пытаюсь проверить, чтобы увидеть, если температура имеет какое-либо значение в консоли, он просто печатает 0 каждый раз. Строковый текст отображается в текстовом поле, однако фактический расчет не работает. Я думал, что это сработает, сохранив номер, а затем сохранив другое число, а затем добавив их вместе, но это не так.

+0

Сначала создается массив 'double [] arr = new double [10]' – danleyb2

+0

Почему вы устанавливаете i в double, если при его использовании вы всегда бросаете его в int? Просто объявите его как int в цикле for. – JDrost1818

+0

Я знаю, что это была глупая ошибка, я только что заметил это минуту назад. Внесет изменения сейчас – mp252

ответ

0

Почему бы не сохранить значения в строке (гораздо проще манипулировать), а затем проанализировать ее как арифметическое выражение позже? Например ..

Люди нажимают кнопку "(", "грех (8)", "+", "8", ")", "+", "1", "="

Это быстро оценивает простую строку (sin (8) +8) + 1 =

Вы можете разобрать строку и искать очевидные вещи, которые необходимо проанализировать (например, искать грех, а затем анализировать все между скобки рекурсивно). Используйте математические функции для оценки сложных выражений и проанализируйте простые.

я мог бы рекомендовать писать свои собственные функции для решения сложных выражений, хотя - что-то похожее на это ...

public double solveSin(String inside) { 
    if(NumberUtils.isNumber(inside)) { 
    return Math.sin(Double.parseDouble(inside); 
    } else { 
    //Call back to original function to direct based on inputs 
    return Math.sin(parseEquation(inside)); 
    } 
} 
0

Попытка сделать дерево оператора, как только кнопка будет нажата. Продолжайте обновлять дерево, пока нажимаете больше кнопок. Разбор всей строки уравнения может быть сложной задачей.

После того, как пользователь нажал Enter, решите дерево оператора. Это имеет много преимуществ. 1) Вам не придется иметь дело с разбором одного операнда/оператора за раз. 2) Правильный обход дерева по порядку позаботится о правиле BODMAS и других nitty-gritty математических операторов. 3) Обход в порядке даст вам исходное уравнение, введенное пользователем, которое вы можете показать ему.