求一个用java编程的计算器,要包括四则运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个用java编程的计算器,要包括四则运算相关的知识,希望对你有一定的参考价值。

[code]package ex;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener
/**
*
*/
private static final long serialVersionUID = 12345678L;
private final String[] KEYS="7","8","9","/","sqrt","4","5","6","*","%",
"1","2","3","-","1/x","0","+/-",".","+","=";
private final String[] M=" ","MC","MR","MS","M+";
private final String[] COMMAND="Backspace","CE","C";
/**计算器上键的按钮*/
private JButton keys[]=new JButton[KEYS.length];
/**计算器上的功能键的按钮*/
private JButton command[]=new JButton[COMMAND.length];
/**计算器左边的M的按钮*/
private JButton m[]=new JButton[M.length];
/**计算结果文本框*/
private JTextField resultText=new JTextField("0");
/**标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字*/
private boolean firstDigit=true;
//计算的中间结果
private double resultNum=0.0;
//当前运算的运算符
private String operator="=";
//操作是否合法
private boolean operateValidFlag=true;
/**
* 构造方法
* */
public Calculator()
super();
//初始化计算器
init();
this.setBackground(Color.LIGHT_GRAY);
this.setTitle("我的计算器v2008");
//在屏幕(500,300)坐标处显示计算器
this.setLocation(500, 300);
//不许修改计算器的大小
this.setResizable(false);
//使计算器中各组件大小合适
this.pack();

/**
* 初始化计算器
* */
private void init()
//文本框中的内容采用右对齐方式
resultText.setHorizontalAlignment(JTextField.RIGHT);
//不允许修改结果文本框
resultText.setEditable(false);
//设置文本框背景颜色为白色
resultText.setBackground(Color.WHITE);
//初始化计算器上键的按钮,将键放在一个画板内
JPanel calckeysPanel=new JPanel();//calckeysPanel
//用网格布局器,4行,5列的网络,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
calckeysPanel.setLayout(new GridLayout(4,5,3,3));
for(int i=0;i<KEYS.length;i++)
keys[i]=new JButton(KEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.BLUE);

//运算符键用红色标示,其他键用蓝色表示
keys[3].setForeground(Color.red);
keys[8].setForeground(Color.red);
keys[13].setForeground(Color.red);
keys[18].setForeground(Color.red);
keys[19].setForeground(Color.red);
//初始化功能键,都用红色标示。将功能键放在一个画板内
JPanel commandsPanel=new JPanel();
//用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
commandsPanel.setLayout(new GridLayout(1,3,3,3));
for(int i=0;i<COMMAND.length;i++)
command[i]=new JButton(COMMAND[i]);
commandsPanel.add(command[i]);
command[i].setForeground(Color.red);

//初始化M键,用红色标示,将M键放在一个画板
JPanel calmsPanel=new JPanel();
//用网络布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
calmsPanel.setLayout(new GridLayout(5,1,3,3));
for(int i=0;i<M.length;i++)
m[i]=new JButton(M[i]);
calmsPanel.add(m[i]);
m[i].setForeground(Color.red);

//下面进行计算器的整体布局,将calckeys和command画板放在计算机的中部,
将文本框放在北部,将calms画板放在计算器的西部
//新建一个大的画板,将上面建立的command和calckeys画板放在该画板内
JPanel panel1=new JPanel();
//画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素
panel1.setLayout(new BorderLayout(3,3));
panel1.add("North",commandsPanel);
panel1.add("Center",calckeysPanel);//
//建立一个画板放文本框
JPanel top=new JPanel();
top.setLayout(new BorderLayout());
top.add("Center",resultText);

//整体布局
getContentPane().setLayout(new BorderLayout(3,5));
getContentPane().add("North", top);
getContentPane().add("Center",panel1);
getContentPane().add("West",calmsPanel);
//为各按钮添加事件侦听器
//都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener
for(int i=0;i<KEYS.length;i++)
keys[i].addActionListener(this);

for(int i=0;i<COMMAND.length;i++)
command[i].addActionListener(this);

for(int i=0;i<M.length;i++)
m[i].addActionListener(this);


