科学计算器代码.docx
- 文档编号:13735073
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:36
- 大小:23.11KB
科学计算器代码.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;i for(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 科学 计算器 代码