计算器的设计与实现(实验准备)

实验项目1 计算器的设计与实现

实验目的
(1)能通过设计的按钮控件实现简单的算术运算,要求表达式能在编辑框中显示,能将运算结果,输出在编辑框内显示;
(2)能够实现混合运算的求解,算数表达式中包括加减乘除括号等运算符;并且能够识别括号,优先级正确。
(3)能保存历史的表达式运算记录。
实验工具
idea,使用java控制台来完成编写。
算法思路
中缀表达式;后缀表达式。

双栈算符优先级法。
(1)当扫描到的是运算数,则将其压入栈OPND,
(2)当扫描到的是运算符时:
如果这个运算符比OP栈顶的优先级高,则入栈;
如果这个运算符比OP栈顶的运算符优先级低,则从OPND栈中弹出两个运算数,从OP栈中弹出栈顶运算符进行运算,并将结果压入栈OPND。
(3)继续处理当前字符,直到遇到结束符为止。
JAVA程序设计

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator extends JFrame{
}

首先新建一个新建一个继承自 JFrame 的 Calculator类,接下来进行窗口的实现。

设置按键及文本框位置,总体布局(例)

 //设置窗口
        JFrame jf = new JFrame ("计算器");
        jf.setLayout(null);

        //放置数字0
        button0 = new JButton("0");
        button0.setBounds(20, 200, 145, 25);
        jf.add(button0);

        expressText = new JTextField();
        expressText.setBounds(20, 10, 300, 30);
        jf.add(expressText);

接着,插入监听器

设置运算符符号为红色,便于分辨

buttonadd.setForeground(Color.red);
        buttonequal.setForeground(Color.red);
        buttonexcept.setForeground(Color.red);
        buttonleft.setForeground(Color.red);
        buttonright.setForeground(Color.red);
        buttonreduce.setForeground(Color.red);
        buttonride.setForeground(Color.red);

接着,设置按动各按键后的处理(例)

