2017-02-20 2 views
0

Ich bin ein binäres Suchprogramm ausgeführt, die Benutzereingabe Zeichen 'l' für Low 'h' für High und 'C', wenn der Wert korrekt ist. Meine erste Methode gibt das Zeichen zurück meine Midpoint-Methode liest nur die erste Zeicheneingabe. Wenn ich bei 50 anfange und 'h' drücke, wird der Mittelpunkt korrekt auf 75 angehoben, aber ich kann das Programm nicht dazu bringen, 'l' zu lesen und den Wert wieder auf 50 zu senken. Das Programm liest nur die erste char-Eingabe durch den Benutzer, aber ich muss den Wert in Antwort aktualisieren. Ist meine while-Schleife falsch oder meine Entscheidung? Vielen Dank.binäre Suche im Bereich von 1 bis 100 mit Benutzereingabe

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

Antwort

2

Sie haben hier einen Fehler. Ich werde versuchen, auf jedes Problem zu antworten, aber ich könnte einige verpassen, bitte markieren Sie einige, wenn ich einen vermisse. Lassen Sie diese Schleife mit nur Kommentar sehen lesbarer

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 
} 

Bewerten

Erste zu sein, sind Sie in der if(answer == 'h') zu viele Betrieb zu tun. Sie rechnen zweimal in der Mitte, mit einer neuen Eingabe zwischen. Dies sollte nicht gemacht werden.

Die Idee ist, den Benutzer eine Eingabe einmal pro Schleife zu fragen.

Schleife oder nicht?

Da Sie eine Return-Anweisung in der Schleife haben, ohne irgendeine Bedingung, wird es ausgeführt, egal was. Deine Schleife wird also nur einmal ausgeführt (das ist dann nicht wirklich eine Schleife). Die folgende Anweisung wird einfach die Schleife stoppen und beenden Sie die Methode:

return(middle); 

Ich glaube, das das Verfahren zu stoppen, nur in dem vorherigen Zustand sein soll, wenn die Benutzereingabe, dass dies richtig ist:

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

schalten

Sie einen Schalter anstelle dieser 3 Bedingung verwenden könnte, diese sauberer sein würde,

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

So die obige Bedingung könnte wie

switch(answer){ 
    case 'h': 

     break; 
    case 'l': 

     break; 
    case 'c': 

     break; 
    default: 

} 

Get Eingang

Sie erhalten müssen, um die Eingabe auf jeder Schleife writen werden, so desto leichter wäre es am Anfang der Schleife zu tun, nur nach die while Linie. Noch besser ist, direkt in den Schalter, da Sie nicht wirklich die Eingabe benötigen später wie:

switch(getUserresponseGuess()){ 
    ... 
} 

Scanner

Nun, Sie sollten nicht eine neue Instanz eines Scanner jedes Mal erstellen, was Sie tun bei dem Verfahren um einen Wert zu lesen:

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

Set scan eine globale Instanz und instanziiert es einmal, würde dies das Risiko von Datenlecks reduzieren.

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

Wie frage ich und akzeptiere jeden Eingang? Ich kann nicht herausfinden, warum es nur Schleifen ist, wenn der Eingang 'h' ist – reubs

+0

@reubs das ist überhaupt keine Schleife. Sie rufen einfach 'getUserresponseGuess' zweimal im 'if (answer == 'h')' auf und geben Ihnen die Illusion einer Schleife. Aber Sie können keine Schleife ausführen, wenn Sie eine 'return'-Anweisung darin haben. Ich habe ein bisschen bearbeitet, Sie können das Problem in 'Evaluate' und' Loop oder nicht? 'Sehen – AxelH