2014-01-19 5 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 if'절에서 'else if (arr [mid] '을 전환하고 싶을 수도 있습니다. –

+0

디버거 사용 방법을 배워야합니다. 많은 시간을 절약 할 수 있습니다. –

답변

0

는 ofuscate하지 마십시오! 이 작업을 수행합니다 :

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

다음과 같이 마지막 else if 문을 변경합니다. 이것은 효과가있다. 그렇지 않으면 당신은 무한 루프로 들어갈 것이기 때문에; 내가 중간 값이 현재 값보다 작은 경우 높은 감소하고, 중간 값이 현재 값보다 큰 경우 낮은 값을 증가했다

else if (arr[mid] < currval) 

     { 

      low = mid; 
      --high; 
     } 

     else if (arr[mid] > currval) 

     { 

      high = mid; 
      ++low; 
     } 

참고

관련 문제