mini dc与简易计算器 20165235

mini dc

任务内容

本次mini dc任务就是通过补充代码来实现整型数据的后缀表达式计算

相关知识

  • 通过利用堆栈这一先进后出的数据结构来实现后缀表达式的计算。通过Stack<Integer> stack建立一个为int类型的堆栈stack。可以使用stack.push();来进行压栈,stack.pop();来进行弹栈。
  • 通过调用private boolean isOperator (String token)来判断按空格标记分隔好的String数据是否为运算符。
  • 使用正则表达式“[0-9]+”来判断是否为字符整数类型。
  • StringTokenizer类是一种可以按不同的风格对String类型数据做分隔,有两种构造方法。StringTokenizer(String s),则按照空格,换行,Tab等符号来做分隔标记。StringTokenizer(String s,String delim)则按照delimit字符序列中的任意排列来作为分隔标记。

    实现代码

    import java.util.Stack;
    import java.util.StringTokenizer;
    import java.util.*;
    public class MyDC
    {
    /** constant for addition symbol */
    private final char ADD = ‘+‘;
    /** constant for subtraction symbol */
    private final char SUBTRACT = ‘-‘;
    /** constant for multiplication symbol */
    private final char MULTIPLY = ‘*‘;
    /** constant for division symbol */
    private final char DIVIDE = ‘/‘;
    /** the stack */
    private Stack<Integer> stack;
       // MyDC my= new MyDC();
    public MyDC() {
        stack = new Stack<Integer>();
    }
    
    public int evaluate (String expr)
    {
        int op1, op2, result = 0;
        String token;
        StringTokenizer tokenizer = new StringTokenizer (expr);
        while (tokenizer.hasMoreTokens())
            {
            token = tokenizer.nextToken();
                //System.out.println(token);
            //如果是运算符,调用isOperator
            if (isOperator(token))
            {
                char []c=token.toCharArray();
                op1=stack.pop();
                //从栈中弹出操作数2
                op2=stack.pop();
                //从栈中弹出操作数1
                result=evalSingleOp(c[0],op1,op2);
                //根据运算符和两个操作数调用evalSingleOp计算result;
                stack.push(result);
                //计算result入栈;
            }
            else{
                //如果是操作数
                if(token.matches("[0-9]+")) {
                    int number=Integer.parseInt(token);
                    stack.push(number);
                }
            }
        }
        return result;
    }
    
    private boolean isOperator (String token)
    {
        return ( token.equals("+") || token.equals("-") ||
                token.equals("*") || token.equals("/") );
    }
    
    private int evalSingleOp (char operation, int op1, int op2)
    {
        int result = 0;
    
        switch (operation)
        {
            case ADD:
                result = op1 + op2;
                break;
            case SUBTRACT:
                result = op1 - op2;
                break;
            case MULTIPLY:
                result = op1 * op2;
                break;
            case DIVIDE:
                result = op1 / op2;
        }
    
        return result;
    }
    }

    代码运行截图

    简易计算器

    任务内容

    实现一个简易计算器Calc,支持+ - x /%运算, 从命令行传入计算数据,Calc计算器可以进行简单的计算。

    相关知识

  • 要使用到堆栈的一些基本知识,通过Stack<Integer> stack=new Stack<Integer>();来建立一个int数据类型的堆栈,来存放操作数,Stack<Character> stack1=new Stack<Character>();来建立一个char数据类型的堆栈来存放运算符。
  • 使用StringTokenizer fenxi=new StringTokenizer(str);来对输入的String类型的数据进行按空格进行做分隔。
  • 需要通过isOperator来判断是否为运算符,通过matches()和正则表达来判断是否为操作数。

    实现过程

    通过命令行传入String类型的数据,然后对传入的数据进行按空格做分隔标记,然后对分隔好的String数据类进行判断是否为运算符或操作数,如果是运算符则对运算符进行压栈(压入stack1),如果是操作数就i++,并且对操作数进行压栈(压入stacki++,当i=2时就说明stack栈中已经压入两个操作数,所以stack进行两次弹栈,stack1进行一次弹栈,然后调用函数int evalSingleOp (char operation, int op1, int op2);来计算结果,最后将结果返回。

实现代码

import java.io.IOException;
import java.util.*;
public class CalczOperator  {
    /** constant for addition symbol */
    private final char ADD = ‘+‘;
    /** constant for subtraction symbol */
    private final char SUBTRACT = ‘-‘;
    /** constant for multiplication symbol */
    private final char MULTIPLY = ‘x‘;
    /** constant for division symbol */
    private final char DIVIDE = ‘/‘;
    /** constant for MOD symbol */
    private final char MOD = ‘%‘;
    /** the stack */
    Stack<Integer> stack=new Stack<Integer>();
    Stack<Character> stack1=new Stack<Character>();
     int operate(String str)throws IOException {
        int op1,op2,result=0;
        int i=0;
        String string;
        StringTokenizer fenxi=new StringTokenizer(str);
        while (fenxi.hasMoreTokens())
        {
            string = fenxi.nextToken();
            //如果是运算符,调用isOperator
            if (isOperator(string))
            {
                char c[]=string.toCharArray();
                stack1.push(c[0]);
            }
            else{
                //如果是操作数
                if(string.matches("[0-9]+")) {
                    i++;
                    int number=Integer.parseInt(string);
                    stack.push(number);
                    if(i==2){
                        op1=stack.pop();
                        op2=stack.pop();
                        result=result=evalSingleOp(stack1.pop(),op2,op1);
                    }
                }
            }
        }
        return result;
    }
private int evalSingleOp (char operation, int op1, int op2)
        {
        int result = 0;

        switch (operation)
        {
        case ADD:
        result = op1 + op2;
        break;
        case SUBTRACT:
        result = op1 - op2;
        break;
        case MULTIPLY:
        result = op1 * op2;
        break;
        case DIVIDE:
        result = op1 / op2;
        break;
        case MOD:
        result = op1 % op2;
        break;
        }

        return result;
        }
 private boolean isOperator (String token)
    {
        return ( token.equals("+") || token.equals("-") ||
                token.equals("x") || token.equals("/") ||token.equals("%"));
    }

}
import java.io.IOException;
public class Calc  {
    public static void main (String args[]){
        try {
            CalczOperator calczoperator = new CalczOperator();
            String[] prt = new String[args.length];
            for(int i =0;i<args.length;i++){
                prt[i] = args[i];
            }
            String str = prt[0]+" "+prt[1]+" "+prt[2]
            int result = calczoperator.operate(str);
            System.out.println(str + " = " + result);
        }
        catch (IOException e){
            System.out.println("error");
        }
    }
}

代码运行截图:

遇到的问题以及解决过程

当运行代码java Calc 3 * 2,时报错,对其他的运算符都能正常运行出结果,只有*运算符不可以,我在UbuntuWindows的命令行中都运行了一遍,但都会报错。

我通过JDB调试,print args[]中的数值时,args[1]args[2]的数据出错。

所以我认为传入的数据中含有*的原因,所以我用x代替了*进行传值。最后结果正常。

代码链接

  • 简易计算器代码链接
  • mini dc代码链接

    心得体会

    在做简易计算器和mini dc程序时,主要是对堆栈这一数据结构的灵活使用,以后多多练习,可以写出四则混合运算,把计算优先级考虑进去。

原文地址:https://www.cnblogs.com/qy20165235/p/9028258.html

时间: 2024-10-12 20:27:57

mini dc与简易计算器 20165235的相关文章

函数调用_猜数字和简易计算器

package app1; import java.util.*; public class TestFunction{     public static void main(String[] args){         Scanner sc=new Scanner(System.in);         System.out.print("请选择一项应用:\n1.猜数字\n2.简易计算器");         int n=sc.nextInt();         switch(

基于mini2440简易计算器

基于mini2440简易计算器使用的是数组实现,并非逆波兰式,因此功能不够强大,仅供驱动学习,以及C语言基础编程学习之用.有时间读者可以用逆波兰式来实现强大功能计算器,原理也很简单,建议读<c程序设计第二版>里面有算法的代码.读者自行研究.此程序基于电子相册的改进,触摸屏,LCD,字符现实,数字输入等等 mini2440  索尼X35   LCD液晶屏 主函数部分: #include "def.h" #include "option.h" #includ

如何用jsp实现一个简易计算器(三)

做这个jsp页面,主要是为了实现在同一个页面提交和接受数据的功能. 这个小程序存在很多不足,希望大家多多批评指正. <%@ page language="java" contentType="text/html;" pageEncoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w

C# 简易计算器

编写如下界面的简易计算器界面代码: using System; using System.Windows.Forms; using exp; namespace calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } enum symbol { plus,dec,mult,div}; private void button1_Click(object sender, Ev

PyQt5 简易计算器

剩下计算函数(self.calculator)未实现,有兴趣的朋友可以实现它 [知识点] 1.利用循环添加按钮部件,及给每个按钮设置信号/槽 2.给按钮设置固定大小:button.setFixedSize(QtCore.QSize(60,30)) 3.取事件的的发送者(此例为各个按钮)的文本: self.sender().text() [效果图] [源代码] 1 import sys 2 from PyQt5 import QtWidgets,QtCore,QtGui 3 4 5 class E

java简易计算器

此小程序实现了计算器的基本功能: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SimpleCalc extends JFrame{ private static final long serialVersionUID = 1L; String[] labels = {"←","CE","±","√", "

js css 实现简易计算器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

结对-简易计算器-设计文档

项目:简易计算器 本设计的大概需要的功能:1.可以判断是小数点前还是后 2.需要初始化小数点后的倍率 3.可以标记加减乘除 4.需要记录上一轮结果 5.实现每个数字按钮和算数按钮

【C++探索之旅】第一部分第五课:简易计算器

内容简介 1.第一部分第五课:简易计算器 2.第一部分第六课预告:控制流程,随心所至 简易计算器 上一课<[C++探索之旅]第一部分第四课:内存,变量和引用>中,我们已经学习了挺重要的内存的概念,变量的知识,对引用这个C++中常用的技术也有了初步的了解. 我们在上一课开头处用一个小小计算器的存储技术引出内存的概念.其实我们的电脑兄也是一个计算器,只不过高端大气上档次了很多,不然怎么会被称为 computer呢?英语中compute这个词,正是<计算>的意思,而加上r就构成了名词.c