public void actionPerformed(ActionEvent e) {
        //当按钮为0时;e.getSource获取事件源
        if(e.getSource().equals(button0)) {
            s=numberText.getText();
            if(s.length()>8) {

            }
            else if(s.equals("0") || equalbook == 1) {

            }else {
                numberText.setText(s + "0");
            }
        }

中缀表达式转换为逆波兰表达式,考虑符号优先级

String[] ansString = new String[100];
                int Size = 0;
                //创建一个栈
                Stack<Character> Operater = new Stack<Character>();

                s = expressText.getText();
                char ch[] = s.toCharArray();
                int length = ch.length;
                for(int j = 0; j < length; j++) {
                    //当数组元素为数字时
                    if(ch[j] >='0' && ch[j] <= '9') {
                        double Number = ch[j] - '0';
                        //继续往后遍历,直到不是数字和小数点
                        //记录小数点是否出现
                        int point = 0;
                        int bit = 1;
                        if(j==length-1) {
                            ansString[Size++] = String.valueOf(Number);
                        }
                        for(j++; j<length; j++) {
                            if((ch[j] < '0' || ch[j] >'9') && ch[j]!='.') {
                                j--;
                                ansString[Size++] = String.valueOf(Number);
                                break;
                            }
                            if(ch[j] == '.') {
                                point = 1;
                                continue;
                            }
                            if(ch[j] >= '0' && ch[j] <= '9') {
                                /*
                                 * 当小数点没有出现时和没出现时要分开讨论
                                 */
                                if(point == 0) {
                                    Number = Number * 10 + (ch[j] - '0');
                                } else {
                                    Number = Number + Math.pow(10, -bit) * (ch[j]-'0');
                                    bit++;
                                }
                            }
                        }
                    } else { //考虑运算符
                        if(ch[j] =='(') {
                            Operater.push('(');
                        } else if(ch[j]==')') {
                            while(!Operater.peek().equals('(')) {
                                ansString[Size++] = String.valueOf(Operater.peek());
                                Operater.pop();
                            }
                            Operater.pop();
                        } else {
                            if(Operater.empty()) {
                                Operater.push(ch[j]);
                            }
                            else {
                                while(true) {
                                    if(Operater.empty()) {
                                        Operater.push(ch[j]);
                                        break;
                                    }
                                    char operater1 = Operater.peek();
                                    if((ch[j] == '*' || ch[j] == '/') &&
                                            (operater1=='+' || operater1=='-') || (operater1=='(' || operater1 == ')')) {
                                        Operater.push(ch[j]);
                                        break;
                                    }
                                    else {
                                        ansString[Size++] = String.valueOf(Operater.peek());
                                        Operater.pop();
                                    }
                                }
                            }
                        }
                    }
                }
                while(!Operater.empty()) {
                    ansString[Size++] = String.valueOf(Operater.peek());
                    Operater.pop();
                }
                //最后计算逆波兰表达式的值
                Stack<Double> Last = new Stack<Double>();
                for(int i=0; i<Size; i++) {
                    String s1 = ansString[i];
                    char ch2[] = s1.toCharArray();
                    if(ch2[0]>='0' && ch2[0]<='9') {
                        Last.push(Double.parseDouble(s1));
                    }
                    else {
                        double num1 = Last.pop();
                        double num2 = Last.pop();
                        double num3 = 0;
                        if(ch2[0]=='+')
                            num3 = num2 + num1;
                        else if(ch2[0]=='-')
                            num3 = num2 - num1;
                        else if(ch2[0]=='*')
                            num3 = num2 * num1;
                        else if(ch2[0]=='/')
                            num3 = num2 / num1;
                        Last.push(num3);
                    }
                }
                expressText.setText(expressText.getText() + "=" + Last.pop());
                equalbook = 1;
            }
        }
    }
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单计算器设计实现 2.4 代码部分 #include #include #define TRUE 1 #define FALSE 0 #define MAXNUM 100 typedef int DataType; struct SeqStack { DataType s[MAXNUM]; int t; }; typedef struct SeqStack *PSeqStack; PSeqStack createEmptyStack_seq() { PSeqStack pastack; pastack=(PSeqStack)malloc(sizeof(struct SeqStack)); if (pastack==NULL) { printf("超出空间!!\n"); } else { pastack->t=-1; } return pastack; } int isEmptyStack_seq(PSeqStack pastack) { return pastack->t==-1; } void push_seq(PSeqStack pastack, DataType x) { if (pastack->t >= MAXNUM - 1) printf("溢出!\n"); else { pastack->t = pastack->t+1; pastack->s[pastack->t]=x; } } void pop_seq(PSeqStack pastack) { if (pastack->t==-1) { printf("未溢出!\n"); } else { pastack->t = pastack->t-1; } } DataType top_seq(PSeqStack pastack) { return pastack->s[pastack->t]; } int infixtoSuffix(const char* infix, char* suffix) { /*将中缀表达式转换为后缀表达式,顺利转换返回true,若转换过程中发现中缀表达式非法则返回false*/ int state_int = FALSE; /*state_int记录状态,等于true表示刚读入的是数字字符,等于false表示刚读入的不是数字字符, 设置这个变量是为了在每输出一个整数后输出一个空格,以免连续输出的两个整数混在一起。*/ char c, c2; PSeqStack ps = createEmptyStack_seq(); /*运算符栈*/ int i, j = 0; if(infix[0]=='\0') { return FALSE; /*不允许出现空表达式*/ } for(i=0; infix[i]!='\0';i++) { c=infix[i]; switch(c) { case ' ': case '\t': case '\n': if(state_int== TRUE) { suffix[j++]=' ';/*状态从true转换为false时输出一个空格*/ } state_int= FALSE; break; /*遇到空格或制表符忽略*/ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': state_int =TRUE; suffix[j++]=c; /*遇到数字输出*/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值