//java的人机界面计算器也做出来了,根据上次写的C++的计算器改的,超级有成就感,所以要记录一下,防止丢失,代码乱是乱了点,因为我把他们全部通通写进了main方法里面,省的函数调用来调用去的。不过能运行出来就是好的,嘿嘿,唯一美中不足的就是计算负数要加括号,这就很难受了
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class 人机界面计算器{
public static void main(String [] args) {
JFrame frm = new JFrame("计算器");
JTextArea text = new JTextArea();
text.setEditable(true);
text.setBackground(Color.WHITE);
frm.setLayout(null);
frm.setBounds(800, 200, 460, 560);
frm.setVisible(true);
JButton btn0=new JButton("1");
JButton btn1=new JButton("2");
JButton btn2=new JButton("3");
JButton btn3=new JButton("4");
JButton btn4=new JButton("5");
JButton btn5=new JButton("6");
JButton btn6=new JButton("7");
JButton btn7=new JButton("8");
JButton btn8=new JButton("9");
JButton btn9=new JButton("0");
JButton btn10=new JButton(".");
JButton btn11=new JButton("^");
JButton btn12=new JButton("sin");
JButton btn13=new JButton("cos");
JButton btn14=new JButton("tan");
JButton btn15=new JButton("log");
JButton btn16=new JButton("+");
JButton btn17=new JButton("-");
JButton btn18=new JButton("×");
JButton btn19=new JButton("÷");
JButton btn20=new JButton("(");
JButton btn21=new JButton(")");
JButton btn22=new JButton("=");
frm.add(text);
frm.add(btn0);
frm.add(btn1);
frm.add(btn2);
frm.add(btn3);
frm.add(btn4);
frm.add(btn5);
frm.add(btn6);
frm.add(btn7);
frm.add(btn8);
frm.add(btn9);
frm.add(btn10);
frm.add(btn11);
frm.add(btn12);
frm.add(btn13);
frm.add(btn14);
frm.add(btn15);
frm.add(btn16);
frm.add(btn17);
frm.add(btn18);
frm.add(btn19);
frm.add(btn20);
frm.add(btn21);
frm.add(btn22);
text.setBounds(50, 10, 340, 50);
Font f = new Font("黑体", Font.BOLD,40);
text.setFont(new Font("黑体",Font.BOLD,22));
text.setEditable(false);
text.setLineWrap(true);
text.setWrapStyleWord(true);
btn0.setBounds(50, 70, 60, 50);
btn0.setFont(f);
btn0.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("1");
}
});
btn1.setBounds(130, 70, 60, 50);
btn1.setFont(f);
btn1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("2");
}
});
btn2.setBounds(210, 70, 60, 50);
btn2.setFont(f);
btn2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("3");
}
});
btn3.setBounds(50, 140, 60, 50);
btn3.setFont(f);
btn3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("4");
}
});
btn4.setBounds(130, 140, 60, 50);
btn4.setFont(f);
btn4.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("5");
}
});
btn5.setBounds(210, 140, 60, 50);
btn5.setFont(f);
btn5.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("6");
}
});
btn6.setBounds(50, 210, 60, 50);
btn6.setFont(f);
btn6.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("7");
}
});
btn7.setBounds(130, 210, 60, 50);
btn7.setFont(f);
btn7.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("8");
}
});
btn8.setBounds(210, 210, 60, 50);
btn8.setFont(f);
btn8.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("9");
}
});
btn9.setBounds(130, 280, 60, 50);
btn9.setFont(f);
btn9.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("0");
}
});
btn10.setBounds(50, 280, 60, 50);
btn10.setFont(f);
btn10.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append(".");
}
});
btn11.setBounds(210, 280, 60, 50);
btn11.setFont(f);
btn11.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("^");
}
});
btn12.setBounds(50, 350, 100, 50);
btn12.setFont(f);
btn12.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("sin(");
}
});
btn13.setBounds(170, 350, 100, 50);
btn13.setFont(f);
btn13.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("cos(");
}
});
btn14.setBounds(50, 420, 100, 50);
btn14.setFont(f);
btn14.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("tan(");
}
});
btn15.setBounds(170, 420, 100, 50);
btn15.setFont(f);
btn15.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("log");
}
});
btn16.setBounds(290, 70, 100, 50);
btn16.setFont(f);
btn16.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("+");
}
});
btn17.setBounds(290, 140, 100, 50);
btn17.setFont(f);
btn17.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("-");
}
});
btn18.setBounds(290, 210, 100, 50);
btn18.setFont(f);
btn18.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("×");
}
});
btn19.setBounds(290, 280, 100, 50);
btn19.setFont(f);
btn19.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("÷");
}
});
btn20.setBounds(290, 350, 45, 50);
btn20.setFont(new Font("黑体",Font.BOLD,20));
btn20.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append("(");
}
});
btn21.setBounds(345, 350, 45, 50);
btn21.setFont(new Font("黑体",Font.BOLD,20));
btn21.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
text.append(")");
}
});
btn22.setBounds(290, 420, 50, 50);
btn22.setFont(new Font("黑体",Font.BOLD,25));
btn22.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
int Maxsize = 100;//定义数组大小
char[] optr=new char[Maxsize];//定义optr数组,用来存放后缀表达式
Stack<Character> Optr = new Stack<Character>();//产生栈对象Optr,用来存放运算符
String a = null;
a=text.getText().toString();
String m = "("+a+")";
char[] measure=m.toCharArray();//转换输入的字符串为数组
int j = 0;
int i = 0;
//中缀表达式转后缀表达式
while(i<measure.length) {
switch(measure[i]) {
case '(':
Optr.push(measure[i]);
i++;
break;
case ')':
while(Optr.peek()!='(') {
optr[j++]=Optr.peek();
Optr.pop();
}
Optr.pop();
i++;
break;
case '+':
while(!Optr.isEmpty()) {
if(Optr.peek()!='(') {
optr[j++]=Optr.peek();
Optr.pop();
}
else
break;
}
Optr.push(measure[i]);
i++;
break;
case '-':
if(measure[i-1]<'0'||measure[i-1]>'9') {//表示-前面不是数字,即此处-表示单目运算符
while(!Optr.isEmpty()) {
if(Optr.peek()=='*'||Optr.peek()=='/') {
optr[j++]=Optr.peek();
Optr.pop();
}
else break;
}
Optr.push('~');
i++;
break;
}
else {
while(!Optr.isEmpty()) {
if(Optr.peek()!='(') {
optr[j++]=Optr.peek();
Optr.pop();
}
else
break;
}
Optr.push(measure[i]);
i++;
break;}
case 'l':
while(!Optr.isEmpty()) {
if(Optr.peek()=='l') {
optr[j++]=Optr.peek();
Optr.pop();
}
else break;
}
Optr.push(measure[i]);
i+=3;
break;
case 'c':
while(!Optr.isEmpty()) {
if(Optr.peek()=='c') {
optr[j++]=Optr.peek();
Optr.pop();
}
else break;
}
Optr.push(measure[i]);
i+=3;
break;
case 's':
while(!Optr.isEmpty()) {
if(Optr.peek()=='s') {
optr[j++]=Optr.peek();
Optr.pop();
}
else break;
}
Optr.push(measure[i]);
i+=3;
break;
case 't':
while(!Optr.isEmpty()) {
if(Optr.peek()=='t') {
optr[j++]=Optr.peek();
Optr.pop();
}
else break;
}
Optr.push(measure[i]);
i+=3;
break;
case '^':
while(!Optr.isEmpty()) {
if(Optr.peek()=='^') {
optr[j++]=Optr.peek();
Optr.pop();
}
else break;
}
Optr.push(measure[i]);
i++;
break;
case '×':
case '÷':
while(!Optr.isEmpty()) {
if(Optr.peek()=='×'||Optr.peek()=='÷') {
optr[j++]=Optr.peek();
Optr.pop();
}
else break;
}
Optr.push(measure[i]);
i++;
break;
default:
while(measure[i]>='0'&&measure[i]<='9'||measure[i]=='.') {
optr[j++]=measure[i];
i++;
}
optr[j++]='#';
break;
}
}
while(!Optr.isEmpty()) {
optr[i++]=Optr.peek();
Optr.pop();
}
//后缀表达式求值
int q=1;
Stack<Double> Opnd = new Stack<Double>();//存放操作数
int n = 0;
int w;
double a1,b,c = 0;
while(optr[n]!='\0') {
switch(optr[n]) {
case '+':
a1=Opnd.peek();
Opnd.pop();
b=Opnd.peek();
Opnd.pop();
c=b+a1;
Opnd.push(c);
break;
case '-':
a1=Opnd.peek();
Opnd.pop();
b=Opnd.peek();
Opnd.pop();
c=b-a1;
Opnd.push(c);
break;
case '×':
a1=Opnd.peek();
Opnd.pop();
b=Opnd.peek();
Opnd.pop();
c=b*a1;
Opnd.push(c);
break;
case '÷':
a1=Opnd.peek();
Opnd.pop();
b=Opnd.peek();
Opnd.pop();
if(a1!=0) {
c=b/a1;
Opnd.push(c);
break;
}
else {
text.setFont(new Font("黑体",Font.BOLD,40));
text.setText("除零错误");}
case 'l':
a1=Opnd.peek();
Opnd.pop();
b=Opnd.peek();
Opnd.pop();
c=Math.log10(b)/Math.log10(a1);
Opnd.push(c);
break;
case '^':
a1=Opnd.peek();
Opnd.pop();
b=Opnd.peek();
Opnd.pop();
c=Math.pow(b, a1);
Opnd.push(c);
break;
case 'c':
a1=Opnd.peek();
Opnd.pop();
c=Math.cos(a1);
Opnd.push(c);
break;
case 's':
a1=Opnd.peek();
Opnd.pop();
c=Math.sin(a1);
Opnd.push(c);
break;
case 't':
a1=Opnd.peek();
Opnd.pop();
c=Math.tan(a1);
Opnd.push(c);
break;
case '~':
a1=-Opnd.peek();
Opnd.pop();
Opnd.push(a1);
break;
default :
double d = 0;
w=0;
while(optr[n]>='0'&&optr[n]<='9'||optr[n]=='.') {
d=10*d+optr[n]-'0';
n++;
//对小数点的处理
if(optr[n]=='.') {
q=-1;
n++;
w=0;
}
w++;
}
d=d/Math.pow(10,w-1);
if(q!=-1) {
d=d*Math.pow(10, w-1);
}
q=1;
Opnd.push(d);
break;
}
n++;
}
text.setFont(new Font("黑体",Font.BOLD,40));
if(Opnd.peek()%(int)c==0)text.setText("="+(int)c);
if((Opnd.peek()%(int)c)!=0)text.setText("="+Opnd.peek());
}
});
JButton btn23 = new JButton("C");
frm.add(btn23);
btn23.setBounds(350, 420, 40, 50);
btn23.setFont(new Font("黑体",Font.BOLD,10));
btn23.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
text.setFont(new Font("黑体",Font.BOLD,22));
text.setText(null);
}
});
}
}
//顺便附上超有成就感的运行结果,因为定义的是double类型,所以结果可想而知,就是后面跟了一连串0,哈哈