JavaGUI科学计算器
我正在尝试用Java编写一个科学计算器。然而,我很难真正让程序进行计算。您可以在下面的代码中看到,我已经设法让GUI使用GUI上打印的数字。我还向“+”按钮添加了功能,以便首先测试它,看看程序是否工作JavaGUI科学计算器,java,calculator,Java,Calculator,我正在尝试用Java编写一个科学计算器。然而,我很难真正让程序进行计算。您可以在下面的代码中看到,我已经设法让GUI使用GUI上打印的数字。我还向“+”按钮添加了功能,以便首先测试它,看看程序是否工作 public class Gui extends JFrame { private static JButton [] button = new JButton[36]; private static TextField tf; private JPanel panel;
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);
}
公共类Gui扩展JFrame{
私有静态JButton[]按钮=新JButton[36];
私有静态文本字段tf;
私人JPanel小组;
私人JPanel小组1;
公共图形用户界面(){
超级(“科学计算器”);
panel=新的JPanel();
panel1=新JPanel(新网格布局(0,4));
tf=新文本字段(20);
tf.setEditable(false);
小组委员会.增补(tf);
按钮[0]=新的JButton(“Rad/Deg”);
按钮[1]=新的JButton(“x!”);
按钮[2]=新的JButton(“sqrt”);
按钮[3]=新的JButton(“sin”);
按钮[4]=新的JButton(“cos”);
按钮[5]=新的按钮(“棕色”);
按钮[6]=新的JButton(“ln”);
按钮[7]=新的JButton(“日志”);
按钮[8]=新的JButton(“1/x”);
按钮[9]=新的JButton(“e^x”);
按钮[10]=新的JButton(“x^2”);
按钮[11]=新的JButton(“y^x”);
按钮[12]=新的JButton(“| x |”);
按钮[13]=新的JButton(“pi”);
按钮[14]=新的JButton(“e”);
按钮[15]=新的JButton(“C”);
按钮[16]=新的JButton(“”);
按钮[17]=新的JButton(“”);
按钮[18]=新的JButton(“%”);
按钮[19]=新的JButton(“/”);
按钮[20]=新的JButton(“7”);
按钮[21]=新的JButton(“8”);
按钮[22]=新的JButton(“9”);
按钮[23]=新的JButton(“*”);
按钮[24]=新的JButton(“4”);
按钮[25]=新的JButton(“5”);
按钮[26]=新的JButton(“6”);
按钮[27]=新的JButton(“-”);
按钮[28]=新的JButton(“1”);
按钮[29]=新的JButton(“2”);
按钮[30]=新的JButton(“3”);
按钮[31]=新的JButton(“+”);
按钮[32]=新的JButton(“.”);
按钮[33]=新的JButton(“0”);
按钮[34]=新的JButton(“+/-”);
按钮[35]=新的JButton(“=”);
对于(int i=0;i为什么不将值存储到字符串中(更易于操作),然后稍后将其解析为算术表达式?例如
人员按下按钮“(”、“sin(8)”、“+”、“8”、“”、“+”、“1”、“=”
这很快计算为一个简单的字符串(sin(8)+8)+1=
您可以解析字符串并查找需要解析的明显内容(例如,查找sin,然后递归解析括号之间的所有内容)。使用数学函数计算复杂表达式,并解析简单表达式
我可能会建议您编写自己的函数来解决复杂的表达式-类似于此
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));
}
}
尝试在按下按钮后立即生成运算符树。在按下更多按钮时继续更新该树。解析整个方程式字符串可能是一项困难的任务
用户按Enter键后,解算运算符树。这有很多好处。
1) 您不必一次解析一个操作数/运算符。
2) 正确的顺序树遍历将考虑BODMAS规则和其他数学运算符的本质。
3) 顺序遍历将为您提供用户键入的原始方程式,您可以将其显示出来。首先创建数组是double[]arr=new double[10]
为什么要将i设置为double,如果使用它时总是将其转换为int?只要在for循环中将其声明为int即可。我知道这是一个愚蠢的错误,我一分钟前就注意到了。将立即进行更改不要尝试一次做这么多。我将从一个最简单的加法、减法、乘法、除法计算器开始,然后添加额外的专长在以前的工作中,按钮[22]很难编码和维护。我会将按钮作为具有智能名称的单个实例变量保存。--此外,询问具体困难可能比“我正在尝试构建这个,请帮助我”更有效。
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);
}
}
}
}
}
}
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);
}
}
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));
}
}