Java-(While 循环)如何将最后一个输入循环排除在打印变量之外?

Java- (While loop) how to keep last input loop out of printed variables?

我正在编写一个睡眠跟踪器,当我的 while 循环中断时,它将“中断”输入作为我数组的有效输入,我将分享下面的代码以获取更多上下文:

double optHours;
    int nightCount = 0;
    double sleepHistory;
    double historySum = 0;
    int belowAVG = 0;

    Scanner sc = new Scanner(System.in);

    System.out.println("Please enter your optimal sleep time (in hours):");
    optHours = sc.nextDouble();

    System.out.println("Next, enter your recorded sleep history values (in hours) \n" +
                        "Enter a negative value when done:");
    
    sleepHistory = sc.nextDouble();
    double minSleep = Double.MIN_VALUE;

    while (sleepHistory != -1) {
        sleepHistory = sc.nextDouble();
        historySum += sleepHistory;
        nightCount++;
        
        if (sleepHistory < optHours) {
            belowAVG++;
        }

        if (sleepHistory < minSleep) {
            minSleep = sleepHistory;

        }
        
    }

    double avgSleepTime = historySum / nightCount;

    System.out.println("Your sleep report: \n" +
                        nightCount + " nights total. \n" +
                        belowAVG + " nights below your optimal sleep time \n" + 
                        "Lowest sleep time: " + minSleep + "\n" +
                        "Average sleep time: " + avgSleepTime);
}

}

现在,当我 运行 我的代码时,它采用用于中断循环的最后一个输入 (-1) 并将其放入最低睡眠时间变量 (minSleep),它也会输入相同的输入在我的平均计算中使它不可靠。我将为更多上下文添加输出示例:

Please enter your optimal sleep time (in hours):
5
Next, enter your recorded sleep history values (in hours)
Enter a negative value when done:
6
6
6
6
7
8
8.5
-1
Your sleep report:
7 nights total.
1 nights below your optimal sleep time
Lowest sleep time: -1.0
Average sleep time: 5.785714285714286

现在,我的目标是在我的计算中以及在为 minSleep 变量赋值时避免负数(中断输入)

问题是您检查 sleephistory 是否为负数,但立即将其设置为下一个 double 而没有检查下一个 double 是否为负数。我修改了 while 循环,试试看它是否更好。

while (sleepHistory < 0) {
        if(sc.nextDouble() > 0){
            sleepHistory = sc.nextDouble();
        }
        historySum += sleepHistory;
        nightCount++;
        
        if (sleepHistory < optHours) {
            belowAVG++;
        }

        if (sleepHistory < minSleep) {
            minSleep = sleepHistory;

        }
        
    }

您可以修改代码以接收用户的输入并在 while 循环中根据您的条件检查它。通过检查输入的值是否大于或等于 0,代码将继续执行,直到输入任何负值。这将使您的代码更清晰,更易于遵循。您还想将最小睡眠值设置为最大的两倍,因为当您将其设置为可能的最小数字时,它就无法被击败。这导致每次执行程序时都相同 Double.MIN_VALUE。

double optHours;
int nightCount = 0;
double sleepHistory;
double historySum = 0;
int belowAVG = 0;

Scanner sc = new Scanner(System.in);

System.out.println("Please enter your optimal sleep time (in hours):");
optHours = sc.nextDouble();

System.out.println("Next, enter your recorded sleep history values (in hours) \n" +
                    "Enter a negative value when done:");

double minSleep = Double.MAX_VALUE; //set to the biggest value

while ((sleepHistory = sc.nextDouble()) >= 0) //grab data and check it every iteration
{
    historySum += sleepHistory;
    nightCount++;
    
    if (sleepHistory < optHours) {
        belowAVG++;
    }

    if (sleepHistory < minSleep) {
        minSleep = sleepHistory;

    }
    
}

double avgSleepTime = historySum / nightCount;

System.out.println("Your sleep report: \n" +
                    nightCount + " nights total. \n" +
                    belowAVG + " nights below your optimal sleep time \n" + 
                    "Lowest sleep time: " + minSleep + "\n" +
                    "Average sleep time: " + avgSleepTime);

输出

Please enter your optimal sleep time (in hours):
8
Next, enter your recorded sleep history values (in hours) 
Enter a negative value when done:
8
7
8
3
0
5
8
-5
Your sleep report: 
7 nights total. 
4 nights below your optimal sleep time 
Lowest sleep time: 0.0
Average sleep time: 5.571428571428571