📄 a5i13w.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
public class A5i13w extends Frame implements ActionListener{
private Label Labelshow=new Label("显示区:");
private Label Labelsay=new Label("状态:",Label.CENTER);
private Label Labelnow=new Label("欢迎使用我,艾全通为你带来的科学计算器",Label.LEFT);
private Label Labeltime=new Label("暂且为空");
private TextField Textshow=new TextField(40);
private Panel pan1=new Panel();
private Panel pan2=new Panel();
private Panel pan3=new Panel();
private Button button1=new Button("1");
private Button button2=new Button("2");
private Button button3=new Button("3");
private Button button4=new Button("4");
private Button button5=new Button("5");
private Button button6=new Button("6");
private Button button7=new Button("7");
private Button button8=new Button("8");
private Button button9=new Button("9");
private Button button10=new Button("0");
private Button button11=new Button("+");
private Button button12=new Button("-");
private Button button13=new Button("× ");
private Button button14=new Button("÷");
private Button button15=new Button("%");
private Button button16=new Button("(");
private Button button17=new Button(")");
private Button button18=new Button("清零");
private Button button19=new Button(".");
private Button button20=new Button("=");
private Font wordFont1 =new Font("TimesRoman",Font.BOLD,13);
private Font wordFont2 =new Font("TimesRoman",Font.BOLD,30);
private int i;
public A5i13w(){
super("我的科学计算器");
setup();
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
button6.addActionListener(this);
button7.addActionListener(this);
button8.addActionListener(this);
button9.addActionListener(this);
button10.addActionListener(this);
button11.addActionListener(this);
button12.addActionListener(this);
button13.addActionListener(this);
button14.addActionListener(this);
button15.addActionListener(this);
button16.addActionListener(this);
button17.addActionListener(this);
button18.addActionListener(this);
button19.addActionListener(this);
button20.addActionListener(this);
addWindowListener(new windowcloser());
setResizable(false);
pack();
setVisible(true);
}
public void setup(){
pan1.setLayout(new BorderLayout());
Labelshow.setFont(wordFont1);
pan1.add("West",Labelshow);
Textshow.setFont(wordFont1);
pan1.add("Center",Textshow);
pan2.setLayout(new GridLayout(4,5,5,6));
button1.setFont(wordFont2);pan2.add(button1);
button2.setFont(wordFont2);pan2.add(button2);
button3.setFont(wordFont2);pan2.add(button3);
button4.setFont(wordFont2);pan2.add(button4);
button5.setFont(wordFont2);pan2.add(button5);
button6.setFont(wordFont2);pan2.add(button6);
button7.setFont(wordFont2);pan2.add(button7);
button8.setFont(wordFont2);pan2.add(button8);
button9.setFont(wordFont2);pan2.add(button9);
button10.setFont(wordFont2);pan2.add(button10);
button11.setFont(wordFont2);pan2.add(button11);
button12.setFont(wordFont2);pan2.add(button12);
button13.setFont(wordFont2);pan2.add(button13);
button14.setFont(wordFont2);pan2.add(button14);
button15.setFont(wordFont2);pan2.add(button15);
button16.setFont(wordFont2);pan2.add(button16);
button17.setFont(wordFont2);pan2.add(button17);
button18.setFont(wordFont2);pan2.add(button18);
button19.setFont(wordFont2);pan2.add(button19);
button20.setFont(wordFont2);pan2.add(button20);
pan3.setLayout(new FlowLayout(FlowLayout.CENTER,2,2));
Labelsay.setFont(wordFont1);
Labelsay.setBackground(Color.blue);
pan3.add(Labelsay);
Labelnow.setFont(wordFont1);
Labelnow.setBackground(Color.gray);
pan3.add(Labelnow);
Labeltime.setBackground(Color.gray);
Labeltime.setFont(wordFont1);
pan3.add(Labeltime);
setLayout(new BorderLayout());
add("North",pan1);
add("Center",pan2);
add("South",pan3);
}
public class windowcloser extends WindowAdapter{
public void windowClosing(WindowEvent w){
System.exit(0);
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==button18)
{ Textshow.setEditable(true);
Textshow.setText("");
Labelnow.setBackground(Color.green);
Labelnow.setText("请按标准的数学形式输入数字!");
}
else
{
if(e.getSource()==button20)
{ String QU=new String(Textshow.getText());
System.out.println();System.out.println();
System.out.println("即将计算的表达式是:"+QU);
Labelnow.setBackground(Color.yellow);
Labelnow.setText("计算程序正在运行");
appendchar( button20.getLabel());
appendchar(countall(QU));
Textshow.setEditable(false);
}
else
{ appendchar(e.getActionCommand()); }
}
}
public void appendchar(String aa){
StringBuffer tt=new StringBuffer(Textshow.getText().trim());
tt.append(aa);
Textshow.setText(new String(tt));
}
public String countall(String tt)
{
StringBuffer mm=new StringBuffer(tt);
boolean errorstop=true;
int i,j,m=0,n=0;
for( ;m!=-1; )
{ m=-1; n=-2;
for(i=0; i<mm.length(); i++)
if(mm.charAt(i)=='(') { m=i; System.out.println("在"+m+"处找到'('"); }
for(n=-1,j=m+1;j<mm.length();j++)
if(mm.charAt(j)==')') { n=j; System.out.println("在"+n+"处找到')'"); break;}
if(m<0&&n<0) break;
else
{ if(m*n<0||m>=n-1||m>0&&Iscountnum(mm.charAt(m-1))==0||n<mm.length()-1&&Iscountnum(mm.charAt(n+1))==0)
{ Labelnow.setBackground(Color.red);
Labelnow.setText("小括号语法错误,请纠正!");
System.out.println("发生小括号语法错误。");
System.out.println(mm);
mm.setLength(0);
errorstop=false;
break;
}
else
{ System.out.println("正在计算括号内的数据!"+mm.substring(m+1,n));
mm.replace(m,n+1,counting(mm.substring(m+1,n)));
System.out.println("经过括号计算后的字符串的值是:"+ mm);
}
}
}
if(errorstop)
{
System.out.println("正在进行无括号计算!");
mm.replace(0,mm.length(),counting(mm.substring(0,mm.length())));
System.out.println("最终的结果为:"+mm);
}
return(mm.toString());
}
public String counting(String qq)
{
StringBuffer nn=new StringBuffer(qq);
Double numgroup[]=new Double[20];
numgroup[0]=Double.MIN_VALUE;
StringBuffer result=new StringBuffer(Double.toString(numgroup[0]));
Boolean cancounting0=true;
Boolean cancounting1=true;
Boolean cancounting2=true;
Boolean cancounting3=true;
Character countnum[]=new Character[20];
int i,j,t=0;
if(Iscountnum(nn.charAt(0))>2&&Iscountnum(nn.charAt(0))<7||Iscountnum(nn.charAt(nn.length()-1))<7&&Iscountnum(nn.charAt(nn.length()-1))>0)
{ cancounting0=false;
System.out.println("此部分的数据有问题 "+nn+"不可以进行计算啊");
Labelnow.setBackground(Color.red);
Labelnow.setText("请纠正数据后再按=键进行计算1");}
if(cancounting0)
{
for(j=2;j<nn.length();j++)
{ if(Iscountnum(nn.charAt(j-2))!=0&&Iscountnum(nn.charAt(j-1))!=0&&Iscountnum(nn.charAt(j))!=0)
{ cancounting1=false;
System.out.println(nn);
Labelnow.setBackground(Color.red);
Labelnow.setText("请纠正数据运算符号后再按=键进行计算2"); }
}
for(i=0,j=1;j<nn.length();j++)
{
if(0<Iscountnum(nn.charAt(j-1))&&Iscountnum(nn.charAt(j-1))<6&&Iscountnum(nn.charAt(j))==0)
{ i=j;
System.out.println(i);}
if(nn.charAt(j)=='.'&&Iscountnum(nn.charAt(j-1))!=0||nn.charAt(j-1)=='.'&&Iscountnum(nn.charAt(j))!=0)
{ cancounting2=false;
System.out.println("此部分的数据小数有问题 "+nn+" 不可以进行计算啊");
Labelnow.setBackground(Color.red);
Labelnow.setText("请纠正数据小数的格式后再按=键进行计算3");
break; }
if(0<Iscountnum(nn.charAt(j-1))&&Iscountnum(nn.charAt(j-1))<6&&Iscountnum(nn.charAt(j))==1)
{ nn.deleteCharAt(j);
System.out.println("检验数学符号没有问题");
j=0; }
else if(2<Iscountnum(nn.charAt(j-1))&&Iscountnum(nn.charAt(j-1))<6&&Iscountnum(nn.charAt(j))==2)
{ nn.deleteCharAt(j);
nn.insert(i,new Character('-'));
System.out.println(nn);
j=0; }
else if(Iscountnum(nn.charAt(j-1))==1&&Iscountnum(nn.charAt(j))==2)
{ nn.deleteCharAt(j-1);
System.out.println(nn);
j=0;}
else if(Iscountnum(nn.charAt(j-1))==2&&Iscountnum(nn.charAt(j))==2)
{ nn.replace(j-1,j+1,new String("+"));
System.out.println(nn);
j=0;}
else if(Iscountnum(nn.charAt(j-1))*Iscountnum(nn.charAt(j))!=0)
{ cancounting3=false;
System.out.println("此部分的数据运算符号有问题 "+nn+"不可以进行计算啊");
Labelnow.setBackground(Color.red);
Labelnow.setText("请纠正数据后再按=键进行计算4");
break; }
}
System.out.println("校对后的此部分的数学表达式是"+nn);
}
if(cancounting0&&cancounting1&&cancounting2&&cancounting3)
{
for(i=0,j=1;j<nn.length();j++)
{
if(Iscountnum(nn.charAt(j))!=0&&nn.charAt(j)!='.')
{numgroup[t]=Double.parseDouble(nn.substring(i,j));
countnum[t]=new Character(nn.charAt(j));
System.out.println("表达式中的数字和计算符分别是"+numgroup[t]+" --------- "+countnum[t]);
i=j+1;
t++;}
}
numgroup[t]=Double.parseDouble(nn.substring(i,j) );
System.out.println("表达式最后一个数字和要计算的数字个数是"+numgroup[t]+" —————— "+(t+1));
for(i=0;i<t;i++)
if(2<Iscountnum(countnum[i])&&Iscountnum(countnum[i])<6)
{switch(Iscountnum(countnum[i]))
{case 3: numgroup[i]=numgroup[i]*numgroup[i+1];break;
case 4: numgroup[i]=numgroup[i]/numgroup[i+1];break;
case 5: numgroup[i]=numgroup[i]%numgroup[i+1];break;}
for(j=i;j<t-1;j++)
{numgroup[j+1]=numgroup[j+2];
countnum[j]=countnum[j+1];}
if(i<t-1)
numgroup[j+1]=numgroup[j+2];
i--;
t--;
}
for(i=0;i<t;i++)
if(0<Iscountnum(countnum[i])&&Iscountnum(countnum[i])<3)
{ switch(Iscountnum(countnum[i]))
{case 1: numgroup[i]=numgroup[i]+numgroup[i+1];break;
case 2: numgroup[i]=numgroup[i]-numgroup[i+1];break;}
for(j=i;j<t-1;j++)
{numgroup[j+1]=numgroup[j+2];
countnum[j]=countnum[j+1];}
if(i<t-1)
numgroup[j+1]=numgroup[j+2];
i--;
t--;}
System.out.println("此部分的数计算结果是:"+numgroup[0]);
Labelnow.setBackground(Color.cyan);
Labelnow.setText("Ok! 此部分运行结束!");
result=new StringBuffer(Double.toString(numgroup[0]));
}
if(numgroup[0]==Double.MIN_VALUE)
{ result.setLength(0);
if(Labelnow.getText().equals("计算程序正在运行"))
{ System.out.println("程序发生了严重的错误,请联系管理员");
Labelnow.setBackground(Color.red);
Labelnow.setText("程序发生错误!请联系管理员");}
}
return(result.toString());
//注意采用return(Double.toString(numgroup[0]))和return(numgroup[0].toString())的结果是不同的。而后者的精度更高。是为什么呢?
}
public int Iscountnum(Character hh)
{
String mm=new String("+-×÷%.()");
int i,t=-1;
for(i=0;i<mm.length();i++)
if(mm.charAt(i)==hh)
{ t=i;break;}
return(t+1);
}
public static void main(String[] args){
A5i13w at=new A5i13w();
}
}
//要解决的问题是如何使其支持负数的符号啊? 于2007-7-21成功解决啊 哈哈............ 后续唉!!!!!!!!!!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -