2017-10-18 121 views
0

私は自分の問題にジャンプする前に、実際には主にコーディングの助けが必要ではないことに注意したい。私は数日間問題を考えていた。プログラミングに基づく質問ではありません。(Java)GUIベースの電卓のアルゴリズム

プログラミングから約2年後、私は数日前に自分の知識をリフレッシュすることに決めました。私は電卓のためのスイングベースのGUIを書いて、操作+、*のための作業電卓を作成することができましたが、1桁の数字だけでした。以下のコードを見ることができます。

私の質問は、数字の数字が多い方程式と同じGUIを使用するアルゴリズムを知っている人はいますか?

コードを書くことは問題ではありませんが、残念ながら私は有用なものを見つけ出すことができません。

私は創造的な解決策を期待していますし、それだけで基本的な考え方であったとしても、私は喜んでそのさらなる発展に参加するだろう:)

マックス

コード:

Main.java:

public class Main { 

    public static void main(String[] args) { 
     new CalculatorController(); 

    } 
} 

CalculatorController.java:

public class CalculatorController { 

    private CalculatorView view; 
    private NumberAction nmbAction; 
    private OperatorAction opAction; 
    private CalcObject currentValue, savedValue; 

    CalculatorController() { 
     currentValue = new CalcObject(); 
     savedValue = new CalcObject(); 
     nmbAction = new NumberAction(this); 
     opAction = new OperatorAction(this); 
     view = new CalculatorView(this); 
     view.setSize(250, 220); 
     view.setVisible(true); 
    } 

    public void printResult(double result) { 
     view.getCALCULATION().setText(String.valueOf(result)); 
    } 

    public CalculatorView getView() { 
     return view; 
    } 

    public NumberAction getNmbAction() { 
     return nmbAction; 
    } 

    public OperatorAction getOpAction() { 
     return opAction; 
    } 

    public CalcObject getCurrentValue() { 
     return currentValue; 
    } 

    public CalcObject getSavedValue() { 
     return savedValue; 
    } 

    public void setCurrentValue(CalcObject currentValue) { 
     String str = currentValue.getOperator(); 
     this.currentValue.setOperator(str); 
     this.currentValue.setNumber(currentValue.getNumber()); 
    } 

    public void setSavedValue(CalcObject stripeValue) { 
     String str = stripeValue.getOperator(); 
     this.savedValue.setOperator(str); 
     this.savedValue.setNumber(stripeValue.getNumber()); 
    } 
} 

CalculatorView.java:

import javax.swing.*; 
import javax.swing.border.EmptyBorder; 
import java.awt.*; 

public class CalculatorView extends JFrame { 

    private String equation = ""; 
    private CalcObject object = new CalcObject(); 
    private JPanel pane; 
    private JPanel contentPane; 
    private JTextField CALCULATION; 
    private JButton NMB_0; 
    private JButton NMB_1; 
    private JButton NMB_2; 
    private JButton NMB_3; 
    private JButton NMB_4; 
    private JButton NMB_5; 
    private JButton NMB_6; 
    private JButton NMB_7; 
    private JButton NMB_8; 
    private JButton NMB_9; 
    private JButton CALC; 
    private JButton MULTIPLY; 
    private JButton DIVIDE; 
    private JButton ADD; 
    private JButton SUBTRACT; 

