【问题标题】:While loop will not rerun program only ask for if you want to loop againWhile 循环不会重新运行程序,只询问是否要再次循环
【发布时间】:2015-10-20 04:20:52
【问题描述】:

我正在尝试提示用户输入 Y、y 或 N、n,并使用 while 循环询问他们是否要重新运行程序。我尝试使用 this question 中的代码。我更改了字符串选择 = sc.next();到 in.next();当我运行程序时,一切正常,但是当出现提示并且我回答 y 时,它只会询问我是否要再次运行而不实际运行程序(让用户输入和输出答案)。 n 将正常工作并结束它。感谢您的时间!这让我在这里、youtube 和其他编码论坛上寻找答案很多个晚上。

编辑:我尝试将与贷款相关的代码移动到 while 循环中(在 while 和 boolean 之间),但现在它完全跳过“你想再次计算(y/n):”并直接进入“输入贷款金额:" 不问

package numformexception;

import java.util.Scanner;

public class NumFormException {

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

    //Declare Variables
    double loanNum;
    double rateNum;
    double trateNum;
    double yearNum;
    double monthNum;
    double equNum;
    double outputNum;

    //Prompt for input
    System.out.print("Enter loan amount: ");
    loanNum = Double.parseDouble(in.nextLine());

    System.out.print("Enter rate: ");
    rateNum = Double.parseDouble(in.nextLine());

    System.out.print("Enter number years: ");
    yearNum = Double.parseDouble(in.nextLine());

    //Postive input data check
    if(loanNum <= 0 || rateNum <=0 || yearNum <=0)
    {
        System.out.println("You must enter positive numeric data! ");
        System.exit(0);
    }

    //Convert years to months 
    monthNum = yearNum * 12;

    //Convert rate to percent and monthly
    trateNum= (rateNum / 100) /12; 

    //Complete numerator 
    equNum = Math.pow((1+ trateNum), monthNum );

    //Plug equNum into formula
    outputNum = trateNum * loanNum * (equNum / (equNum - 1));


    System.out.printf("The monthly payment is: $ %.2f%n", outputNum);


    boolean isContinuing = true;

    while( isContinuing) {
        boolean inputIsInvalid = true;
        while (inputIsInvalid) {
            System.out.print("Would you like to calculate again (y/n): ");

            String choice = in.next();

            if("y".equalsIgnoreCase(choice)) {
                inputIsInvalid = false;

            }
            else if("n".equalsIgnoreCase(choice)){
                inputIsInvalid = false;
                isContinuing = false;
            }
            else {
                System.err.print("Error: Only valid answers are Y/N. ");
            }

        }
    }
}

}

【问题讨论】:

    标签: java while-loop


    【解决方案1】:

    你的主计算不会再次运行,因为它不是这个循环的一部分:

    while (isContinuing) {
        // ...
    }
    

    我建议把主要的计算逻辑移到一个方法中,例如:

    private static void calculateLoan(Scanner in) {
        //Declare Variables
        double loanNum;
        double rateNum;
        double trateNum;
        double yearNum;
        double monthNum;
        double equNum;
        double outputNum;
    
        //Prompt for input
        System.out.print("Enter loan amount: ");
        loanNum = Double.parseDouble(in.nextLine());
    
        System.out.print("Enter rate: ");
        rateNum = Double.parseDouble(in.nextLine());
    
        System.out.print("Enter number years: ");
        yearNum = Double.parseDouble(in.nextLine());
    
        //Postive input data check
        if (loanNum <= 0 || rateNum <= 0 || yearNum <= 0) {
            System.out.println("You must enter positive numeric data! ");
            System.exit(0);
        }
    
        //Convert years to months 
        monthNum = yearNum * 12;
    
        //Convert rate to percent and monthly
        trateNum = (rateNum / 100) / 12;
    
        //Complete numerator 
        equNum = Math.pow((1 + trateNum), monthNum);
    
        //Plug equNum into formula
        outputNum = trateNum * loanNum * (equNum / (equNum - 1));
    
        System.out.printf("The monthly payment is: $ %.2f%n", outputNum);
    }
    

    然后更改main 方法,使其在循环内调用新的calculateLoan 方法:

    public static void main(String[] args) {
    
        Scanner in = new Scanner(System.in);
    
        boolean isContinuing = true;
    
        while (isContinuing) {
    
            calculateLoan(in);
    
            boolean inputIsInvalid = true;
            while (inputIsInvalid) {
                System.out.print("Would you like to calculate again (y/n): ");
    
                String choice = in.next();
    
                if ("y".equalsIgnoreCase(choice)) {
                    inputIsInvalid = false;
    
                } else if ("n".equalsIgnoreCase(choice)) {
                    inputIsInvalid = false;
                    isContinuing = false;
                } else {
                    System.err.print("Error: Only valid answers are Y/N. ");
                }
    
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      唯一会循环的代码是在您的 while 循环中的代码。因此,与贷款相关的代码都不会循环是完全有道理的。如果您希望它循环,您必须首先将其放入一个循环中,可能在 while 继续 while 循环中,该循环应该包含您的 main 方法中的几乎所有内容,变量声明之后的所有内容。

      【讨论】:

      • 感谢您的回复!我尝试将与贷款相关的代码移动到 while 循环中,但现在它完全跳过了“您想再次计算(y/n):”并直接进入“输入贷款金额:”而不询问用户。
      • @JavaPeasant:那么你做错了——while continue 循环需要包含所有内容,包括 inputIsInvalid while 循环。您的错误向我表明,您没有通过程序进行心理思考的重要步骤,以在您的脑海中了解其逻辑是如何流动的。请立即开始执行此操作,因为它是解决此问题以及解决所有未来问题的宝贵工具。
      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 2015-09-28
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多