public void actionPerformed(ActionEvent e)
//获取事件源的标签
String label=e.getActionCommand();
if(label.equals(COMMAND[0]))
//用户按了"Backspace"键
handleBackspace();
else if(label.equals(COMMAND[1]))
resultText.setText("0");
else if(label.equals(COMMAND[2]))
handleC();
else if("0123456789.".indexOf(label)>=0)
handleNumber(label);
else
handleOperator(label);


//处理Backspace键被按下的事件
private void handleBackspace()
String text=resultText.getText();
int i=text.length();
if(i>0)
text=text.substring(0,i-1);
if(text.length()==0)
resultText.setText("0");
firstDigit=true;
operator="=";
else
resultText.setText(text);



//处理数字键被按下的事件
private void handleNumber(String key)
if(firstDigit)
resultText.setText(key);
else if((key.equals("."))&&(resultText.getText().indexOf(".")<0))
//输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
resultText.setText(resultText.getText()+".");
else if(!key.equals("."))
//如果输入的不是小数点,则将数字附在结果文本框的后面
resultText.setText(resultText.getText()+key);

firstDigit=false;


private void handleC()
resultText.setText("0");
firstDigit=true;
operator="=";


private void handleOperator(String key)
if(operator.equals("/"))
if(getNumberFromText()==0.0)
operateValidFlag=false;
resultText.setText("除数不能为零 ");
else
resultNum/=getNumberFromText();

else if(operator.equals("1/x"))
//倒数运算
if(resultNum==0.0)
operateValidFlag=false;
resultText.setText("零没有倒数");
else
resultNum=1/resultNum;

else if(operator.equals("+"))
resultNum+=getNumberFromText();
else if(operator.equals("-"))
resultNum-=getNumberFromText();
else if(operator.equals("*"))
resultNum*=getNumberFromText();
else if(operator.equals("sqrt"))
resultNum=Math.sqrt(resultNum);
else if(operator.equals("%"))
resultNum=resultNum/100;
else if(operator.equals("+/-"))
resultNum=resultNum*(-1);
else if(operator.equals("="))
resultNum=getNumberFromText();

if(operateValidFlag)
long t1;
double t2;
t1=(long)resultNum;
t2=resultNum-t1;
if(t2==0)
resultText.setText(String.valueOf(t1));
else
resultText.setText(String.valueOf(resultNum));


//运算符等于用户按的按钮
operator=key;
firstDigit=true;
operateValidFlag=true;

/*
*从结果文本框中获取数字
**/
private double getNumberFromText()
double result=0;
try
result=Double.valueOf(resultText.getText()).doubleValue();
catch (NumberFormatException e)


return result;

public static void main(String args[])
Calculator calculator1=new Calculator();
calculator1.setVisible(true);
calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

[/code]

这是在网上帮你找的,我自己是学asp.net的 对java不是很了解。希望能帮到你 ~~~

参考资料:http://hi.baidu.com/tjx1222/blog/item/014cc2eed990a93b2df534de.html

参考技术A 如果你学过JAVA,建议你自己试着写一个,计算器并不难实现,动手写一个可以锻炼自己的能力……

MATLAB编程及应用-第5章 多项式与数据分析

参考技术A 本章将介绍如何使用MATLAB来解决一些基本的数学运算问题,主要包括多项式的相关计算,数据插值,曲线拟合以及数据统计处理等相关的内容。本章的主要内容如下:

在MATLAB中,多项式是以行向量的形式存放的,并且约定多项式以降幂的形式出现,如果多项式中缺少某幂次项,则该幂次项的系数为0。例如,多项式 可以表示为:p1=[1 21 20 0],其中常数项为0。

本节将全面介绍与多项式有关的各种计算,包括多项式的四则运算、导函数运算、求值、求根以及分部展开。

多项式的加减运算并无特别,可以使用向量的加减运算实现。多项式的乘除运算比较复杂,为此MATLAB提供了专门的运算函数 conv 和 deconv 。
函数 conv 用于求多项式P1和P2的乘积,它的调用格式如下:

其中,P1、P2是两个多项式系数向量。
函数 deconv 用于对多项式P1和P2作除法运算,它的调用格式如下:

其中,Q返回多项式P1除以P2的商式,r返回P1除以P2的余式。返回的Q和r仍是多项式系数向量。

可以将除法运算deconv看作是乘法运算conv的逆运算,即有P1=conv(P2,Q)+r。

下面通过示例介绍多项式的表示和多项式的四则运算。

使用函数poly2str显示多项式p1和p2相乘后生成的新多项式,如下所示:
>> poly2str(y,'x') %以比较习惯的方式显示多项式
ans =
2 x^6 + 15 x^5 - 5 x^4 + 24 x^3 - 20 x^2 + 10 x - 30

MATLAB提供了polyder函数,用于求多项式的导函数。该函数的格式如下:

其中,参数P和Q是多项式的系数向量,返回结果p和q也是多项式的系数向量。

MATLAB提供了两种求多项式值的函数:polyval与polyvalm,它们的输入参数均为多项式系数向量P和自变量x,但是两者是有很大区别的,前者是按数组运算规则对多项式求值,而后者是按矩阵运算规则对多项式求值。具体的调用格式如下所示。

>> p3=[2 6 8 0 5 9 4] %生成多项式系数
>> A=rand(3) %生成随机矩阵
①使用函数polyval按数组运算规则求A中的每个元素对于多项式p3的值。在命令窗口中输入如下内容:
>> Y=polyval(p3,A)
运算结果如下:
Y =
7.2917 15.2885 5.4763
5.8986 7.2672 15.8387
5.9409 11.3612 8.3376
②使用函数polyvalm按矩阵运算规则求以方阵A为自变量的多项式p3的值。在命令窗口中输入如下内容:
>> Y1=polyvalm(p3,A)
运算结果如下:
Y1 =
13.6694 21.1448 16.7431
8.7641 22.5846 21.5403
8.4161 19.5396 22.2629
③如果函数polyval和polyvalm的第二个参数为数值,仍然可以按照数组和矩阵的运算规则计算求多项式在该参数下的结果。在命令窗口中输入如下内容:
>> A=3
分别使用函数polyval和polyvalm计算多项式的值,具体操作及返回结如下:
>> Y=polyval(p3,A)
Y =
3640
>> Y1=polyvalm(p3,A)
Y1 =
3640
④如果函数ployval和ployvalm的第二个参数为一向量,前者按照数组运算规则仍然可以计算求多项式在该参数下的结果,但是后者按矩阵运算规则计算则会提示错误信息。在命令窗口中输入如下内容:
>> p4=[4 8 0 0 0 3 6]
分别使用函数polyval和polyvalm计算多项式的值,具体操作及返回结果如下:
>> Y=polyval(p3,p4) %第二个参数为向量
Y =
16504 754060 4 4 4 3640 150574
>> Y1=polyvalm(p3,p4) %第二个参数必须为方阵或数值
??? Error using ==> polyvalm
Matrix must be square.

n次多项式具有n个根,这些根可能是实根,也可能含有若干对共轭复根。MATLAB提供了roots函数用于求多项式的全部根,该函数的调用格式为:

其中,P为多项式的系数向量,返回向量x为多项式的根,即x(1),x(2),…,x(n)分别代表多项式的n个根。

另外,如果已知多项式的全部根,MATLAB还提供了函数poly用来建立该多项式,该函数的调用格式为:

其中,x为多项式的根,返回向量P为多项式的系数向量。

对于一个方阵s,可以用函数poly来计算矩阵的特征多项式的系数。特征多项式的根即为特征值,可以用roots函数来计算。

MATLAB提供函数 residue 可以实现将分式表达式进行多项式的部分分式展开。
对于 ,函数的调用格式如下:

其中,b和a分别是分子和分母多项式系数行向量;返回值r是[r1 r2 …rn]留数行向量,p为[p1 p2 …pn]极点行向量,k为直项行向量。下面通过示例来讲述该函数的使用。

多项式的微分MATLAB提供了函数 polyder 来实现,前面介绍多项式的导函数时已经介绍了该函数的具体使用。但是对于多项式的积分运算MATLAB没有提供专门的函数,但可以用 [p./length(p):-1:1,k] 的方法来完成积分,其中k为常数。下面通过示例讲解如何进行多项式的积分运算。

