Sophia014 2015-07-01 08:59 采纳率: 50%
浏览 2103
已结题

简单计算器Java代码非法表达式问题问题,求大神指点

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Jisuanqi extends JFrame implements ActionListener{
//计算器控件键

JFrame Jisuan = new JFrame("计算器");

private  final String KEYS[] = {"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","=",
    "Exp","pi","sin","x^y","log","cos","x^3","n!","tan","x^2"};          
private  final String M[] = {"MC","MR","MS","M+"};
private  final String COM[] = {"Backspace","CE","C"};
private JButton keys[] = new JButton(KEY.length);  
private JButton com[] = new JButton(COM.length);
private JButton m[] = new JButton(M.length);

private JTextField result;
MenuBar menubar=new MenuBar();  
Menu edit=new Menu("编辑");
Menu help=new Menu("帮助");
MenuItem copy=new MenuItem("复制");
MenuItem paste=new MenuItem("粘贴");
MenuItem about=new MenuItem("关于计算器(A)");  
private boolean firstDigit = true;   //判断第一个输入的字符是否是数字
private double resultNum = 0.0;      //中间结果
private boolean operateValidFlag = true;
private String operator = "=";
private String c,s;

//初始化界面
void init(){
    result = new JTextField("0");
    result.setHorizontalAlignment(JTextField.RIGHT); //文字右对齐
    result.setEditable(false);        //设置为不可编辑
    result.setBackground(Color.white);   //设置颜色为白色

    JPanel Kpanel = new JPanel();
    Kpanel.setLayout(new GridLayout(6,5,5,5));   //六行五列

    for(int i = 0;i < KEYS.length;i++)
    {
        keys[i] = new JButton(KEYS[i]);
        Kpanel.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);
    for(int i=19;i<30;i++){
       keys[i].setForeground(Color.red);
    }

    JPanel Cpanel = new JPanel();
    Cpanel.setLayout(new GridLayout(1,3,5,5));
    for(int i = 0;i < COM.length;i++)
    {
        com[i] = new JButton(COM[i]);
        Cpanel.add(com[i]);
        com[i].setForeground(Color.red);
    }

    JPanel Mpanel = new JPanel();
    Mpanel.setLayout(new GridLayout(4,1,5,5));
    for(int i = 0;i < M.length;i++)
    {
        m[i] = new JButton(M[i]);
        Mpanel.add(m[i]);
        m[i].setForeground(Color.red);
    }       
}

//构造函数

public Jisuanqi(){
    //界面初始化
    init();     
    //添加界面按键监听
    for(int i = 0;i < KEYS.length;i++){
        keys[i].addActionListener(this);
    }       
    for(int i = 0;i < COM.length;i++){
        com[i].addActionListener(this);
    }       
    for(int i = 0;i < M.length;i++){
        m[i].addActionListener(this);
    }

    //复制事件
    copy.addActionListener(new ActionListener()
        {
             public void actionPerformed(ActionEvent e)
                {
                   int i;
                   i=s.length();
                   if(i!=0)
                   c=result.getText();
                   else
                   System.out.println("没有可复制的对象");
                }
        });
    //粘贴事件
    paste.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
                {
                    s=c;
                    result.setText(s);
                }
        });
    help.addActionListener(new ActionListener()
    {
        JOptionPane.showMessageDialog(this,"计算器","帮助",JOptionPane,INFORMATION_MESSAGE);
    }); 
    edit.add(copy);
    edit.add(paste);
    help.add(about);

    menubar.add(edit);
    menubar.addSeparator();
    menubar.add(help);


    //整体布局
    JPanel p1 = new JPanel();
    p1.setLayout(new BorderLayout());
    p1.add("North",Cpanel);
    p1.add("Center",Kpanel);
    JPanel p2 = new JPanel();
    p2.setLayout(new BorderLayout());
    p2.add("Center",result);
    Jisuan.setLayout(new BorderLayout(3,5));
    Jisuan.add("North",p2);
    Jisuan.add("Center",p1);
    Jisuan.add("West",Mpanel);
    Jisuan.setBackground(Color.LIGHT_GRAY);
    Jisuan.setLocation(200,200);
    Jisuan.setMenuBar(menubar);
    Jisuan.setVisible(true);
    Jisuan.setResizable(false);//不可最大化
    Jisuan.pack();      //紧凑
    Jisuan.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
    String str = e.getActionCommand();//获取事件源的标签
    if(str.equals(COM[0]))//按Backspace
        Backspace();
    else if(str.equals(COM[1]))//按CE
        result.setText("0");
    else if(str.equals(COM[2]))//按C
        C();
    else if(str.equals(M[0]))//按MC
        MC();
    else if(str.equals(M[1]))//按MR
        MR();
    else if(str.equals(M[2]))//按MS
        MS();
    else if(str.equals(M[3]))//按M+
        M();
    else if("0123456789.".indexOf(str) >= 0)//按数字键或者小数点
        number(str);
    else//按运算符
        operate(str);
}