    public CalculatorView(CalculatorController controller) { 

     setDefaultCloseOperation(CalculatorView.EXIT_ON_CLOSE); 
     pane = new JPanel(new FlowLayout()); 
     setContentPane(pane); 

     CALCULATION = new JTextField(); 
     CALCULATION.setColumns(16); 
     pane.add(CALCULATION); 

     contentPane = new JPanel(new GridLayout(0, 3)); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     pane.add(contentPane); 

     NMB_1 = new JButton(controller.getNmbAction()); 
     NMB_1.setText("1"); 
     contentPane.add(NMB_1); 

     NMB_2 = new JButton(controller.getNmbAction()); 
     NMB_2.setText("2"); 
     contentPane.add(NMB_2); 

     NMB_3 = new JButton(controller.getNmbAction()); 
     NMB_3.setText("3"); 
     contentPane.add(NMB_3); 

     NMB_4 = new JButton(controller.getNmbAction()); 
     NMB_4.setText("4"); 
     contentPane.add(NMB_4); 

     NMB_5 = new JButton(controller.getNmbAction()); 
     NMB_5.setText("5"); 
     contentPane.add(NMB_5); 

     NMB_6 = new JButton(controller.getNmbAction()); 
     NMB_6.setText("6"); 
     contentPane.add(NMB_6); 

     NMB_7 = new JButton(controller.getNmbAction()); 
     NMB_7.setText("7"); 
     contentPane.add(NMB_7); 

     NMB_8 = new JButton(controller.getNmbAction()); 
     NMB_8.setText("8"); 
     contentPane.add(NMB_8); 

     NMB_9 = new JButton(controller.getNmbAction()); 
     NMB_9.setText("9"); 
     contentPane.add(NMB_9); 

     MULTIPLY = new JButton(controller.getOpAction()); 
     MULTIPLY.setText("*"); 
     contentPane.add(MULTIPLY); 

     NMB_0 = new JButton(controller.getNmbAction()); 
     NMB_0.setText("0"); 
     contentPane.add(NMB_0); 

     DIVIDE = new JButton(controller.getOpAction()); 
     DIVIDE.setText("/"); 
     contentPane.add(DIVIDE); 
     DIVIDE.setEnabled(false); 

     ADD = new JButton(controller.getOpAction()); 
     ADD.setText("+"); 
     contentPane.add(ADD); 

     CALC = new JButton(controller.getOpAction()); 
     CALC.setText("="); 
     contentPane.add(CALC); 

     SUBTRACT = new JButton(controller.getOpAction()); 
     SUBTRACT.setText("-"); 
     contentPane.add(SUBTRACT); 
     SUBTRACT.setEnabled(false); 
    } 

    public String getEquation() { return equation; } 

    public void setEquation(String equation) { this.equation = equation;  } 

    public JTextField getCALCULATION() { 
     return CALCULATION; 
    } 
} 

OperatorAction.java:

import javax.swing.*; 
import java.awt.event.ActionEvent; 

public class OperatorAction extends AbstractAction { 

    private String operator; 
    private CalculatorController controller; 

    OperatorAction(CalculatorController controller) { 
     this.controller = controller; 
     this.operator = ""; 
    } 

    public void actionPerformed(ActionEvent e) { 
     JButton button = (JButton)e.getSource(); 
     this.operator = button.getText(); 
     controller.getView().setEquation(controller.getView().getEquation().concat(this.operator)); 
     controller.getView().getCALCULATION().setText(controller.getView().getEquation()); 

     controller.getCurrentValue().setOperator(operator); 

     if (controller.getCurrentValue().getOperator() == "=") { 
      if (controller.getSavedValue().getOperator() == "+") { 
       controller.printResult(Double.parseDouble(controller.getSavedValue().getNumber()) + Double.parseDouble(controller.getCurrentValue().getNumber())); 
      } else { 
       controller.printResult(Double.parseDouble(controller.getCurrentValue().getNumber())); 
      } 
      controller.getView().setEquation(""); 
      controller.getCurrentValue().setNumber("0"); 
      controller.getSavedValue().setNumber("0"); 
      controller.getCurrentValue().setOperator(""); 
      controller.getSavedValue().setOperator(""); 
     } 
    } 
} 

NumberAction.java:

import javax.swing.*; 
import java.awt.event.ActionEvent; 

public class NumberAction extends AbstractAction { 

    private String number; 
    private CalculatorController controller; 

    NumberAction(CalculatorController controller) { 
     this.controller = controller; 
     this.number = ""; 
    } 

