Java 我的计算器不是&x27;t正确地调用变量
我正在用java编写一个计算器,它有存储变量的内存。它正确地显示了变量列表、加减和定义变量,但每当我尝试做a=b+1之类的事情时,它都会将b视为0,给“a”一个值1Java 我的计算器不是&x27;t正确地调用变量,java,arraylist,Java,Arraylist,我正在用java编写一个计算器,它有存储变量的内存。它正确地显示了变量列表、加减和定义变量,但每当我尝试做a=b+1之类的事情时,它都会将b视为0,给“a”一个值1 public static void main(String args[]) { Scanner scan = new Scanner(System.in); ArrayList<Integer> values = new ArrayList<>(); ArrayList<Str
public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
ArrayList<Integer> values = new ArrayList<>();
ArrayList<String> variables = new ArrayList<>();
while(scan.hasNextLine())
{
String line = scan.nextLine();
String[] tokens = line.split(" ");
if(!Character.isDigit(tokens[0].charAt(0)) && !line.equals("clear") && !line.equals("var"))
{
int value = 0;
for(int i=0; i<tokens.length; i++)
{
if(tokens.length==1)
{
if(variables.contains(tokens[0]))
{
printAnswer(values.get(variables.indexOf(tokens[0])));
}
else if(!line.equals("quit"))
{
int width = 4 + tokens[0].length();
System.out.printf("%" + width + "s is not defined\n", tokens[0]);
}
break;
}
if(tokens.length==3)
{
value = Integer.parseInt(tokens[2]);
printAnswer(value);
if(variables.contains(tokens[0]))
{
values.set(variables.indexOf(tokens[0]), value);
variables.set(variables.indexOf(tokens[0]), tokens[0]);
}
else
{
values.add(value);
variables.add(tokens[0]);
}
break;
}
else if(tokens[i].charAt(0) == '+')
{
value = addition(tokens, value, variables, values);
printAnswer(value);
if(variables.contains(tokens[0]))
{
values.set(variables.indexOf(tokens[0]), value);
}
else
{
values.add(value);
variables.add(tokens[0]);
}
break;
}
else if(tokens[i].charAt(0) == '-')
{
value = subtraction(tokens, value);
printAnswer(value);
if(variables.contains(tokens[0]))
{
values.set(variables.indexOf(tokens[0]), value);
}
else
{
values.add(value);
variables.add(tokens[0]);
}
break;
}
else if(i==tokens.length-1)
{
System.out.println("No operation");
break;
}
}
}
if(Character.isDigit(tokens[0].charAt(0)))
{
int value = 0;
for(int i=0; i<tokens.length; i++)
{
if(tokens.length==1)
{
value = Integer.parseInt(tokens[0]);
printAnswer(value);
break;
}
else if(tokens[i].charAt(0) == '+')
{
value = addition(tokens, value, variables, values);
printAnswer(value);
}
else if(tokens[i].charAt(0) == '-')
{
value = subtraction(tokens, value);
printAnswer(value);
}
}
}
if(line.equals("clear"))
{
clear(variables, values);
}
if(line.equals("var"))
{
variableList(variables, values);
}
else if(line.equals("quit"))
{
System.exit(0);
}
}
}
public static int addition(String[] a, int b, ArrayList<String> c, ArrayList<Integer> d)
{
for(String item : a)
{
int i=0;
if(Character.isDigit(item.charAt(0)))
{
int val = Integer.parseInt(item);
b = b + val;
i++;
}
else if(Character.isLetter(item.charAt(0)) && i!=0)
{
int val = d.get(c.indexOf(item));
b = b + val;
}
}
return b;
}
public static int subtraction(String[] a, int b)
{
int i=0;
for(String item : a)
{
if(Character.isDigit(item.charAt(0)))
{
int val = Integer.parseInt(item);
if(i==0)
{
b = b + val;
i++;
}
else
{
b = b - val;
}
}
}
return b;
}
public static void clear(ArrayList<String> a, ArrayList<Integer> b)
{
a.clear();
b.clear();
}
public static void variableList(ArrayList<String> a, ArrayList<Integer> b)
{
for(int i=0; i<a.size(); i++)
{
int width = 4 + a.get(i).length();
System.out.printf("%" + width + "s: %d\n", a.get(i), b.get(i));
}
}
public static void printAnswer(int a)
{
int width = 3;
Integer valueToString = a;
String valueString = valueToString.toString();
for(int j=0; j<=valueString.length(); j++)
{
width++;
}
System.out.printf("%" + width + "d\n",a);
}
publicstaticvoidmain(字符串参数[])
{
扫描仪扫描=新扫描仪(System.in);
ArrayList值=新的ArrayList();
ArrayList变量=新的ArrayList();
while(scan.hasNextLine())
{
String line=scan.nextLine();
String[]tokens=line.split(“”);
如果(!Character.isDigit(标记[0].charAt(0))&&&&!line.equals(“清除”)&&&!line.equals(“变量”))
{
int值=0;
对于(int i=0;i我可以向您解释为什么当您输入命令“a+b+1”时,程序将“a”设置为1,但这并不能真正帮助您。您需要仔细查看您的代码,一步一步地检查它,看看是否可以更合理地构造它,因为现在它只是一组串在一起的语句,实际上并没有定义任何有意义的行为。编写注释和使用更有意义的变量名非常有帮助
关于这一点,请注意:
- 您从不在循环中检查“=”符号。这意味着命令:
“a=b+1”
“a+b+1”
…以完全相同的方式进行处理,将值1指定给“a”
- 您的加减法不考虑任何位置。这意味着遇到的第一个运算符将应用于字符串中的所有标记。即:
“一个c+d-3--x5”
…与以下内容完全相同:
“一个c+d+++35 x”
(请注意,这两个字符串完全是胡说八道)
尝试使用调试器逐步检查代码并查看它在做什么。这将对您有很大帮助。请使用注释。这将帮助我们是的,请描述加法中使用的数组是什么。其他人在说什么。如果您告诉我们您的程序是如何工作的,速度会更快。否则,我们必须坐下来思考你可能已经知道了。看起来有200多行,问题可能在任何地方。在循环体中:if(tokens.length==3),你只看其中的两个标记,token[0]和token[2]。但是你想把第一个设置为另外两个的总和。我主要关心的是加法,int val=d.get(c.indexOf(item));未生成正确的值。它似乎得到了0。它应该得到与给定变量对应的值,因为它检查变量的索引并使用值数组中的索引(与变量数组并行)