Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代码永不终止_Java_Loops_While Loop_Do While - Fatal编程技术网

Java 代码永不终止

Java 代码永不终止,java,loops,while-loop,do-while,Java,Loops,While Loop,Do While,这是我的密码: import java.util.Scanner; import static java.lang.System.*; public class GuessingGame { private int upperBound; private int count, guess, num, pct; public GuessingGame(int stop) { upperBound = stop; } public void setNum(int stop) {

这是我的密码:

import java.util.Scanner;
import static java.lang.System.*;

public class GuessingGame
{
private int upperBound;
private int count, guess, num, pct;

public GuessingGame(int stop)
{
    upperBound = stop;
}

public void setNum(int stop)
{
    upperBound = stop;
}

public void playGame()
{
    int count = 0;
    int attempt = 1;
    Scanner keyboard = new Scanner(System.in);
    //upperBound = keyboard.nextInt();
     num = (int)Math.random()*upperBound;
     guess = 0;
     out.println("Enter a number between 1 and " + upperBound);
        guess = keyboard.nextInt();
        count++;
        if(guess != num)
            attempt++;
    do{
        out.println("Enter a number between 1 and " + upperBound);
        guess = keyboard.nextInt();
        count++;
        if(guess != num)
            attempt++;
    }while(guess != num);
     pct = (count/attempt)*100;



}

public String toString()
{
    String output="";
    output = "It took you " + count + " tries to guess " + num + "\n you guessed wrong " + pct + "% of the time";
    return output;
}
}
我知道它必须在某一点上猜测必须等于num,但代码永远不会结束当前的“游戏”,但当我使用我的示例5作为停止/上限时,它似乎是无限循环的

以下是我的跑步者课程:

import java.util.Scanner;
import static java.lang.System.*;

public class Lab10e
{
public static void main(String args[])
{
    Scanner keyboard = new Scanner(System.in);
    char response = ' ';

    out.print("Guessing Game - how many numbers? ");

    //read in the player value
    int stop = keyboard.nextInt();

    GuessingGame game = new GuessingGame(stop);
    game.playGame();
    out.println(game);
    out.println("would you like to play again? (y/n):: ");
    String resp =  keyboard.next();
    response = resp.charAt(0);

    do {
    out.print("Guessing Game - how many numbers? ");
    stop = keyboard.nextInt();
    game.setNum(stop);
    game.playGame();
    out.println(game);
    out.println();
    out.println("would you like to play again? (y/n):: ");
    resp =  keyboard.next();
    response = resp.charAt(0);
    //



}while(response == 'y'); 

}

}
执行此操作时:

(int)Math.random()*upperBound;
它将Math.random()转换为
int
,因为它是如何舍入的,所以始终为零。因此num始终等于零。

执行此操作时:

(int)Math.random()*upperBound;
它将Math.random()转换为
int
,因为它是如何舍入的,所以始终为零。因此num始终等于零。

您需要

(int)(Math.random()*upperBound)
你需要

(int)(Math.random()*upperBound)

这里有两个问题:第一,你的随机数总是零。换线

num = (int)Math.random()*upperBound;

你的第二个问题是,即使你第一次猜对了,它也会问你两次。这主要是因为您复制并粘贴了猜测代码。如果从代码中删除这些行,则不会发生这种情况(不是
do
循环中的行):

此外,由于循环终止的方式,您不需要单独的
count
trunt
变量。您总是可以预测
trunt
变量将是什么(一个大于
count
…实际上,在您的程序中,它将大于两个,但这不是正确的猜测百分比)。您可以完全删除
trunt
变量,然后执行以下操作

double countDouble = (double) count;
pct = (int) ((countDouble/(countDouble+1))*100.0);

这里有两个问题:第一,你的随机数总是零。换线

num = (int)Math.random()*upperBound;

你的第二个问题是,即使你第一次猜对了,它也会问你两次。这主要是因为您复制并粘贴了猜测代码。如果从代码中删除这些行,则不会发生这种情况(不是
do
循环中的行):

此外,由于循环终止的方式,您不需要单独的
count
trunt
变量。您总是可以预测
trunt
变量将是什么(一个大于
count
…实际上,在您的程序中,它将大于两个,但这不是正确的猜测百分比)。您可以完全删除
trunt
变量,然后执行以下操作

double countDouble = (double) count;
pct = (int) ((countDouble/(countDouble+1))*100.0);

从code
out.println(“输入一个介于1和“+上限”之间的数字)
我看到您想在范围
[1;上限]
中设置
num
值,但实际上是在范围
[0,上限-1]
中设置的


如果要将数字从1随机分配到N,请使用
(int)(Math.random()*N)+1
。由于
Math.random()
将返回范围[0;1]中的值(不带1)
Math.random()*N
将始终返回范围
[0;N)
中的值(不带N),但由于我们将其强制转换为
int
范围将更改为
[0;N-1]
,因此使其成为
[1;N]
您需要将
1
添加到返回值中。

从您的代码
输出。println(“输入一个介于1和“+上限”之间的数字);
我知道您想在范围
[1;上限]
中设置
num
值,但实际上是在范围
[0,上限-1]
中设置的



如果要从1到N随机数,请使用
(int)(Math.random()*N)+1
。因为
Math.random()
将返回范围[0;1]中的值(不带1)
Math.random()*N
始终将返回范围
[0;N]中的
值(不带N)但由于我们将其强制转换为
int
范围将更改为
[0;N-1]
,因此使其成为
[1;N]
您需要将
1
添加到返回值中。

如何启动您的程序,即
main
方法?我现在添加了
main
方法如何启动您的程序,即
main
方法?我现在添加了
main
方法我与以前的实验室有类似的情况,我使用了这个方法:
int num;num=(int)(Math.random()*3);
我看到了“num=(int)Math.random()*上限在他提交的原始代码中。@LuiggiMendoza
main
方法是靠近底部的代码。它是两个独立的classes@tech_geek23:我在你的代码中发现了一些其他错误。请看我下面的帖子。我在以前的实验室中也遇到过类似的情况,我使用了这个:
int-num;num=(int)(Math.random()*3);
我看到了“num=(int)Math.random()*upperBound;”在他提交的原始代码中。@LuiggiMendoza
main
方法是靠近底部的代码。它是两个独立的classes@tech_geek23:我在您的代码中发现了一些其他错误。请参阅下面我的帖子否,您有(int)Math.random()*上限,而不是(int)(Math.random()*上限)。括号很重要,因为您的语句只是将随机数强制转换为int(始终为0),而n乘以上限——仍然始终为0。您需要对乘法语句进行分组,以便将乘积强制转换为int,而不仅仅是其第一部分。不,您有(int)Math.random()*上限,而不是(int)(Math.random())*括号很重要,因为您的语句只是将随机数强制转换为int(始终为0)n乘以上限——仍然是0。你需要对乘法语句进行分组,使乘积被转换为int,而不仅仅是它的第一部分。我在本地测试了它,它生成的结果很好……至少当
上限
为100时。好吧,现在的问题是,当我用3次尝试猜测时,有0%的时间我是错的一个数字,我知道为什么,我会在整数除法上面修正它。检查一下,我得到了:
pct=(int)((doubleCount/(doubleCount+2))*100)
除了0.0%之外,它似乎什么都不算,我必须使用+2,否则它会无限循环,我在本地测试它,它生成的结果很好……至少当
上限为100时。好的,现在问题是