科学计算器Java源代码

import java.awt.*;
import java.awt.event.*;
public class A5il3w 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);

public A5il3w() //构造方法来初始化本程序的变量
{
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(); //在DOS中显示计算过程前,先空两行。便于前后计算的区分!
System.out.println("即将计算的表达式是:"+QU);
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 StringB

uffer(tt);
Boolean errorstop=true;
int i, j, m=0, n=0;
for( ; m!= -1 ; ) //开始对括号内容经行优先处理
{ m= -1; n=-2;
for(i=0; iif( mm.charAt(i)== '(' ) { m=i; System.out.println(" 在"+m+"处找到'(' " ); }

for(n=-1,j=m+1;jif(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||nIscountnum( 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{ 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{
if(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//出现“++”,“—+”,“×+”,“÷+”,“%+”情况删除“+”即可
{ nn.deleteCharAt(j);
System.out.println("检验数学符号没有问题");
j=0; //经操作后次数学表达式改变,要从头开始
}
else if(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{
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;iif(2{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{ numgroup[j+1]=numgroup[j+2];
countnum[j]=countnum[j+1];}
if(inumgroup[j+1]=numgroup[j+2];
i--;
t--;
}

for(i=0;iif(0{ 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{numgroup[j+1]=numgroup[j+2];
countnum[j]=countnum[j+1];}
if(inumgroup[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());
}
public int Iscountnum(Character hh) //把运算符转化相应的数值的方法
{
String mm=new String("+-×÷%.()");
int i,t=-1;
for(i=0;iif(mm.charAt(i)==hh)
{ t=i;break;}
return(t+1);
}
public static void main(String[] args){
A5il3w at=new A5il3w();
}
}





















相关文档
最新文档