    public void actionPerformed(ActionEvent e) { 
     JButton button = (JButton)e.getSource(); 
     this.number = button.getText(); 
     controller.getView().setEquation(controller.getView().getEquation().concat(this.number)); 
     controller.getView().getCALCULATION().setText(controller.getView().getEquation()); 

     if (controller.getSavedValue().getOperator() == "") { 
      if (controller.getCurrentValue().getOperator() == "") { 
       controller.getCurrentValue().setNumber(number); 
      } 
      if (controller.getCurrentValue().getOperator() == "*") { 
       controller.getCurrentValue().setNumber(String.valueOf(Double.parseDouble( controller.getCurrentValue().getNumber()) * Double.parseDouble(number))); 
       controller.setSavedValue(controller.getCurrentValue()); 
      } 
      if (controller.getCurrentValue().getOperator() == "+") { 
       controller.setSavedValue(controller.getCurrentValue()); 
       controller.getCurrentValue().setNumber(number); 
      } 
     } else { 
      if (controller.getCurrentValue().getOperator() == "*") { 
       controller.getCurrentValue().setNumber(String.valueOf(Double.parseDouble( controller.getCurrentValue().getNumber()) * Double.parseDouble(number))); 
      } 
      if (controller.getCurrentValue().getOperator() == "+") { 
       controller.getCurrentValue().setNumber(String.valueOf(Double.parseDouble(controller.getSavedValue().getNumber()) + Double.parseDouble(controller.getCurrentValue().getNumber()) + Double.parseDouble(number))); 
       controller.getSavedValue().setOperator(""); 
      } 
     } 
    } 
} 

CalcObject.java:

public class CalcObject { 
    private String NUMBER; 
    private String OPERATOR; 

    CalcObject() { 
     NUMBER = "0"; 
     OPERATOR = ""; 
    } 

    CalcObject(String number, String operator) { 
     NUMBER = number; 
     OPERATOR = operator; 
    } 

    public void setNumber(String number) { NUMBER = number; } 

    public void setOperator(String operator) { OPERATOR = operator; } 

    public String getNumber() { return NUMBER; } 

    public String getOperator() { return OPERATOR; } 
} 

もう一度プログラムをチェックしているうちに、この1桁のアルゴリズムのアルゴリズムは正しく動作しませんが、私の質問は変わりません。私はまた、それをより簡単に、よりスムーズに、またはどんなやり方でもより良いものにするために、いくつかの意見やアイデアについて満足しています。

+0

多数字の場合:プログラムの起動時または操作の入力後に現在の数字を空の文字列に設定した場合、数字ボタンをクリックしたときに別の数字を追加すると、選択した数字を現在の数字あなたが計算のために必要とするまでは文字列です)。 – Thomas

+0

Btw、あなたが投稿したコードはあまりにも多すぎるので、その多くは問題に関連していないと言えます。投稿するコードの種類については[ask]と[mcve]に略奪をしてください。 – Thomas

+0

この[計算例](http://stackoverflow.com/a/7441804/418556)も参照してください。 'ScriptEngine'を使ってテキストフィールドの式を評価します。 –

答えて

1

もう1つの提案:ifは、文字列を解析して評価する電卓を作成する方が簡単かもしれません。このon the netにはたくさんの例がありますので、プログラミングのスキルを向上させようと努力しているので、これは面白くて難しいことではありません(複数のパーサーを実装して提供することさえ可能です)。

UIは文字列を作成する簡単な作業を行います。つまり、各ボタンは現在の数式文字列に1文字を追加するだけで、=ボタンはパーサーを実行します。

+0

これは私が探していた解決策の1つですが、Googleに何がわからない場合は、それを見つけるのは簡単ではありません。とにかくおかげで、私はおそらくこの方法で行くでしょう:) – ednhzrd

+0

@ ednhzrdええ、良い検索用語を思い付くことはときどき難しいです。それを実装すること、特にあなたの学習努力に恵まれています。 :) – Thomas

0

複数の数値の場合、ユーザーが数字をクリックするとその数字が文字列に追加されるように文字列を使用する必要があります。 JTextFieldを使用すると、タイプボタンをクリックしてタイプ入力を組み合わせることができます。

単純なケースでは、ユーザーが+ - * /をクリックすると、文字列を数値に変換して「前の値」として保存できます。操作を保存するフィールドも必要です。2番目の操作(または "=")では、以前の値、格納されたoprationおよび現在の値を使用して結果を計算します。

さらに高度なレベルでは、かっこのボタンを追加できます。 1つ前の数字の代わりに、前の数字のスタックを使用して、カッコを入力/終了するときに押してポップすることができます。

専門家レベルでは、パーサーと文法を使用できます。それで、あなたはあなた自身のプログラミング言語を持っています。あなたは多くのことを学び、入力文字列から有効な式を計算することができます。たとえば、hereを参照してください。