Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/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 使用用户输入在1到100范围内执行二进制搜索_Java_Search_Binary - Fatal编程技术网

Java 使用用户输入在1到100范围内执行二进制搜索

Java 使用用户输入在1到100范围内执行二进制搜索,java,search,binary,Java,Search,Binary,我正在运行一个二进制搜索程序,该程序将用户输入字符“l”表示低“h”表示高,“c”表示值是否正确。我的第一个方法返回字符 我的中点法只是读取输入的第一个字符。如果我从50开始,按“h”,中点会正确上升到75,但我无法让程序读取“l”,并再次将值降低到50。程序只读取用户输入的第一个字符,但我需要更新应答中的值。我的while循环是错误的还是我的决策声明?多谢各位 import java.util.Scanner; public class PlayGuessingGame { publ

我正在运行一个二进制搜索程序,该程序将用户输入字符“l”表示低“h”表示高,“c”表示值是否正确。我的第一个方法返回字符 我的中点法只是读取输入的第一个字符。如果我从50开始,按“h”,中点会正确上升到75,但我无法让程序读取“l”,并再次将值降低到50。程序只读取用户输入的第一个字符,但我需要更新应答中的值。我的while循环是错误的还是我的决策声明?多谢各位

import java.util.Scanner;

public class PlayGuessingGame {
    public static char getUserresponseGuess(){  
        Scanner scan = new Scanner(System.in);
        char guesses = scan.next().charAt(0); 
        System.out.println("this is the user input " + guesses);
        return(guesses);
    }   

    public static int getMidpoint(int low, int high){ 
        int middle;
        //the midpoint is high + low divided by 2
        middle = (low + high)/ 2;

        System.out.println("is it " + middle);
        char answer =  getUserresponseGuess();

        System.out.println("this is the answer " + answer);

        //char get_input = getUserresponseGuess();
        //System.out.println("this is the output "+ get_input);
        while(low <= high){
            if(answer == 'h'){
                low = middle + 1; 
                System.out.println("this is low " + low);
                middle = (low + high)/2; 

                char new_answer = getUserresponseGuess();
                middle = (low + high)/2;
                System.out.println("is it" + middle);
                getUserresponseGuess();
            }
            //the number presented to the user is is too high, the midpoint is high -1
            else if(answer == 'l'){
                System.out.println("we're in the low portion");
                high = middle - 1;
                middle = (low + high) /2;
                System.out.print("is it " + middle);
                middle = (low + high) /2;
            }
            if(answer == 'c'){
                System.out.println("congrats!");
            }
            return(middle);
        }
        return(-1); 
    }

    public static void main(String[] args){         
        getMidpoint(1,100);
    }
}
import java.util.Scanner;
公共课猜谜游戏{
公共静态字符getUserresponseGuess(){
扫描仪扫描=新扫描仪(System.in);
字符猜测=scan.next().charAt(0);
System.out.println(“这是用户输入”+猜测);
返回(猜测);
}   
公共静态int getmiddoint(int低,int高){
中间;
//中点为高+低除以2
中等=(低+高)/2;
System.out.println(“是”+中间);
char-answer=getUserresponseGuess();
System.out.println(“这是答案”+答案);
//char get_input=getUserresponseGuess();
//System.out.println(“这是输出”+获取输入);

虽然(低您在这里有一些错误。我将尝试回答每个问题,但我可能会错过一些,如果我错过了一个,请突出一些。 让我们看看这个循环,只有注释更具可读性

while(low <= high){
    if(answer == 'h'){
        //calculate higher
        //ask input #####
        //calculate higher
        //ask input #####
    } else if(answer == 'l'){
        //calculate lower
    }
    if(answer == 'c'){
        //Congrats
    }
    //end method
}
我相信这应该是在之前的条件下,只有在用户输入正确时才停止该方法:

if(answer == 'c'){
     System.out.println("congrats!");
     return(middle);
}
转换 你可以用开关代替这三种情况,这样会更干净

if (answer == 'h')
else if (answer == 'l')
else if (answer == 'c')
所以上面的条件可以写成

switch(answer){
    case 'h':

        break;
    case 'l':

        break;
    case 'c':

        break;
    default:

}
获取输入 您需要在每个循环中获取输入,因此在循环开始时,就在
while
行之后,更容易获得输入。更好的是,直接在开关中,因为您以后不需要输入,如:

switch(getUserresponseGuess()){
    ...
}
扫描仪 好的,您不应该每次都创建一个新的
扫描仪实例,您在读取值的方法中所做的是:

public static char getUserresponseGuess(){  
    Scanner scan = new Scanner(System.in);
    char guesses = scan.next().charAt(0); 
    System.out.println("this is the user input " + guesses);
    return(guesses);
}   
设置
scan
全局实例并将其实例化一次,这将降低数据泄漏的风险

private static Scanner scan = new Scanner(System.in);
public static char getUserresponseGuess(){  
    ....
}

你在这里有一些错误。我将尝试回答每个问题,但我可能会错过一些,请突出一些,如果我错过了一个。 让我们看看这个循环,只有注释更具可读性

while(low <= high){
    if(answer == 'h'){
        //calculate higher
        //ask input #####
        //calculate higher
        //ask input #####
    } else if(answer == 'l'){
        //calculate lower
    }
    if(answer == 'c'){
        //Congrats
    }
    //end method
}
我相信这应该是在之前的条件下,只有在用户输入正确时才停止该方法:

if(answer == 'c'){
     System.out.println("congrats!");
     return(middle);
}
转换 你可以用开关代替这三种情况,这样会更干净

if (answer == 'h')
else if (answer == 'l')
else if (answer == 'c')
所以上面的条件可以写成

switch(answer){
    case 'h':

        break;
    case 'l':

        break;
    case 'c':

        break;
    default:

}
获取输入 您需要在每个循环中获取输入,因此在循环开始时,就在
while
行之后,更容易获得输入。更好的是,直接在开关中,因为您以后不需要输入,如:

switch(getUserresponseGuess()){
    ...
}
扫描仪 好的,您不应该每次都创建一个新的
扫描仪实例,您在读取值的方法中所做的是:

public static char getUserresponseGuess(){  
    Scanner scan = new Scanner(System.in);
    char guesses = scan.next().charAt(0); 
    System.out.println("this is the user input " + guesses);
    return(guesses);
}   
设置
scan
全局实例并将其实例化一次,这将降低数据泄漏的风险

private static Scanner scan = new Scanner(System.in);
public static char getUserresponseGuess(){  
    ....
}

我如何请求并接受每个输入?我不明白为什么输入为“h”时它才循环@reubs这根本不是循环。您只需在
if中调用
getUserresponseGuess
两次(答案==“h”)
给你一个循环的假象。但是当你有一个
return
语句时,你不能循环。我编辑了一点,你可以看到
Evaluate
loop中的问题吗?
我如何请求和接受每个输入?我不明白为什么只有当输入为“h”时才循环@reubs这不是循环你只需在
if(answer='h')
中调用
getUserresponseGuess
两次,给你一个循环的错觉。但是当你有
return
语句时,你就不能循环了。我编辑了一点,你可以在
Evaluate
循环与否?