插值运算是根据数据点的规律,首先找到一个多项式连接这些已知的数据点,然后根据该多项式计算出要得到的与已知数据点相邻的点对应的数值。数据的插值运算在信号和图象处理等领域使用比较广泛。MATLAB提供了专用的函数来处理数据的插值问题,下面将详细的介绍使用这些插值函数的方法。

一维插值是指对一个自变量的插值,实现一维数据插值的函数是interp1,该函数的调用格式为:

interp1函数的功能是根据X,Y的值,计算出在X1处的值,并返回给Y1。其中,X和Y是两个等长的已知向量,分别描述采样点和样本值;X1是一个向量或标量,描述欲插值的点,返回值Y1是与X1等长的插值结果;method是插值函数的类型,允许的取值有“linear”(线性插值)、“nearest”(用最接近的相邻点插值)、“cubic”(三次插值)和“spline”(三次样条插值),linear为默认值。

除此之外,MATLAB还提供了一个专门的用于3次样条插值的函数spline,功能与函数 Y1=interp1(X,Y,X1,‘spline’) 完全相同,使用方法也类似。该函数的调用格式如下:

除前面介绍的一维数据的插值,MATLAB还提供用于解决二维插值问题的函数 interp2 ,该函数的调用格式为:

其中,X和Y是两个向量,分别描述两个参数的采样点,Z是与参数采样点对应的函数值,X1,Y1是两个向量或标量,描述欲插值的点。返回值Z1是根据相应的插值方法得到的插值结果。method的取值与一维插值函数相同。X,Y,Z也可以是矩阵形式。

多项式曲线拟合是用一个多项式来逼近一组给定的数据,拟合的准则是最小二乘法,即找出使 的 .
在MATLAB中,用 polyfit 函数来求得最小二乘拟合多项式的系数,计算得到多项式后可以用 polyval 函数计算所给出点的近似值。polyfit函数的调用格式为:

polyfit 函数根据采样点X和采样点函数值Y,返回一个m次多项式P及供polyval使用的结构数组S,S有三个域:S.R给出QR分解后满足Q·R=V的矩阵R,S.df给出相应χ2量的自由度,S.normr给出拟合残数的2—范数。其中X,Y是两个等长的向量,P是一个长度为m+1的向量,P的元素为多项式系数。

>> Y=polyval(P,x) %根据多项式系数向量计算对应点x处的拟合函数值
即可计算得到拟合多项式在给定点的函数值。

本节介绍数据统计处理方法,包括最大(小)值运算、求和(积)运算、平均值(中值)运算、累加(乘)运算、标准方差、相关系数以及排序运算。

MATLAB提供的求数据序列的最大值和最小值的函数分别为max和min,两个函数的调用格式和操作过程类似,可以分别用来求向量或矩阵的最大值和最小值。

(1)求向量的最大值和最小值

求向量的最大值和最小值的函数调用格式见表5.1。

表5.1 求向量最大值、最小值函数

(2)求矩阵的最大值和最小值
求矩阵的最大值和最小值的函数调用格式见表5.2。

表5.2 求矩阵的最大值、最小值函数

(3)两个向量或矩阵对应元素的比较

函数max和min还能对两个同型的向量或矩阵进行比较,函数调用格式见表5.3。

表5.3 最大值、最小值函数

MATLAB提供的数据序列求和与求积的函数分别是sum和prod,这两个函数的使用方法类似,分别可以用来对向量和矩阵求和与求积。函数调用格式及功能见表5.4。
表5.4 求和与求积函数

在命令窗口中输入:
>> prod(B) %返回各列元素的积
计算得到的各列元素的积如下:
ans =
0.0648 0.0057 0.1780 0.0487
③可以采用下列的方式返回矩阵B各列元素的和与矩阵B各列元素的乘积,具体输入内容和计算返回结果如下:
>> sum(B,1) %返回各列元素的和
ans =
2.2741 2.1284 2.6735 2.2420
>> prod(B,1) %返回各列元素的积
ans =
0.0648 0.0057 0.1780 0.0487
④返回矩阵B各行所有元素的和与矩阵B各行所有元素的积,在命令窗口中输入:
>> sum(B,2) %返回各行元素的和
>> prod(B,2) %返回各行元素的积

