我刚学了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,这显然是不正确的.
7条答案
按热度按时间carvr3hs1#
您使用的是哪个IDE?Eclipse吗?在这种情况下,您真的应该尝试一下调试透视图。
我简单地逐步通过您的程序,发现以下内容:
在此行:
tempnum
等于{ 8, 8 }
,temunumstr
变为88
(这就是为什么您会得到88 + 8 = 96)我必须说这个程序有点混乱,而且不是真正的创建计算器的方法。你真的把一个复杂的任务作为第一个练习;-)
不过,我觉得你应该改变
只有一条线
(At那么至少对于输入
8+8
给出16
)。fdx2calv2#
第二项的循环出错,您正在嵌套循环,请将其更改为
而且它会起作用的
原始循环
本质上等同于
在开始索引上也有一个1的偏移(这就是
+1
在int temp = operatorloc+1
中的来源)。1wnzp6jl3#
你的逻辑在这里有些错误:
要查看它在做什么,添加一个println来调试puroses:
xam8gpfp4#
尝试在计算前打印
fnum
和snum
,您将看到snum
的值为88。您的代码对我来说不明显,因此您应该手动调试和修复:)wnvonmuf5#
你的snum分配是错误的。现在,因为它看起来像家庭作业:)我不打算拼出来。
你还需要了解一些Java命名约定,因为这会使代码更易读。最后一个建议是机器码使用常量。
bis0qfac6#
你应该下载一个IDE(eclipse Netbeans和IntelliJ都是免费的或者有免费的版本),然后在它们的调试器中执行你的程序,你会很快发现你的错误。
也就是说,不要再把String当作char数组,也不要再使用定长数组,希望它们的大小足够大。String是一个成熟的对象,有很多有用的方法。substring就是其中之一,可以用来提取左右操作数。这比从一个char数组复制到另一个char数组,重用,一个(使用
tempnum
存储两个操作数的字符,而不将cahr重置为默认值)。bvjveswy7#
这里我有一个简单明了但总是正确计算的Java计算器:
调用程序并查看结果