如何在java中退出返回循环?

时间:2016-05-23 10:58:50

标签: java android return calculator

我对编程本身并不陌生,我已经研究了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”放在右边,但它似乎并没有起作用,我到目前为止,我已经尝试了几种方法,但我开始认为我可能误解了实际上有什么回报,所以我认为最好向你们寻求帮助。

感谢任何建议,谢谢!

5 个答案:

答案 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)

你可以做两件事。

  1. 如果您只想运行一次操作,而不是

    return addition(result,result)
    

    使用

    return result.
    
  2. 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)并返回你所做的加法结果。

一些改进的想法:

  • 创建一个方法来获取一个数字并返回它(在每个方法中都很有用)。
  • 最好的方法是在操作之外询问数字以将值传递给方法,而不是在方法中读取扫描仪。 (当然,您需要确定选择值(实际上,您可以在选择之前询问数字)。并且仅在操作完成后再次询问。