科学计算器代码.docx

上传人:b****1 文档编号:13735073 上传时间:2023-06-16 格式:DOCX 页数:36 大小:23.11KB
下载 相关 举报
科学计算器代码.docx_第1页
第1页 / 共36页
科学计算器代码.docx_第2页
第2页 / 共36页
科学计算器代码.docx_第3页
第3页 / 共36页
科学计算器代码.docx_第4页
第4页 / 共36页
科学计算器代码.docx_第5页
第5页 / 共36页
科学计算器代码.docx_第6页
第6页 / 共36页
科学计算器代码.docx_第7页
第7页 / 共36页
科学计算器代码.docx_第8页
第8页 / 共36页
科学计算器代码.docx_第9页
第9页 / 共36页
科学计算器代码.docx_第10页
第10页 / 共36页
科学计算器代码.docx_第11页
第11页 / 共36页
科学计算器代码.docx_第12页
第12页 / 共36页
科学计算器代码.docx_第13页
第13页 / 共36页
科学计算器代码.docx_第14页
第14页 / 共36页
科学计算器代码.docx_第15页
第15页 / 共36页
科学计算器代码.docx_第16页
第16页 / 共36页
科学计算器代码.docx_第17页
第17页 / 共36页
科学计算器代码.docx_第18页
第18页 / 共36页
科学计算器代码.docx_第19页
第19页 / 共36页
科学计算器代码.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

科学计算器代码.docx

《科学计算器代码.docx》由会员分享,可在线阅读,更多相关《科学计算器代码.docx(36页珍藏版)》请在冰点文库上搜索。

科学计算器代码.docx

科学计算器代码

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2