//处理Backspace
private void Backspace(){
    String text = new String(result.getText());
    int i = text.length();
    if( i > 0){
        text = text.substring(0,i - 1);
        if(text.length() == 0){
            result.setText("0");
            firstDigit = true;
            operator = "=";
        }
        else{
            result.setText(text);
        }
    }
}
//处理C
private void C(){
    result.setText("0");
    firstDigit = true;
    operator = "=";
}
//处理数字键
private void number(String key){
    if(firstDigit){
        result.setText(key);
    }
    else if((key.equals("."))&&(result.getText().indexOf(".")<0)){
        result.setText(result.getText() + ".");     
    }
    else if(!key.equals(".")){
        result.setText(result.getText() + key);
    }
    firstDigit = false;
}       
//处理MC,清除内存
public void MC(){
    resultNum = 0.0;
    result.setText("0");
    m[0].setText(" ");
    firstDigit = true;
    operator = "=";
}
//处理MR,重新调用存储的数据
public void MR()
{
    //有记忆数字
    if(result.getText() != "" ){
        result.setText("" + resultNum);
    }
}
//处理MS,存储显示的数据
public void MS(){           
    resultNum = Double.valueOf(result.getText()).doubleValue();
    m[0].setText("M");
    result.setText("0");
    firstDigit = true;
    operator = "=";
}
//处理M+,将显示的数字与已经存储的数据相加要查看新的数字单击MR
public void M(){
    resultNum = resultNum + Double.valueOf(result.getText()).doubleValue();
}
//处理运算符
private void operate(String key){
    if(operator.equals("/")){
        if(getNumberFromText() == 0.0){
            operateValidFlag = false;
            result.setText("除数不能是零");
        }
        else
            resultNum /= getNumberFromText();
    }
    else if(operator.equals("1/x")){
         if(resultNum == 0.0){
            operateValidFlag = false;
            result.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();
    }
    else if(str.equals("pi")){
            str.setText(""+3.141592653);
    }
    else if(operate.equals("sin")){
        double i= getNumberFromText();
        result.setText(String.valueOf(Math.sin(i)));
    }
    else if(operator.equals("x^y")){
        if(getNumberFromText() == 0.0||getNumberFromText() == 1){
            resultNum = getNumberFromText();
        }
        else{
            for(int i=1;i<=getNumberFromText();i++){
            resultNum2 *=resultNum;
        }
        result.setText(String.valueOf(resultNum));
    }
    if(operator.equals("log")){
        double i= getNumberFromText();
        resultNum =Math.log(i);
        result.setText(String.valueOf(resultNum));
    }
    else if(operator.equals("cos")){
        double i= getNumberFromText();
        resultNum =Math.cos(i);
        result.setText(String.valueOf(resultNum));
    }
    else if(operator.equals("tan")){
        double i= getNumberFromText();
        resultNum =Math.tan(i);
        result.setText(String.valueOf(resultNum));
    }
    else if(operator.equals("Exp")){
        double i= getNumberFromText();
        resultNum =Math.exp(i);
        result.setText(String.valueOf(resultNum));
    }       
    else if(operator.equals("x^3")){
        if(getNumberFromText() == 0.0||getNumberFromText() == 1){
            resultNum= getNumberFromText();
        }
        else{
            resultNum= getNumberFromText()*getNumberFromText()*getNumberFromText();
        }
        result.setText(String.valueOf(resultNum));
    }
    else if(operator.equals("n!")){
        double i = getNumberFromText();
        //判断为整数放进行阶乘操作
        if((i%2==0)||(i%2==1)){
            int j = (int)i;  //强制类型转换
            int resultNum=1;
            for(int k=1;k<=j;k++)
                    resultNum *= k;
            result.setText(String.valueOf(resultNum));
        }
        else{
            result.setText("无法求阶乘");
        } 
    }
    else if(operator.equals("x^2")){
        if(getNumberFromText() == 0.0||getNumberFromText() == 1){
             resultNum = getNumberFromText();
        }
        else{
             resultNum = getNumberFromText()*getNumberFromText();
        }
        result.setText(String.valueOf(resultNum));
    }
    // 双精度浮点数的运算
    if(operateValidFlag){
        long t1;
        double t2;
        t1 = (long) resultNum;
        t2 = resultNum - t1;
        if(t2 == 0 ){
            result.setText(String.valueOf(t1));
        }
        else{
            result.setText(String.valueOf(resultNum));
        }
    }
    //运算符等于用户按的按钮
    operator = key;
    firstDigit = true;
    operateValidFlag = true;
}
//从结果文本框中获取数字
private double getNumberFromText(){
    double res = 0;
    try{
        res = Double.valueOf(result2.getText()).doubleValue();
    }
    catch(NumberFormatException e){}
    return res;
}
public static void main(String args[]){
    Jisuanqi c2=new Jisuanqi();
}

}

  • 写回答

2条回答 默认 最新

  • danielinbiti 2015-07-01 09:41
    关注

    代码一贴,基础错误太多

     1、private JButton keys[] = new JButton(KEY.length); //key哪来的,应该是keys吧
     2、变量作用域,JPanel Kpanel = 这都是局部变量,其他函数中怎么能用呢
     3、else if(str.equals("pi")){//这str也不知道是什么
                str.setText(""+3.141592653);
        }
    自己好好编译编译吧。编译通过了再来说逻辑对不对
    
    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题