制作一个简单的计算器,但输入是一行(新手)

问题描述 投票:0回答:1
package kotauto;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class calculator {

    static double addition(int a, int b)
    {
        return a + b;
    }
    
    static double subtraction(int a, int b)
    {
        return a - b;
    }
    
    static double multiplication(int a, int b)
    {
        return a * b;
    }
    
    static double division(int a, int b)
    {
        return a / b;
    }
    
    static double exponentiation(int a, int b)
    {
        double z=1;
        for(int i=1; i<=b; i++)
        {
            z= z*a;
        }
        return z;
    }
    
    static double root_extraction(double a)
    {
        return Math.sqrt(a);
    }

    
    public static void main(String[] args)
    {
        
        
        System.out.print("WELCOME TO THE CALCULATOR"+'\n');
        
        Scanner s = new Scanner(System.in); // scanner 
        ArrayList<Character> cal = new ArrayList<>();
        String z = s.next();
        
        for(int i=0; i<z.length(); i++)
        {
            cal.add(z.charAt(i));
        }
        
        
        int num1 = 0;
        int j =1;
        int x = 0;

for(int i=0; i<z.length(); i++)
{
     for(int k=0; k<z.length(); k++)
     {                                                                     if(!Character.isDigit(cal.get(k)))
{
  j =(int)Math.pow(10, k-1);                                                    break;
}
else
{
x++;
}
}
if(Character.isDigit(cal.get(i)))
{
int n = Character.getNumericValue(cal.get(i));
num1 += j*n;
j=j/10;             
}
else {
break;
}
                            
}
    int num2= 0;
    int l =1;
        for(int i=0; i<z.length(); i++)
        {
           for(int k=0; k<z.length(); k++)
             {                                                      if(!Character.isDigit(cal.get(k)))                                                      {                                                           l =(int)Math.pow(10, k-1);                                                              break;                                                      }
}
                                        if(Character.isDigit(cal.get(i)))
{
int n = Character.getNumericValue(cal.get(i));
num2 += l*n;
l=l/10;
}
                                
}   
            
                switch(cal.get(x-1))
                {
                case '+':
                {
                    System.out.println(addition(num1, num2));
                    break;
                
                }
                case'-':
                {
                    System.out.println(subtraction(num1, num2));
                    break;
                }
                case'/':
                {
                    System.out.println(division(num1, num2));
                    break;
                }
                case '*':
                {
                    System.out.println(multiplication(num1, num2));
                    break;
                }
                case '^':
                {
                    System.out.println(exponentiation(num1, num2));
                    break;
                }
                case's':
                {
                    System.out.println(root_extraction(num1));
                    break;
                }
                
            
                }
    
    
                
        s.close();
    }

}

我面临的问题是,如果我输入一个具有多个数字的数字,我会在 switch(cal.get(x-1)) 行收到 java.lang.IndexOutOfBoundsException ,而且当我输入一个仅由一个数字组成的数字,控制台显示结果,其中(在相加时)第一个数字被添加两次,或者(在相乘时)结果带有第一个数字的相加平方,它可能在另一个中也不起作用但我有点懒得解码它。另外,根提取工作效率非常低,因为我需要在 s 之后输入一些随机数,否则它不会编译而不给我一个异常

顺便说一句,我对代码的糟糕显示和缺乏制表符感到抱歉,但这是我第一次使用堆栈溢出,我根本不知道该怎么做

我尝试使用 switch(cal.get(x-1)) 行进行实验,因为我认为这是我的代码无法正常工作的唯一原因。我真的不知道如何解决这些问题

java arraylist calculator
1个回答
0
投票

如果这是作为练习提供给您的,那么它会尝试教您如何编写解析器。只要你在努力,你就没有找到正确的结构,一旦你找到了结构,你就会发现它对于你可能想要解析的数字或“语言”来说非常重复。

一些聪明人已经足够重复地编写了解析器生成器。您输入语法,它会将其编译成现成的解析器源代码。

ANTLR 是 Java 生态系统中众所周知的工具,解析数学表达式甚至是他们主页上的快速入门教程:https://www.antlr.org/

© www.soinside.com 2019 - 2024. All rights reserved.