java老师布置的作业,要我们编个计算器,而且要有括号功能。。。编的恶心哪,600多行代码,调试来调试去终于能用了,但是估计还有bug。
有一个bug我自己知道,但是不影响正常使用:可以存在前导零,就是说可以有0087这种数字,计算器会认为这就是87,。
下面是两个截图,左边是输入,右边是输出。
这个计算器的核心算法就是对左边的字符串进行处理,得出右边的结果,其中要考虑到括号匹配、负号、乘除优先级等等问题,这一个算法写了200行。
因为字符串比较短,最多就几十,所以我的算法比较暴力,没有考虑时间和空间复杂度,大量地对字符串进行遍历(不符合我这样一个ACMer严谨治学的精神啊。。。其实是因为有点懒)。
除此之外,计算器还能自动识别输入内容的合法性,如果不合法,你是输入不进去某些符号的
for example:如果你已经输入了8+9,此时你再按’)‘或者’(‘,计算器会没反应,你只有再写个’+‘或者把’9‘去掉才能输入’(‘。这个功能我是在输入的时候把每个位置的东西记录在了一个F[][]二维数组里,每次输入一个键,判断一下。
另比如你当前的式子不构成一个完整的表达式,按回车或者’=‘是无效的,你可以按’Backspace‘回去一点点修改,但是不支持跳着改,只能改上一个(本人能力和精力实在有限,要是加上跳着改,还要把左右箭头加进去,太麻烦)。
这个计算器支持鼠标点按钮和键盘输入,按’=‘或者’回车‘可以出结果,按’c‘可以清零。
还有一个让我要抓狂的事情!!!!因为是初学者,不咋会java,一开始还不知道字符串和double之间相互转化的算法系统早就给弄好了,我还自己编了change_to_double()和change_to_string()两个函数,写了几百行代码,调试这俩函数调了半天也没弄好,然后我知道可以用系统现成的函数的时候,简直要崩溃。。。
下面是double和string互相转化的实现方式。
string转double:
double a;
string ls="1.23"
a=Double.parseDouble(ls);
然后a就变成了double型的1.23。
double转string:两种方法(不知道区别是啥,都能用把)
方法1:直接在s后面+a(我觉得这个写起来简单)
String s="";
double a=1.23
s=s+a;
方法2:用String.valueOf(double);
String s="";
double a=1.23;
s==s.valueOf(a);
下面是我实现的代码。有些地方有注释。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator extends JFrame {
static char A[]={'0','1','2','3','4','5','6','7','8','9'};
// static double k[]={0.1,0.001,0.0001,0.00001,0.000001,0.0000001};//什么破java软件,这个东西放到别的地方都报错
private JTextField textField1;
private JButton b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,
BACK,C,jia,jian,cheng,chu,deng,dian,zuok,youk;
public Calculator(){
super("计算器");
Container container=getContentPane();
// container.setLayout(new FlowLayout());
container.setLayout(null);
//文本框
textField1=new JTextField("");
textField1=new JTextField(35);
textField1.setBounds(20, 20, 290, 30);
container.add(textField1);
//各种按钮
BACK=new JButton("Backspace");
BACK.setBounds(20, 60, 110, 40);
container.add(BACK);
C=new JButton("C");
C.setBounds(140, 60, 50, 40);
container.add(C);
zuok=new JButton("(");
zuok.setBounds(200, 60, 50, 40);
container.add(zuok);
youk=new JButton(")");
youk.setBounds(260, 60, 50, 40);
container.add(youk);
jia=new JButton("+");
jia.setBounds(200, 110, 50, 40);
container.add(jia);
jian=new JButton("-");
jian.setBounds(260, 110, 50, 40);
container.add(jian);
cheng=new JButton("*");
cheng.setBounds(200, 160, 50, 40);
container.add(cheng);
chu=new JButton("/");
chu.setBounds(260, 160, 50, 40);
container.add(chu);
dian=new JButton(".");
dian.setBounds(140, 260, 50, 40);
container.add(dian);
deng=new JButton("=");
deng.setBounds(200, 210, 110, 90);
container.add(deng);
b0=new JButton("0");
b0.setBounds(20, 260, 110, 40);
container.add(b0);
b1=new JButton("1");
b1.setBounds(20, 210, 50, 40);
container.add(b1);
b2=new JButton("