java实现计算器

项目1:简单计算器的实现
1、项目概述
本实验主要是Java图形用户界面的编写,重点讲述利用java语言实现一个简单计算器。开发环境用的是idea。

1.1项目目标和主要内容
(1)能通过设计的按钮控件输入并实现简单算术运算,要求表达式在编辑框中显示,能将运算结果,输出在编辑框内显示;
(2)能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确。
(3)并保存历史的表达式运算记录。

1.2项目的主要功能

实现基本的加,减,乘,除,四则运算

最终图形界面:
java实现计算器_第1张图片
2、项目设计

2.1项目总体框架
设计思想:
要实现完整计算式的输入并运算,就得用到计算后缀表达式的算法,和将中缀表达式转换为后缀表达式的算法。

2.2系统详细设计
层次关系:
java实现计算器_第2张图片

2.3关键算法分析
算法1:中缀表达式转后缀表达式
【1】算法功能
计算式要在计算器的文本编辑框中显示,因此计算式用字符串记录。

【2】算法基本思想
规则:从左向右遍历中缀表达式
①:遇到数字字符,直接加入后缀表达式

②:遇到高优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比较。

比较1(栈顶元素也为高优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈。这样的操作使得栈中不会出现连续的高优先级运算符。

比较2(栈顶元素为’('左括号):将当前元素入栈。

比较3(栈顶元素为低优先级运算符):将当前元素入栈。

③:遇到’(‘左括号,将左括号入栈。
④:遇到’)'右括号,将栈顶元素顺序出栈,直到栈顶元素为左括号,此时删去栈顶的左括号。

⑤:遇到低优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比较。

【3】 代码逻辑(可用伪代码描述)
中缀表达式转后缀表达式(算法1)
indexof():String.indexof()方法搜索在该字符串上是否出现了作为参数传递的字符串,若找到字符串,则返回字符串首字母的位置(0代表第一个位置),在下面的代码段中,为了判断字符类型用到了该方法。
String.valueof():将double类型的浮点数转换为字符串
Double.parseDouble():将字符串转化为double类型的浮点数

代码块:
//中缀表达式转后缀表达式
private String[] yunsuan(String str)
{
String s="";
char a[]=new char[100];
String jieguo[]=new String[100];
int top=-1,j=0;
for (int i=0;i {
if (“0123456789.”.indexOf(str.charAt(i))>=0)
{
s="";
for (;i=0;i++)
{
s=s+str.charAt(i);
}
i–;
jieguo[j]=s;
j++;
}
else if ("(".indexOf(str.charAt(i))>=0)
{
top++;
a[top]=str.charAt(i);
}
else if (")".indexOf(str.charAt(i))>=0)
{
for (;
{
if (a[top]!=’(’)
{
jieguo[j]=a[top]+"";
j++;
top–;
}
else
{
top–;
break;
}
}
}
else if ("*÷".indexOf(str.charAt(i))>=0)
{
if (top==-1)
{
top++;
a[top]=str.charAt(i);
}
else
{
if ("*÷".indexOf(a[top])>=0)
{
jieguo[j]=a[top]+"";
j++;
a[top]=str.charAt(i);
}
else if ("(".indexOf(a[top])>=0)
{
top++;
a[top]=str.charAt(i);
}
else if (“±”.indexOf(a[top])>=0)
{
top++;
a[top]=str.charAt(i);
}
}
}
else if (“±”.indexOf(str.charAt(i))>=0)
{
if (top==-1)
{
top++;
a[top]=str.charAt(i);
}
else
{
if ("*÷".indexOf(a[top])>=0)
{
jieguo[j]=a[top]+"";
j++;
a[top]=str.charAt(i);
}
else if ("(".indexOf(a[top])>=0)
{
top++;
a[top]=str.charAt(i);
}
else if (“±”.indexOf(a[top])>=0)
{
jieguo[j]=a[top]+"";
j++;
a[top]=str.charAt(i);
}
}
}
}
for (;top!=-1;)
{
jieguo[j]=a[top]+"";
j++;
top–;
}
return jieguo;
}

计算后缀表达式(算法2)

计算后缀表达式依然借助栈来实现

运算规则:遍历后缀表达式
①:遇到数字字符,直接入栈。

②:遇到运算符,顺序出栈两个元素(数字),进行运算,将运算结果入栈循环以上步骤最终栈中剩下的那个数字就是最终答案。

代码块:
//后缀表达式计算
public String Result(String str[])
{
String Result[]=new String[100];
int Top=-1;
for (int i=0;str[i]!=null;i++)
{
if (“±÷”.indexOf(str[i])<0)
{
Top++;
Result[Top]=str[i];
}
if (“±÷”.indexOf(str[i])>=0)
{
double x,y,n;
x=Double.parseDouble(Result[Top]);
Top–;
y=Double.parseDouble(Result[Top]);
Top–;
if ("-".indexOf(str[i])>=0)
{
n=y-x;
Top++;
Result[Top]=String.valueOf(n);
}
if ("+".indexOf(str[i])>=0)
{
n=y+x;
Top++;
Result[Top]=String.valueOf(n);
}
if ("".indexOf(str[i])>=0)
{
n=y
x;
Top++;
Result[Top]=String.valueOf(n);
}
if (“÷”.indexOf(str[i])>=0)
{
if (x==0)
{
String s=“ERROR”;
return s;
}
else
{
n=y/x;
Top++;
Result[Top]=String.valueOf(n);
}
}

    }
}
return Result[Top];

}

2.4 其他
本实验是基于Swing组建的图形用户界面,采用JFrame框架作为主窗口类名Calculator(计算器),继承JFrame框架,实现事件监听器接口。

计算器类中,定义的成员有:
(1)private String[] KEYS={“7”,“8”,“9”,"+",“4”,“5”,“6”,"-",“1”,“2”,“3”,"*",“0”,“π”,“c”,“÷”,
“(”,")",".","=",}; //按钮标签字符串
(2)private JButton keys[]=new JButton[KEYS.length];//定义按钮数组
(3)private JTextField resultText = new JTextField(“0.0”);//定义文本行
(4)private String b="";//用于存放计算式

所有代码:
import javax.swing.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator extends JFrame implements ActionListener
{
private String[] KEYS={“7”,“8”,“9”,"+",“4”,“5”,“6”,"-",“1”,“2”,“3”,"
",“0”,“π”,“c”,“÷”,
“(”,")",".","=",};
private JButton keys[]=new JButton[KEYS.length];
private JTextField resultText = new JTextField(“0.0”);
private String b="";
public Calculator()
{
super(“计算器”);
this.setLayout(null);
resultText.setBounds(20, 5, 255, 40);
resultText.setHorizontalAlignment(JTextField.RIGHT);
resultText.setEditable(false);
this.add(resultText);
int x=20,y=55;
for (int i=0;i {
keys[i] = new JButton();
keys[i].setText(KEYS[i]);
keys[i].setBounds(x, y, 60, 40);
if(x<215)
{
x+=65;
}
else
{
x = 20;
y+=45;
}
this.add(keys[i]);
}
for (int i = 0; i {
keys[i].addActionListener(this);
}
this.setResizable(false);
this.setBounds(500, 200, 300, 400);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}

//事件处理
public void actionPerformed(ActionEvent e)
{
    String label = e.getActionCommand();
    if (label=="c"||label=="=")
    {
        if(label=="=")
        {
            String s[]=yunsuan(this.b);
            String result=Result(s);
            this.b=result+"";
            resultText.setText(this.b);
        }
        else
        {
            this.b="";
            resultText.setText("0");
        }
    }

    else if(label=="π") {

        if (label == "π") {
            String m = String.valueOf(3.14159265);
            this.b = this.b + m;
            resultText.setText(this.b);
        }
    }
    else
    {
        this.b=this.b+label;
        resultText.setText(this.b);
    }
}

//中缀表达式转后缀表达式
private String[] yunsuan(String str)
{
    String s="";
    char a[]=new char[100];
    String jieguo[]=new String[100];
    int top=-1,j=0;
    for (int i=0;i=0)
        {
            s="";
            for (;i=0;i++)
            {
                s=s+str.charAt(i);
            }
            i--;
            jieguo[j]=s;
            j++;
        }
        else if ("(".indexOf(str.charAt(i))>=0)
        {
            top++;
            a[top]=str.charAt(i);
        }
        else if (")".indexOf(str.charAt(i))>=0)
        {
            for (;;)
            {
                if (a[top]!='(')
                {
                    jieguo[j]=a[top]+"";
                    j++;
                    top--;
                }
                else
                {
                    top--;
                    break;
                }
            }
        }
        else if ("*÷".indexOf(str.charAt(i))>=0)
        {
            if (top==-1)
            {
                top++;
                a[top]=str.charAt(i);
            }
            else
            {
                if ("*÷".indexOf(a[top])>=0)
                {
                    jieguo[j]=a[top]+"";
                    j++;
                    a[top]=str.charAt(i);
                }
                else if ("(".indexOf(a[top])>=0)
                {
                    top++;
                    a[top]=str.charAt(i);
                }
                else if ("+-".indexOf(a[top])>=0)
                {
                    top++;
                    a[top]=str.charAt(i);
                }
            }
        }
        else if ("+-".indexOf(str.charAt(i))>=0)
        {
            if (top==-1)
            {
                top++;
                a[top]=str.charAt(i);
            }
            else
            {
                if ("*÷".indexOf(a[top])>=0)
                {
                    jieguo[j]=a[top]+"";
                    j++;
                    a[top]=str.charAt(i);
                }
                else if ("(".indexOf(a[top])>=0)
                {
                    top++;
                    a[top]=str.charAt(i);
                }
                else if ("+-".indexOf(a[top])>=0)
                {
                    jieguo[j]=a[top]+"";
                    j++;
                    a[top]=str.charAt(i);
                }
            }
        }
    }
    for (;top!=-1;)
    {
        jieguo[j]=a[top]+"";
        j++;
        top--;
    }
    return jieguo;
}


//后缀表达式计算
public String Result(String str[])
{
    String Result[]=new String[100];
    int Top=-1;
    for (int i=0;str[i]!=null;i++)
    {
        if ("+-*÷".indexOf(str[i])<0)
        {
            Top++;
            Result[Top]=str[i];
        }
        if ("+-*÷".indexOf(str[i])>=0)
        {
            double x,y,n;
            x=Double.parseDouble(Result[Top]);
            Top--;
            y=Double.parseDouble(Result[Top]);
            Top--;
            if ("-".indexOf(str[i])>=0)
            {
                n=y-x;
                Top++;
                Result[Top]=String.valueOf(n);
            }
            if ("+".indexOf(str[i])>=0)
            {
                n=y+x;
                Top++;
                Result[Top]=String.valueOf(n);
            }
            if ("*".indexOf(str[i])>=0)
            {
                n=y*x;
                Top++;
                Result[Top]=String.valueOf(n);
            }
            if ("÷".indexOf(str[i])>=0)
            {
                if (x==0)
                {
                    String s="ERROR";
                    return s;
                }
                else
                {
                    n=y/x;
                    Top++;
                    Result[Top]=String.valueOf(n);
                }
            }

        }
    }
    return Result[Top];
}

//主函数实现
public static void main(String arg[])
{
    Calculator a=new Calculator();
}

}

你可能感兴趣的:(java实现计算器,java,算法,字符串)