Java 为什么不管用户输入是什么,这个方法都返回0?

Java 为什么不管用户输入是什么,这个方法都返回0?,java,Java,方法countqiftpositive返回0,无论我输入什么。我做错了什么 import java.util.Scanner; public class QiftPositivCount { public static void main(String [] args) { Scanner scan = new Scanner(System.in); final int SENTINEL = -9999; int x = 0;

方法
countqiftpositive
返回
0
,无论我输入什么。我做错了什么

import java.util.Scanner;
public class QiftPositivCount 
{
    public static void main(String [] args)
    {
        Scanner scan = new Scanner(System.in);
        final int SENTINEL = -9999;
        int x = 0;
        int count = 0;
        do 
        {
            System.out.print("Type numbers (-9999 to end) : ");
            x = scan.nextInt();
            if(x == SENTINEL)
            {
                break;
            }
            count++;
        }while (x != SENTINEL);

        if(count == 0)
        {
            System.out.println("You didnt type any number");
        }
        else 
        {
            System.out.println("There are " + count + " numbers typed , and the numbers that fulfill the conditon are "
                               + CountQiftPositiv(x));
        }

    }

    private static int CountQiftPositiv(int nr)
    {
        int poz = 0;

        if(nr % 2 == 0 && nr % 3 == 0 && nr > 0)
        {
            poz++;
        }
        return poz;
    }
}

您使用的是while循环之外的
countqiftpositive(x)

使用您拥有的代码,它与调用
countqiftpositive(-9999)

我建议你做一些类似的事情:

do {
  System.out.print("Type numbers (-9999 to end) : ");
  x = scan.nextInt();
  if(x == SENTINEL) {
    break;
  }
  if (CountQiftPositiv(x) > 0) { 
    count++;
  }
} while (x != SENTINEL);

我还建议重新编写循环,因为如果使用
x=scan.nextInt(),则不需要使用
break
您必须返回
0
,因为最后一次输入是
-9999
一个负数,如果(nr%2==0&&nr%3==0&&nr>0)
通常是

尝试更改
SENTINEL
nymber:

countqiftpositive(x)
发送
-9999
,因为当
x=-9999

nr<0
->
poz
将保持在0

我制作了一个
temp
变量,它将接受您的输入,如果输入不等于
SENTINEL
变量,它将设置
x=temp
,从而将
-9999
值从
countqiftpositive()
中移除

此外,当你检查一个数字是多个数字的一个因子时,你所要做的就是将这些数字相乘,然后检查该数字的mod

对于
2
3
,只需检查
6

import java.util.Scanner;

public class QiftPositivCount {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        final int SENTINEL = -9999;
        int temp;
        int x = 0;
        int count = 0;
        do {
            System.out.print("Type numbers (-9999 to end) : ");
            if((temp = scan.nextInt()) == SENTINEL){
                break;
            }else {
                x = temp;
                count++;
            }  

        } while (temp != SENTINEL); // not really needed as you have the break statement

        if (count == 0) {
            System.out.println("You didnt type any number");

        } else {
            System.out.println("There are " + count + " numbers typed , and the numbers that fulfill the conditon are "
                    + CountQiftPositiv(x)); // This was sending -9999 which will always evaluate to false in the function
            //poz will stay at 0 the entire time
        }

    }

    private static int CountQiftPositiv(int nr) {
        int poz = 0;
        //if(nr % 6 && nr > 0){
        if (nr % 2 == 0 && nr % 3 == 0 && nr > 0) {
            poz++;
        }
        return poz;
    }
}

do
-
while
循环抛出除最后输入的整数(如果有)之外的所有用户输入。由于跳出该循环的唯一方法(不计算异常)是sentinel值
-9999
,这是您将分配给
x
并传递给
countqiftpositive
的唯一值

同时,对于可被6整除的正整数,只返回
1
if。对于其他每一个值,包括您的sentinel,它都返回
0

其他哨兵问题

使用sentinel值几乎总是一个错误(除非这是您任务的一部分)。迟早,“不可能”的输入会出现

因为您的目标是继续循环,直到用户完成(一个“是或否”的问题),所以使用一个局部布尔变量,并测试它。另外,对于这种情况有很多有用的方法,例如:

boolean done = false;
while (! done) {
    if (scan.hasNextInt()) {
        // Store scan.nextInt() for use later.  See below.
    } else {
        // No more (valid) inputs.
        done = true;
    }
}
这个循环实际上可以缩短为
,而(scan.hasNextint()){…}
,但是将循环的continue或end条件存储在变量中对于更复杂的退出决策非常方便

存储用户输入

您永远不会存储多个用户输入。创建某种类型的文件来存储它们,然后对该列表进行操作

java.util.List<Integer> numbers = new java.util.LinkedList<Integer>();
统计用户输入

无需
count
——您的整数集合将为您存储:

if (numbers.size() == 0) {
    System.out.println("You didn't type any numbers!");
}
打印输出

最后,仅当满足该奇怪条件时才输出每个数字。这假设您重写
countqiftpositive
以返回一个
布尔值(它几乎已经这样做了):

您可能希望重命名该方法,因为它不再计算任何值

剩下的就交给你了


附言:将输入、处理和输出分成(至少)三种不同的方法几乎总是一个好主意,尤其是在学习的时候。理解一堆简短的方法要比理解一个全能的方法容易得多,并且使调试问题变得更容易。

@ShkumbinDelija没问题,我添加了另一个关于查找因子的部分。哇,这太棒了,谢谢你的深入解释,我非常感谢!也谢谢你的提示,一些很好的有效的观点希望能在将来帮助我。@ShkumbinDelija:另外,如果缩进、间距和命名一致,这些错误中的一些会更容易被发现。这种纪律会让自己付出很多倍的代价。
if (numbers.size() == 0) {
    System.out.println("You didn't type any numbers!");
}
for (int number : numbers) {
    if (CountQiftPositiv(number)) {
        System.out.println(number);
    }
}