CommandLine Java计算器计算错误

ppcbkaq5  于 2023-01-29  发布在  Java
关注(0)|答案(7)|浏览(145)

我刚学了java,问了一个关于我的一行计算器的问题,它不再出错了,但是它计算错误。

import java.util.Scanner;

public class omg {
    public static void main(String args[]) {
        int fnum,snum,anum = 0;
        String strtype;
        char[] testchar;
        char currentchar;
        int machinecode = 0;
        String tempnumstr;
        int operatorloc = 0;
        char[] tempnum = new char[256]; 
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter The Calculation: ");
        strtype = scan.nextLine();
        testchar = strtype.toCharArray();
        for(int b = 0; b < testchar.length; b++)
        {
            currentchar = testchar[b];
            if(currentchar == '+') {
                machinecode = 1;
                operatorloc = b;
            }
            else if(currentchar == '-') {
                machinecode = 2;
                operatorloc = b;
            }
            else if(currentchar == '*') {
                machinecode = 3;
                operatorloc = b;
            }
            else if(currentchar == '/') {
                machinecode = 4;
                operatorloc = b;
            }
        }
        for(int t = 0;t < operatorloc;t++) {
            tempnum[t] = testchar[t];
        }
            tempnumstr = new String(tempnum).trim();
            fnum = Integer.parseInt(tempnumstr);
        for(int temp = operatorloc;temp < testchar.length;temp++) {
            for(int t = 0;t<(testchar.length-operatorloc);t++) {
                tempnum[t] = testchar[temp];
            }
        }
        tempnumstr = new String(tempnum).trim();
        snum = Integer.parseInt(tempnumstr);
        switch(machinecode) {
        case 1:
            anum = fnum + snum;
            break;
        case 2:
            anum = fnum - snum;
            break;
        case 3:
            anum = fnum * snum;
            break;
        case 4:
            anum = fnum / snum;
        }
        System.out.println(anum);
    }
}

这个代码会给予8+8 = 96,这显然是不正确的.

carvr3hs

carvr3hs1#

您使用的是哪个IDE?Eclipse吗?在这种情况下,您真的应该尝试一下调试透视图
我简单地逐步通过您的程序,发现以下内容:
在此行:

tempnumstr = new String(tempnum).trim();

tempnum等于{ 8, 8 }temunumstr变为88(这就是为什么您会得到88 + 8 = 96)
我必须说这个程序有点混乱,而且不是真正的创建计算器的方法。你真的把一个复杂的任务作为第一个练习;-)
不过,我觉得你应该改变

for (int temp = operatorloc; temp < testchar.length; temp++) {
    for (int t = 0; t < (testchar.length - operatorloc); t++) {
        tempnum[t] = testchar[temp];
    }
}
tempnumstr = new String(tempnum).trim();

只有一条线

tempnumstr = strtype.substring(operatorloc + 1);

(At那么至少对于输入8+8给出16)。

fdx2calv

fdx2calv2#

第二项的循环出错,您正在嵌套循环,请将其更改为

for (int temp = operatorloc+1, t=0 ;temp < testchar.length;temp++, t++ ) {
    tempnum[t] = testchar[temp];
}

而且它会起作用的
原始循环

for (int temp = operatorloc;temp < testchar.length;temp++) {
    for (int t = 0;t<(testchar.length-operatorloc);t++) {
        tempnum[t] = testchar[temp];
    }
}

本质上等同于

int temp = testchar.length-1;
for (int t = 0;t<(testchar.length-operatorloc);t++) {
    tempnum[t] = testchar[temp];//temp doesn't change
}

在开始索引上也有一个1的偏移(这就是+1int temp = operatorloc+1中的来源)。

1wnzp6jl

1wnzp6jl3#

你的逻辑在这里有些错误:

for (int temp = operatorloc; temp < testchar.length; temp++) {
     for (int t = 0; t < (testchar.length - operatorloc); t++) {
        tempnum[t] = testchar[temp];
     }
  }

要查看它在做什么,添加一个println来调试puroses:

for (int temp = operatorloc; temp < testchar.length; temp++) {
     for (int t = 0; t < (testchar.length - operatorloc); t++) {
        tempnum[t] = testchar[temp];
        System.out.println("test: " + new String(tempnum).trim());
     }
  }
xam8gpfp

xam8gpfp4#

尝试在计算前打印fnumsnum,您将看到snum的值为88。您的代码对我来说不明显,因此您应该手动调试和修复:)

wnvonmuf

wnvonmuf5#

你的snum分配是错误的。现在,因为它看起来像家庭作业:)我不打算拼出来。
你还需要了解一些Java命名约定,因为这会使代码更易读。最后一个建议是机器码使用常量。

bis0qfac

bis0qfac6#

你应该下载一个IDE(eclipse Netbeans和IntelliJ都是免费的或者有免费的版本),然后在它们的调试器中执行你的程序,你会很快发现你的错误。
也就是说,不要再把String当作char数组,也不要再使用定长数组,希望它们的大小足够大。String是一个成熟的对象,有很多有用的方法。substring就是其中之一,可以用来提取左右操作数。这比从一个char数组复制到另一个char数组,重用,一个(使用tempnum存储两个操作数的字符,而不将cahr重置为默认值)。

bvjveswy

bvjveswy7#

这里我有一个简单明了但总是正确计算的Java计算器:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Main {

    public static void main(String[] args) {
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("javascript");

    try {
        Object o = engine.eval(allArgs(args));
        System.out.println("The result is = " + o.toString());
    } catch (ScriptException e) {
        System.out.println("Please type in a syntactically correct expression.");
    }
    }

    private static String allArgs(String[] args) {
    StringBuilder sb = new StringBuilder();
    for (String s : args) {
        sb.append(s);
    }
    return sb.toString();
    }

}

调用程序并查看结果

相关问题