2017-02-20 33 views
0

我正在运行一个二进制搜索程序,如果值是正确的,它将用户输入字符'l'设置为低'h'高,'c'。我的第一个方法返回字符 我的中点方法只读取第一个字符输入。如果我从50开始按'h',中点正确地升高到75,但我无法让程序读取'l'并再次将值降低到50。该程序只读取用户输入的第一个字符,但我需要更新答案中的值。我的while循环是错误的还是我的决定陈述?谢谢。在用户输入范围1到100执行二进制搜索

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

回答

2

这里有一些错误。我会尽力回答每一个问题,但我可能会错过一些,如果我错过了一些,请突出显示一些问题。 让我们看到这个循环与唯一的评论更可读

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 == 'h')太多的操作。您正在计算两次中间值,之间有一个新的输入问题。这不应该做。

这个想法是要求用户输入每个循环一次

循环与否?

既然你在循环中有一个return语句,没有任何条件,它将被执行,不管是什么。所以你的循环只执行一次(这不是一个真正的循环)。下面的语句将简单地停止循环和退出方法:

return(middle); 

我相信这应该是在前面的条件,当用户输入,这是正确的只停止方法:

if(answer == 'c'){ 
    System.out.println("congrats!"); 
    return(middle); 
} 

开关

你可以使用一个开关来代替这些三态,这将是更清洁,

if (answer == 'h') 
else if (answer == 'l') 
else if (answer == 'c') 

因此,上述条件可writen像

switch(answer){ 
    case 'h': 

     break; 
    case 'l': 

     break; 
    case 'c': 

     break; 
    default: 

} 

获取输入

你需要让每个回路输入,所以更容易将做到这一点在循环的开始,刚过while一行。更妙的是,直接在交换机,因为你并不真正需要输入后,如:

switch(getUserresponseGuess()){ 
    ... 
} 

扫描仪

嘛,你不应该创建一个Scanner的新实例每次,你在做什么在方法来读取值:

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(){ 
    .... 
} 
+0

我该如何请求并接受每个输入?我无法弄清楚为什么只有当输入是'h'时才会循环。 – reubs

+0

@reubs这根本没有循环。你只需在'if(answer =='h')'中调用'getUserresponseGuess'两次,给你一个循环的幻觉。但是当你有一个'return'语句时你不能循环。我编辑了一下,你可以在'Evaluate'和'Loop or not?'中看到问题 – AxelH