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)) 行进行实验,因为我认为这是我的代码无法正常工作的唯一原因。我真的不知道如何解决这些问题
如果这是作为练习提供给您的,那么它会尝试教您如何编写解析器。只要你在努力,你就没有找到正确的结构,一旦你找到了结构,你就会发现它对于你可能想要解析的数字或“语言”来说非常重复。
一些聪明人已经足够重复地编写了解析器生成器。您输入语法,它会将其编译成现成的解析器源代码。
ANTLR 是 Java 生态系统中众所周知的工具,解析数学表达式甚至是他们主页上的快速入门教程:https://www.antlr.org/