当前位置: 首页 > 知识库问答 >
问题:

解析器计算器总是显示相同的输出

东方灵均
2023-03-14

我试图编写一个简单的复数计算器,可以计算以下表达式:

  • 输入1:(10 30i)(90 20i)
  • 预期输出:(100 50i)
  • 输入2:(10 30i)-(90 20i)
  • 预期输出:(-80 10i)

编辑:我注意到第一个前瞻性读数是10,而不是0。我如何解决这个问题?

我的代码

import java.io.*;
import static java.util.Objects.requireNonNull;

public class Parser {

    private int lookahead;
    private StreamTokenizer tokenizer;
    private final Reader input;
    private final Writer output;
    
    
    public Parser(Reader input, Writer output) throws IOException {
        this.input = requireNonNull(input);
        this.output = requireNonNull(output);
        this.lookahead = this.input.read();
    }
    
    private void next() throws IOException {
        lookahead = tokenizer.nextToken();
    }
    
    private void match(int expected) throws IOException {
        
        if (lookahead != expected) {
            
            switch(expected) {
            
                case '(':
                    System.out.println("Error, missing opening round bracket.");
                    break;
                
                case ')':
                    System.out.println("Error, missing closing round bracket.");
                    break;
                    
                case 'i':
                    System.out.println("Error, missing i");
                    break;
                    
                case '+':
                    System.out.println("Error, missing +");
                    
                default:
                    return;
            }
        } else {
            next();
        }
    }
    
    private void parseExpr() throws IOException {
      
       long[] parameters = new long[4];
       int i = 0;
       
        if (lookahead == '(') {
            match('(');
            
            if (lookahead == StreamTokenizer.TT_NUMBER) {
                parameters[i] = lookahead;
                i++;
                next();
                
            } else {
                System.out.println("Not a number.");
                return;
            }
            
            match('+');
            
            if (lookahead == StreamTokenizer.TT_NUMBER) {
                parameters[i] = lookahead;
                i++;
                next();
            } else {
                System.out.println("Not a number.");
                return;
            }
            
            match('i');
            match(')');
            
            if(lookahead == '+'){
                next();
                parseExpr();
                System.out.println("(" + (parameters[0]+parameters[2]) + "+" +(parameters[1]+parameters[3]) + "i)");
            }
            
            if(lookahead == '-'){
                next();
                parseExpr();
                System.out.println("(" + (parameters[0]-parameters[2]) + "+" +(parameters[1]-parameters[3]) + "i)");
            }
        }
        
        System.out.println("Sorry, I can't help you");
    }
    
    public static void main(String[] args) throws IOException {
        InputStreamReader reader = new InputStreamReader(System.in);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        OutputStreamWriter writer = new OutputStreamWriter(outputStream);

        Parser parse = new Parser(reader, writer);
        parse.parseExpr();

        writer.close(); // Close and flush output stream writer.

        String output = outputStream.toString();
        System.out.println("Output generated by parser: " + output);
    }
}

但它总是输出“对不起,我帮不了你。”

共有1个答案

鲁城
2023-03-14

我已经测试了您的代码,我有两条意见可以帮助您:

  1. 您总是收到相同的错误消息,因为您还没有inizializeTokenizer,请尝试使用Tokenizer=new StreamTokenizer(阅读器);在main方法中。
  2. 修复后,您会注意到,您收到了错误“错误,缺少i”,因为在名为“下一步”的方法之后,属性“展望”的值为“-3”,但“i”的ascii值为105。

我希望这是有帮助的,让我知道。

 类似资料:
  • 我有一个棘手的问题要解决。我使用系统。方法调用之前和之后的currentTimeMillis(),因为我必须测量这两条语句之间经过的时间。 我担心的是每次运行程序都会得到不同的结果。 我明白了(这很完美): 几秒钟后,我再次运行程序,我得到(这是错误的): 我说这个输出是错误的,因为每辆车的等待时间不应该少于100毫秒。 什么实际影响基于currentTimeMillis函数的时间计算? 为什么我

  • 我是机器人和爪哇的新手。我已经构建了一个计算器,当我输入3个输入时,我需要它来自动显示结果,但我不知道该怎么做。 我将multiply添加到了一个文本视图(通过属性onclick),它可以工作,但我希望它能在textview中自动显示。

  • 我想知道“计数器”和“米”类维护的计数之间是否有区别?我也了解仪表测量速率,但我很好奇,如果同时有一个计数器和一个仪表更新(为计数器递增),我会认为这两个数字是相同的。我这个假设是错的吗?

  • 我目前有一个由两个计算变量组成的变量。我需要将输出的变量显示为包含一千个分隔符的货币。 在本例中,用户输入房间的宽度和长度,然后java计算并告诉用户所需的数量。我将在下面添加我的代码,以帮助了解这是如何工作的。 我们将不胜感激。谢谢 这是计算变量: 您可以在此处查看此页面的完整javascript:https://jsfiddle.net/3yw4m7kj/

  • 我们正计划将Graphql用于编排(For e.用户界面客户端调用图形ql服务,该服务转到多个Restendpoint并返回结果)。这里的问题是,从一个Restendpoint,我们必须根据客户端请求的字段传递不同类型的查询参数。 我们使用Spring Bootgraphql和graphql java工具库来初始化graphql 我的代码解析用户字段并调用restendpoint,以便在一次调用(

  • 本文向大家介绍JavaScript计时器示例分析,包括了JavaScript计时器示例分析的使用技巧和注意事项,需要的朋友参考一下 1.什么是JavaScript计时器? 在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。 2.计时器类型 一次性计时器:仅在指定的延迟时间之后触发一次。 间隔性触发计时器:每隔一定的时间间隔就触发一次 3.计时器方法 1