科学计算器代码.docx
《科学计算器代码.docx》由会员分享,可在线阅读,更多相关《科学计算器代码.docx(36页珍藏版)》请在冰点文库上搜索。
科学计算器代码
Calculate.java
/*这是一个计算类,用于普通运算中的各种运算,如2,8,10,16进制的符合运算,复合运算其原理用后缀表达式来实现*/
importjava.util.*;
importjava.lang.Math;
classCalculate{//两个内部类来实现数据的存储,如同数据结构中的栈
classoperator
{chardata[];
inttop;
operator()
{
data=newchar[50];
top=-1;
}
};
classoperator1
{doubledata[];
inttop;
operator1()
{
data=newdouble[20];
top=-1;
}
};
publicstaticdoublejiecheng(doublenumber)//阶乘运算
{
intnumber1=(int)number;
doublej=1;
for(inti=1;i<=number1;i++)
j=j*i;
returnj;
}
Stringtrans(charexp[],charpostexp[])//后缀表达式的翻译函数
{
inti=0,j=0;booleanm=true;//m用来监视表达式是不有非法的运算符连着输入
operatorop=newoperator();
while(exp[j]!
='\0')
{switch(exp[j])
{
case'(':
op.top++;
op.data[op.top]=exp[j];
j++;m=false;
break;
case')':
while(op.data[op.top]!
='(')
{postexp[i++]=op.data[op.top];
op.top--;
}
op.top--;
j++;
break;
case'+':
case'-':
if(!
m)
return"+或者-附近出现多个运算符在一起的现象!
";
while(op.top!
=-1&&op.data[op.top]!
='(')
{
postexp[i++]=op.data[op.top];
op.top--;
}
op.top++;
op.data[op.top]=exp[j];
j++;m=false;
break;
case'*':
case'/':
if(!
m)
return"*或/附近出现多个运算符在一起的现象!
";
while(op.top!
=-1&&op.data[op.top]!
='('&&op.data[op.top]!
='+'&&op.data[op.top]!
='-')
{
postexp[i++]=op.data[op.top];
op.top--;
}
op.top++;
op.data[op.top]=exp[j];
j++;m=false;
break;
case'^':
if(!
m)
return"^(冥运算符号)附近出现多个运算符在一起的现象!
";
case's':
case'c':
case't':
case'l':
case'$':
case'`':
op.top++;
op.data[op.top]=exp[j];
j++;
m=false;
break;
case'!
':
op.top++;
op.data[op.top]=exp[j];
j++;
break;
case'':
break;
default:
while(exp[j]>='0'&&exp[j]<='9'||exp[j]=='.')
{
postexp[i++]=exp[j];
j++;
}
postexp[i++]='#';
m=true;
}
}
while(op.top!
=-1)
{
postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0';
if(exp[j-1]=='+'||exp[j-1]=='-'||exp[j-1]=='*'||exp[j-1]=='/'||exp[j-1]=='^')
return"运算式后缀出现非正常运算符!
";
return"ok";
}
Stringcompvalue(charpostexp[],intflag)//后缀表达式运算,flag为进制
{
Stringex=newString(postexp);
StringTokenizeranaly=newStringTokenizer(ex,"#+-`*/sclt!
^$");
operator1st=newoperator1();
doubled,d1,d2,a,b,c;
intj=0;
st.top=-1;
while(postexp[j]!
='\0')
{
switch(postexp[j])
{
case'+':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
c=a+b;
st.data[st.top]=c;
break;
case'-':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
c=b-a;
st.data[st.top]=c;
break;
case'*':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
c=a*b;
st.data[st.top]=c;
break;
case'/':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
if(a!
=0)
{c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{return"输入错误,除数不能是零!
请重新输入!
";
}
break;
case's':
a=st.data[st.top];
c=Math.sin(Math.toRadians(a));
st.data[st.top]=c;
break;
case'c':
a=st.data[st.top];
c=Math.cos(Math.toRadians(a));
st.data[st.top]=c;
break;
case't':
a=st.data[st.top];
if(a%180==90||(-a)%180==90)
return"tan函数值有误!
";
c=Math.tan(Math.toRadians(a));
st.data[st.top]=c;
break;
case'!
':
a=st.data[st.top];
c=jiecheng(a);
st.data[st.top]=c;
break;
case'l':
a=st.data[st.top];
if(a<=0)
return"log的真数不能小于等于0";
c=Math.log(a);
st.data[st.top]=c;
break;
case'^':
a=st.data[st.top];
st.top--;
b=st.data[st.top];
c=Math.pow(b,a);
st.data[st.top]=c;
break;
case'$':
a=st.data[st.top];
if(a<0)
return"开方数不能小于0!
";
c=Math.sqrt(a);
st.data[st.top]=c;
break;
case'`':
a=st.data[st.top];
c=0-a;
st.data[st.top]=c;
break;
default:
Stringstr=analy.nextToken();//获取后缀表达式的数据
if(flag==2)
d=btod(str);
elseif(flag==8)
d=otod(str);
elseif(flag==10)
d=Double.parseDouble(str);
else
d=htod(str);
while(postexp[j]>='0'&&postexp[j]<='9'||postexp[j]=='.')
{
j++;
}
st.top++;
st.data[st.top]=d;
break;
}
j++;
}
return(String.valueOf(st.data[st.top]));
}
Stringcheck(charc[])//检查函数,用来检查运算式中的低级错误
{
intk=0,i=0;
if(c[0]=='+'||c[0]=='-'||c[0]=='^'||c[0]=='*'||c[0]=='/')
return"表达式开始位置不对";
while(c[k]!
='\0')
{
if((c[k]>=39&&c[k]<='9'&&c[k]!
=',')||c[k]=='$'||c[k]=='!
'||c[k]==''
||c[k]=='c'||c[k]=='s'||c[k]=='t'||c[k]=='^'||c[k]=='l'||c[k]=='`')
{
}
else
{
return"输入含有非法的字符,请重新输入正确的数学表达式!
";
}
if(c[k]=='(')
i++;
elseif(c[k]==')')
i--;
k++;
}
if(i!
=0)
{
return"输入错误,没有相匹配的括弧!
请重新输入!
";
}
return"ok";
}
doublebtod(Stringstr)//二进制到十进制的转换
{
intk=str.indexOf("."),m=0;
doublep=0.0;
if(k==-1)
k=str.length();
for(inti=k-1;i>=0;i--)
{
charc=str.charAt(i);
inta=Integer.parseInt(""+c);
p=p+(a*Math.pow(2,m));
m++;
}
m=-1;
for(inti=k+1;i{
charc=str.charAt(i);
inta=Integer.parseInt(""+c);
p=p+(a*Math.pow(2,m));
m--;
}
returnp;
}
doubleotod(Stringstr)//八进制到十进制的转换
{
intk=str.indexOf("."),m=0;
doublep=0.0;
if(k==-1)
k=str.length();
for(inti=k-1;i>=0;i--)
{
charc=str.charAt(i);
inta=Integer.parseInt(""+c);
p=p+(a*Math.pow(8,m));
m++;
}
m=-1;
for(inti=k+1;i{
charc=str.charAt(i);
inta=Integer.parseInt(""+c);
p=p+(a*Math.pow(8,m));
m--;
}
returnp;
}
doublehtod(Stringstr)//十六进制到十进制的转换
{
intk=str.indexOf("."),m=0;
doublep=0.0;
if(k==-1)
k=str.length();
for(inti=k-1;i>=0;i--)
{
charc=str.charAt(i);
inta=Integer.parseInt(""+c);
p=p+(a*Math.pow(16,m));
m++;
}
m=-1;
for(inti=k+1;i{
charc=str.charAt(i);
inta=Integer.parseInt(""+c);
p=p+(a*Math.pow(16,m));
m--;
}
returnp;
}
}
Main.java
//主类
publicclassMain{
publicstaticvoidmain(String[]args){
newWinFrame("计算器");
}
}
MyDialog.java
importjava.awt.event.*;
importjava.awt.*;//帮助文档的对话框类
classMyDialogextendsDialogimplementsActionListener//建立对话框类
{staticfinalintYES=1,NO=0;
intmessage=-1;Buttonyes,no;
TextAreaarea;Stringhelp;
MyDialog(Framef,Strings,booleanb)//构造方法
{super(f,s,b);
yes=newButton("确定");yes.addActionListener(this);
no=newButton("取消");no.addActionListener(this);
setLayout(newFlowLayout());
help="使用帮助:
\n";
help+="本计算器运算方式采用输入整个运算式后进行运算的方式.\n";
help+="但由于作者能力有限,对有些运算符进行了重定义,现列出以下运算符:
\n";
help+="s代表sin,c代表cos,t代表tan,!
代表阶乘,l代表log\n";
help+="`代表负号,如果要用键盘输入的时候,请正确输入\n";
help+="本计算器有4大主要功能:
\n";
help+="1.进行符合运算,可以用键盘进行输入,执行结果可以按回车获得\n";
help+="2.进行2,8,10,16进制的各种运算以及相互转换,16进制没有实现a,b,c,d,e,f的输入\n";
help+="3.进行大整数运算\n4.进行批量运算";
area=newTextArea(help,10,50,3);
//area.setEnabled(false);
area.setForeground(Color.BLUE);
area.setFont(newFont("宋体",Font.BOLD,16));
add(area);
add(yes);add(no);
yes.setPreferredSize(newDimension(100,25));
no.setPreferredSize(newDimension(100,25));
setBounds(300,300,500,300);
addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{message=-1;setVisible(false);
}
}
);
}
publicvoidactionPerformed(ActionEvente)
{if(e.getSource()==yes)
{message=YES;setVisible(false);
}
elseif(e.getSource()==no)
{message=NO;setVisible(false);
}
}
publicintgetMessage()
{returnmessage;
}
}
Mypanel.java
importjava.util.*;
importjava.awt.*;
importjavax.swing.*;
classmypanelextendsPanel//派生一个面板,用来实现不同面板的布局
{
GridLayoutgrid;
JButtonbtu[];
mypanel(String[]btuName,introw,intcol,Colorc)
{
btu=newJButton[btuName.length];
grid=newGridLayout(row,col,1,1);
setLayout(grid);
for(inti=0;ifor(intj=0;j
{
if(i*col+j{
btu[i*col+j]=newJButton(btuName[i*col+j]);
btu[i*col+j].setForeground(c);
add(btu[i*col+j]);
btu[i*col+j].setPreferredSize(newDimension(60,25));
}
else
break;
}
}
}
WinFrame.java
importjava.util.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.lang.Math;
importjava.math.*;
classWinFrameextendsFrameimplementsActionListener,KeyListener,ItemListener
{
mypanelpane1,pane2,pane3,pane4,pane5;
Labellabel1,label2;
shortj_flag=10;//进制运算的标示,初始化为十进制
StringstrAsk="",strAnswer="";
booleanb_flag=true;
booleanp_flag=true;//批处理开关
TextAreatext1;//大整数输出专用域
MenuBarmenubar;
Menumenu1,menu2,menu3;
MenuItemitem1,item2;
MyDialogdialog;//帮助文档对话框
CheckboxMenuItemmenuitem1,menuitem2,menuitem3;
Stringa[]={"1","2","3",//用数组进行按钮的命名和消息内容的获取
"4","5","6",
"7","8","9",
"0",".","+/-"};
Stringa1[]={"1","2","3",
"4","5","6",
"7","8","9",
"0",".","`"};
Stringb[]={"/","C","*","→","+","=","-","CE"};
Stringc[]={"sin","cos","tan","!
","pow","sprt","log","pi"};
Stringc1[]={"s","c","t","!
","^","$","l","p"};
Stringd[]={"(",")"};
Stringd1[]={"(",")"};
Stringe[]={"A","B","C","D","E","F"};
JTextFieldask,answer;
charexp[];charpostexp[];
Checkboxbox1,box2,box3,box4,box5;
CheckboxGroupjin;
Stringdata="0";//大整数储存数据
TextAreatext2,text3;
intopear;
CardLayoutmycard;
Stringanswer1="";//进制转换时的十进制答案储存
Longanswer2=(long)0;//其他进制答案储存
PanelpCenter;//添加一个容器装专用数据域
voidarea()//初始化布局,只是不想在构造方法中的东西太多,看起来不方便
{
mycard=newCardLayout();
pCenter=newPanel();
pCenter.setLayout(mycard);
setLayout(newFlowLayout());
setBounds(60,60,450,290);
menu1=newMe
|