2014-01-19 17 views
-3

我应该编写一个程序,提示用户输入被占用的酒店房间。一旦完成,用户输入-1并提示输入随机酒店号码。如果旅馆房间被占用,它就会被占用。如果房间未被占用,则打印机未被占用。我似乎无法弄清为什么没有人会打印。建议?如何获得“未占用”的打印?

import java.util.Arrays; 
import java.util.Scanner; 

public class GoughAndreaChapter9 
{ 
    public static void main(String[] args) 
    { 
     // TODO Auto-generated method stub 
     Scanner sc = new Scanner(System.in); 
     int [] arr=new int[100]; 
     int counter=0; 
     int currval=0; 

     System.out.println("Please enter an occupied hotel room number, -1 to quit "); 

     do 
     { 
      currval = sc.nextInt(); 
      if(currval==-1) 
       break; 
      if(currval>0) 
       arr[counter++]=currval; 
     } 
     while(currval !=-1); 

     // sort using java API 
     int [] temparr=new int[counter]; 
     for(int i = 0; i<counter; i++) 
     { 
      temparr[i] = arr[i]; 
     } 
     arr = temparr; 
     Arrays.sort(arr); 

     //binary search. 
     int low=0; 
     int high = counter-1; 
     System.out.println("Please enter a room to search for: "); 
     currval = sc.nextInt(); 
     int status=0; 
     int mid; 

     while(low<high) 
     { 
      if(arr[low]==currval) 
      { 
       System.out.println("Occupied"); 
       status=1; 
       break; 
      } 

      else if(arr[high]==currval) 
      { 
       System.out.println("Occupied"); 
       status=1; 
       break; 
      } 

      mid = low+high/2; 

      if(arr[mid]==currval) 
      { 
       System.out.println("Occupied"); 
       status=1; 
       break; 
      } 
      else if(arr[mid]<currval) 
      { 
       low=mid; 
      } 
      else if(arr[mid]<currval) 
      { 
       high = mid; 
      } 
     } 

     if(status==0) 
      System.out.println("Unoccupied"); 
    } 
} 
+4

我建议触发条件这意味着您的程序打印出“未占用”,并逐步执行程序(使用调试器或铅笔和纸张)。 –

+1

在后面的两个else else子句中使用相同的表达式else if(arr [mid] ” –

+0

您*需要学习如何使用调试器。这将节省很多小时的头发拉动。 – 2014-01-19 02:50:16

回答

0

请勿抢救!这样做:

Room.java

public class Room { 
    private boolean isOccupied; 

    public Room() { 
     this.isOccupied = false; 
    } 

    public boolean obtainTheRoom() { 
     if(!isOccupied) this.isOccupied = true; 
     return !isOccupied; 
    } 
} 

Main.java

import java.util.Scanner; 

public final class Main { 
    private static final int ROOM_AMOUNT = 50; 
    private static int actualRoom; 
    private static Scanner cmdin = new Scanner(System.in); 

    public static void main(String[] args) { 
     Room[] rooms = new Room[ROOM_AMOUNT]; 

     // Select some random, but static rooms to be occupied 
     for(int i = 1; i <= ROOM_AMOUNT; i++) { 
      if(i % 3 - 1 == 0 || i * 2 % i + 10 - 2 == 2) { 
       rooms[i - 1].obtainTheRoom(); 
      } 
     } 

     for(;;) { 
      System.out.print("Enter a room number:\t"); 
      try { 
       actualRoom = Integer.parseInt(cmdin.next()); 
      } catch(NumberFormatException nfe) { 
       loopRoomNumber(); 
      } 

      if(rooms[actualRoom - 1].obtainTheRoom()) { 
       System.out.println("Got the room " + actualRoom + "! Now it's occupied -_-"); 
      } else { 
       System.out.println("Room Occupied!"); 
      } 
     } 
    } 

    private static void loopRoomNumber() { 
     System.out.print("That's not a valid room number!\n\n"); 

     try { 
      actualRoom = Integer.parseInteger(cmdin.next()); 
     } catch(NumberFormatException nfe) { 
      loopRoomNumber(); 
     } 
    } 
} 

这应该工作。祝你好运!

0

我会改变你最后的其他if语句如下。这将工作。否则,你会无尽的循环;

else if (arr[mid] < currval) 

     { 

      low = mid; 
      --high; 
     } 

     else if (arr[mid] > currval) 

     { 

      high = mid; 
      ++low; 
     } 

请注意,我已经减少高时中间值小于当前值,并增加低值时,中间值比当前值大