MATLAB提供了求数据序列平均值的函数mean与数据序列中值的函数median,函数调用格式及功能见表5.5。
表5.5 求平均值与中值函数

④求矩阵A的各行的算术平均值与中值,在命令窗口中输入:
>> mean(A,2) %计算得到矩阵A各行的算术平均值
>> median(A,2) %计算得到矩阵A各行的中值

在MATLAB中,使用cumsum和cumprod函数能方便地求得向量和矩阵元素的累加和与累乘积向量,函数调用格式及功能见表5.6。
表5.6 累加和与累加积函数

在MATLAB中,提供了计算数据序列的标准方差的函数std。该函数对于向量X返回一个标准方差;对于矩阵A返回一个行向量,它的各个元素便是矩阵A各列或各行的标准方差。调用格式为:
Y=std(A,flag,dim)
其中,dim可以取1或2。当dim=1时,求各列元素的标准方差;当dim=2时,则求各行元素的标准方差。flag可以取0或1,当flag=0时,置前因子为 ;否则置前因子为 。缺省flag=0和dim=1。

MATLAB提供了corrcoef函数,可以求出数据的相关系数矩阵。调用格式为:

corrcoef函数返回从矩阵X形成的一个相关系数矩阵。此相关系数矩阵的大小与矩阵X一样。它把矩阵X的每列作为一个变量,然后求它们的相关系数。其中X,Y是向量,与corrcoef([X,Y])的作用一样。

>> corrcoef(A) % 求解矩阵A形成的一个相关系数矩阵
返回相关系数矩阵如下:
ans =
1.0000 -0.2608 0.5478 -0.7232
-0.2608 1.0000 -0.9397 0.2996
0.5478 -0.9397 1.0000 -0.3984
-0.7232 0.2996 -0.3984 1.0000
②可以求向量B形成的一个相关系数矩阵。在命令窗口中输入以下内容:
>> corrcoef(B) %求取向量B形成的一个相关系数矩阵
返回相关系数矩阵如下:
ans =
1

MATLAB提供了sort函数来实现排序功能,调用格式如下:

函数返回一个对X中的元素按升序排列的新向量,Y是排序后的矩阵,而I记录Y中的元素在A中位置。其中,dim指明对矩阵A的列还是行进行排序。若dim=1,则按列排;若dim=2,则按行排。

Y =
0.5226 0.1730 0.0118 0.1991
0.7948 0.2523 0.1365 0.2987
0.8801 0.2714 0.7373 0.6614
0.9568 0.9797 0.8757 0.8939
I =
3 1 4 2
1 4 3 3

本章重点介绍了MATLAB提供的基本的数学运算功能,主要包括多项式的相关运算、数据的插值与拟合运算、数据统计处理运算以及傅立叶变换等内容。

多项式部分通过实例重点介绍了多项式运算相关的内容,主要包括多项式的表示方法、多项式的四则运算、多项式的求导运算、多项式的求值与求根运算、多项式的展开以及多项式的积分运算等内容。掌握多项式运算内容是深入学习MATLAB其他内容的基础。

数据插值部分和拟合部分通过实例介绍了MATLAB提供的数据处理时经常使用的数据插值和拟合运算函数,其中插值部分包括一维和二维数据的插值运算。曲线拟合运算时要正确的选择所要拟合的多项式的阶,并不是拟合多项式的阶越高精度越好,一般拟合多项式的阶不超过5阶。

数据统计处理部分通过实例详细介绍一些常用的数据统计处理方法,主要包括数据的最大值与最小值运算、求和与求积运算、平均值与中值运算、累加和与累乘积运算、标准方差、相关系数以及排序等运算。

以上是关于求一个用java编程的计算器,要包括四则运算的主要内容,如果未能解决你的问题,请参考以下文章

个人小项目——四则运算器小游戏

代码作业——四则运算

2017-2018-2 20172314 『Java程序设计』课程 结对编程练习_四则运算

结对编程实现四则运算

项目1——四则运算生成

用C语言随机产生三个数,三个数之间进行四则运算,四则运算也随机产生