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);
}
}