我对编程本身并不陌生,我已经研究了C#已经有一段时间了,但我自己并没有真正做过很多练习,我现在刚开始使用java,因为我想做Android应用程序和测试我新获得的知识我想做一个基本的控制台计算器,这是我到目前为止所得到的:
package calculatorSource;
import java.util.*;
public class calculatorJava {
private static Scanner input;
public static void main(String[] args) {
System.out.println("Select an operation");
String choice = null;
input = new Scanner(System.in);
while(choice == null) {
System.out.println("Type 'a' for adition, 's' for subtraction, 'm' for multiplication," + " 'd' for division, or 'mo' for module.");
choice = input.next();
}
while(choice != null) {
if(choice.equals("a")) {
System.out.println(adition(0, 0));
choice = null;
} else if(choice.equals("s")) {
System.out.println(subtraction(0, 0));
choice = null;
} else if(choice.equals("m")) {
System.out.println(multiplication(0, 0));
choice = null;
} else if(choice.equals("d")) {
System.out.println(division(0, 0));
choice = null;
} else if(choice.equals("mo")) {
System.out.println(module(0, 0));
choice = null;
} else {
System.out.println("Option not available, please try again.");
choice = null;
}
}
}
public static float adition(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 + n2;
System.out.println("Result is: " + result);
return adition(result, result);
}
public static float subtraction(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 - n2;
System.out.println("Result is: " + result);
return subtraction(result, result);
}
public static float multiplication(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 * n2;
System.out.println("Result is: " + result);
return multiplication(result, result);
}
public static float division(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 / n2;
System.out.println("Result is: " + result);
return division(result, result);
}
public static float module(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 % n2;
System.out.println("Result is: " + result);
return module(result, result);
}
}
我知道它可能不是那里最好或更有效的计算器,但正如我所说,我刚开始使用java,这是我目前所知的全部,程序正常,因为我可以添加,一个分区或我选择的其他任何东西,但在那之后,我希望它给我选择一个不同的操作,我在返回后把“choice = null”放在右边,但它似乎并没有起作用,我到目前为止,我已经尝试了几种方法,但我开始认为我可能误解了实际上有什么回报,所以我认为最好向你们寻求帮助。
感谢任何建议,谢谢!
答案 0 :(得分:3)
而不是
return adition(result, result);
在adition
方法中,返回result
。
否则你只是重复相同的方法,直到堆栈溢出。 (同样适用于其他方法)。
您的while (choice != null) {
循环不是必需的,因为您始终设置choice = null;
。由于您也没有在该循环中更改choice
的值,您也可以删除循环。
将参数传递到adition
(等)方法没有意义,因为您始终会覆盖它们。只需在这些方法中将它们声明为局部变量:
public static float adition() { // No parameters
// ...
float n1 = input.nextFloat();
// ...
float n2 = input.nextFloat();
答案 1 :(得分:2)
您无限地递归调用所有方法。 choice = null没问题。如果您要更正您的代码,它将终止:
而不是
- (IBAction)youraction:(id)sender
{
[self.subclassedView resetPath];
}
写一下
MethodaName(result, result);
如果在方法本身中从用户那里获取输入,也不需要传递任何参数。
答案 2 :(得分:1)
似乎你误解了函数内部的return语句。 每当我们在java中调用一个函数/方法时,它应该有一个返回类型,返回的值应该是函数在处理参数后实际返回的值。
因此在你的情况下,加法功能应该是这样的
public static float adition(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 + n2;
System.out.println("Result is: " + result);
return result;
}
此处结果变量是您为其创建的函数的已处理值。
在你的情况下,你在return语句中调用相同的函数,它正在成为一个递归函数,在递归函数中,我们总是需要一个break语句来实现它。
答案 3 :(得分:1)
你可以做两件事。
如果您只想运行一次操作,而不是
return addition(result,result)
使用
return result.
2。假设您想要运行添加循环,直到用户说,他想要做一些其他操作,然后使用全局变量并假设您在用户输入-999时添加条件然后返回。 因此,在第二种情况下,adition循环一直运行直到用户输入-999。
import java.util.*;
public class calculatorJava {
private static Scanner input;
static int flag = 1;
public static void main(String[] args) {
System.out.println("Select an operation");
String choice = null;
input = new Scanner(System.in);
while (choice == null) {
System.out.println(
"Type 'a' for adition, 's' for subtraction, 'm' for multiplication,"
+ " 'd' for division, or 'mo' for module.");
choice = input.next();
}
while (choice != null) {
if (choice.equals("a")) {
flag = 1;
System.out.println(adition(0, 0));
//choice = null;
} else if (choice.equals("s")) {
flag = 1;
System.out.println(subtraction(0, 0));
//choice = null;
} else if (choice.equals("m")) {
flag = 1;
System.out.println(multiplication(0, 0));
//choice = null;
} else if (choice.equals("d")) {
flag = 1;
System.out.println(division(0, 0));
//choice = null;
} else if (choice.equals("mo")) {
flag = 1;
System.out.println(module(0, 0));
//choice = null;
} else {
System.out.println("Option not available, please try again.");
choice = null;
}
}
}
public static float adition(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
if(n1 == -999){
flag = 0;
}
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 + n2;
System.out.println("Result is: " + result);
if(flag==0)
return result;
return adition(result, result);
}
public static float subtraction(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
if(n1 == -999){
flag = 0;
}
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 - n2;
System.out.println("Result is: " + result);
if(flag==0)
return result;
return subtraction(result, result);
}
public static float multiplication(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
if(n1 == -999){
flag = 0;
}
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 * n2;
System.out.println("Result is: " + result);
if(flag==0)
return result;
return multiplication(result, result);
}
public static float division(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
if(n1 == -999){
flag = 0;
}
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 / n2;
System.out.println("Result is: " + result);
if(flag==0)
return result;
return division(result, result);
}
public static float module(float n1, float n2) {
input = new Scanner(System.in);
float result;
System.out.println("Enter first number:");
n1 = input.nextFloat();
if(n1 == -999){
flag = 0;
}
System.out.println("Enter second number:");
n2 = input.nextFloat();
result = n1 % n2;
System.out.println("Result is: " + result);
if(flag==0)
return result;
return module(result, result);
}
}
答案 4 :(得分:1)
再问一次
首先,你的while循环没有用,IF可能就足够了,但是因为你检查之前的值(在第一个循环中)是没用的
这是循环你代码的一种可能性。
boolean letDoMath = true;
while(letDoMath ) { // aka while(letDoMath == true){
while(choice == null) {
System.out.println("Type 'a' for adition, 's' for subtraction, 'm' for multiplication," + " 'd' for division, or 'mo' for module.");
choice = input.next();
}
//HERE YOU KNOW CHOISE ISN'T NULL BECAUSE OF THE WHILE LOOP, NO NEED TO CHECK AGAIN.
if(choice.equals("a")) {
System.out.println(adition(0, 0));
choice = null;
} else if(choice.equals("s")) {
System.out.println(subtraction(0, 0));
choice = null;
} else if(choice.equals("m")) {
System.out.println(multiplication(0, 0));
choice = null;
} else if(choice.equals("d")) {
System.out.println(division(0, 0));
choice = null;
} else if(choice.equals("mo")) {
System.out.println(module(0, 0));
choice = null;
} else if(choice.equlas("end"){
letDoMath = false;
}
}
布尔值允许您再次循环,直到输入end
。这当然不完美,但这是一个开始。 (我没有尝试甚至在IDE中编写它,因此可能包含错误。
操作方法错误
在任何地方都精确,你的操作方法是递归的,最后添加调用本身。删除返回加法(x,y)并返回你所做的加法结果。
一些改进的想法: