2017-10-01 1 views
0

나는 대중 교통 카드를 만들고 있습니다. 나는 세 가지 관련 방법을 정의하는 당신의 도움이 필요 :이 성공적으로 마지막 120분 내에서 확인되었고, 마지막으로 성공적인 체크인부터 체크 아웃되지 않은시간과 거리의 차이를 계산하는 방법

isCheckedIn(long time) 

반환 여부를 지정합니다. "검사하여"

checkIn(int x, int y, long time) 

  • X 및 Y는 새로운 여정에 의하면, 메시지가있는 경우, 현재 위치
  • 인 파라미터이다.
  • 이미 체크인 한 경우 계속 진행 중이면 "계속 여행 중"이라고 표시됩니다.
  • 최소 120 분마다 체크인하면 영원히 여행을 계속 할 수 있습니다.

지갑 (INT의 X, INT y를 장시간)

:

  • 현재 여행을 종료하고 식 12을 사용하여, 균형으로부터 전체 여행에 대해 가격을 차감 + (maxX - minX + maxY - minY) * 3, 여기서 max와 min은 checkIns와 최종 checkOut의 모든 좌표를 취합니다.

예 메시지 :

  • ! "밖으로 검사 가격은 $ 2, 남은 잔액은 $ 98"

  • "오류 : 체크 아웃 할 수 없습니다, 현재 체크되지 않음"

내가 지금까지 해본 내용 :

import java.time.Instant; 
import java.time.temporal.ChronoUnit; 

public class TravelCard { 

//Card balance 
private int balance; 

// isCheckedIn 
private boolean isCheckedIn; 
private Instant instant; 

// distant x,y 
private int x; 
private int y; 



public TravelCard() 

{ 
    balance = 100; 
    isCheckedIn = false; 


} 

public void depositMoney(int amount) { 


    if (amount >= 0) { 
     balance += amount; 
     System.out.println(amount + " dollars deposited. New balance: " + balance + " dollars"); 
    } else { 
     System.out.println("Error: Cannot deposit negative amount"); 
    } 

} 

public boolean isCheckedIn(long time) { 

    Instant instant1 = Instant.now(); 
    time = ChronoUnit.MINUTES.between(instant, instant1); 

    // time 
    if (isCheckedIn && time <= 120) return true; 
    else return false; 

} 

public void checkIn(int x, int y, long time) { 

    this.x = x; 
    this.y = y; 

    if (time == 0) { 
     System.out.println("Checked in"); 
    } else if (time <= 120) { 
     System.out.println("Continued journey"); 
    } 

} 


public void checkOut(int x, int y, long time) { 

} 



public static void main(String[] args) { 


    } 

} 

메시지를 인쇄하는 방법을 제외하고는 checkOut 메소드에서 완전히 분실했습니다. 아무도 나를이 문제를 해결하는 데 도움이 될 수 있습니까? 미리 많은 감사드립니다!

+0

[왜 누군가가 나를 도울 수 있습니까?] 실제 질문이 아닙니까?] (http://meta.stackoverflow.com/q/284236) – lexicore

답변

1

아래에 작성된 코드는 x와 y의 최대 값과 최소값을 저장하는 방법을 보여주기위한 것입니다. 이렇게하는 다른 방법은 모든 x와 y 값을 배열에 저장하는 것입니다. 그러나 메모리 소비가 불필요하게 증가 할 것입니다. 사람이 자동으로 당신이 정확한 120 분의 x와 y 값을 검색하는 방법을, 120 분 후에 체크 아웃 경우

public TravelCard(){ 
    x_min = 9999999; 
    y_min = 9999999; 
    x_max = 0; 
    y_max = 0; 
    balance = 100; 
    isCheckedIn = false; 
} 

public void checkIn(int x, int y, long time) { 
    //we save the new x and y, only if they are larger than previous ones 
    if (x >this.x_max){ 
     this.x_max = x; 
    } else if(x < this.x_min){ 
     this.x_min = x; 
    } 
    if (y >this.y_max){ 
     this.y_max = y; 
    } else (y<y_min){ 
     this.y_min = y; 
    } 


    if (ischeckedIn()) { 
     System.out.println("Continued Journey"); 
    } else if { 
     System.out.println("CheckingIn Now"); 
     this.instant = Instant.now() 
     isCheckedIn = true; 
    } 

} 

public boolean isCheckedIn(l) { 

    Instant instant1 = Instant.now(); 
    if(this.isCheckedIn){ 
     time = ChronoUnit.MINUTES.between(instant, instant1); 
    } else { 
     return false; 
    } 

    // time 
    if (isCheckedIn && time <= 120) return true; 
    else{ 
     System.out.println("Your time is out! i.e Auto Checkout") 
     this.isCheckedIn = false; 
     return false; 
} 
public void checkOut(int x,int y,long time){ 
    if(this.isCheckedIn){ 
     //updating x and y at checkout time 
     if (x >this.x_max){ 
      this.x_max = x; 
     } else if(x < this.x_min){ 
      this.x_min = x; 
     } 
     if (y >this.y_max){ 
      this.y_max = y; 
     } else (y<y_min){ 
      this.y_min = y; 
     } 
     //Now we alredy have max and min for x and y 
     int expense = 12 +((this.x_max - this.x_min)+(this.y_max - this.y_min))*3; 
     this.balance = this.balance - expense; 
     System.out.println("Expense for trip: "+expense+", Available Balance:" +this.balance); 
    }else{ 
     System.out.println("Error: Cannot check out; Not currently checked in"); 
} 

심지어이 코드를 작성 후, 여전히 문제가 지속. 실생활에서 우리는 끊임없이 x와 y 값의 변화를 듣고 그것을 지속적으로 업데이트합니다.

+0

이 스레드는 보류 상태에 있지만, 이 솔루션은 여정 시작에 문제를 일으킬 수 있다고 OP에 언급하십시오. checkIn 함수는 min/max를 적절하게 추적하기 위해 여행이 막 시작되었을 때 x 및 y로 전달 된 min 및 max 좌표를 설정해야합니다 – Zyxer22

1

이것은 대학 숙제 문제와 비슷합니다. 질문의 전체적인 맥락을 이해하는 것이 도움이 될 것이라고 생각합니다. 예를 들어, isCheckedIn() 함수에 시간 값을 전달해야하는 이유는 무엇입니까? 그것은 요구 사항인가 아니면 대답이 어떻게되어야하는지에 대한 당신의 해석 일뿐입니다. 실제로 계산을 위해 변수를 사용하는 것 같지 않으므로 결과를 0 또는 1000으로 변경하지 않아도됩니다.또한 특별한 문제가 있으므로 도움을 청하기 위해 TA/교사에게 도움을 청하는 것이 좋습니다. 그러면 즉각적인 도움을 얻을 수 있습니다.

그러나 일부 질문에 답하려고합니다.

ischeckedIn(lomg time) 

먼저주의해야 할 점은 생성자에서 초기화하지 않고 인스턴트 변수를 사용한다는 것입니다. 그 변수는 checkIn 시간까지 값을 가져서는 안되기 때문에 그 논리 주위에 널 체크가 있어야합니다. 두 번째 것은 당신이 티켓을 이전에 확인 된 경우 볼 수있는 가치를 갖고 있기 때문에, 그건 당신이 작업을 반복하지 않을 귀하의 첫 번째 단계해야한다는 것입니다 :

public boolean isCheckedIn() { 
    if(!isCheckedIn) return false; 
    .... 
    //some logic 
} 

기능에 대한 두 번째 것은이 때문이다 가입일 120은 당신이 체크 한 시간에 대한 상수입니다, 당신은 실제로 그것을 함수 밖으로 옮겨서 클래스의 static 최종 int로 저장해야합니다.

isCheckedIn() 메서드가 false를 반환하면 다시 체크인 할 때까지 isCheckedIn 값을 false로 설정해야한다고 제안합니다.

checkIn(int x, int y, long time) 

여기에 여러 가지 요점이 있습니다. x와 y의 최소값과 최대 값을 추적 할 필요가 있기 때문에 어떤 종류의 배열에 좌표를 체크인 저장하거나 좌표에 3 개의 변수가 있어야합니다. minX, maxX, currentX 및 y에 대해 동일합니다. 사람이 이미 체크되어있는 경우

좌표를 저장하는 로직을 수행 한 후, 당신은 확인해야합니다. 시간이> 1백20분 경우

if(isCheckedIn(time)) { 
    // your logic 
} 

현재 방법은 실패합니다. 다시 체크인하기 전에 잔액을 지불해야한다는 메시지와 함께 시간이> 120 인 경우 checkIn 프로세스에 실패하는 일부 메소드를 여기에 두는 것이 좋습니다. 체크인 한 경우 이전 시간대를 대체 할 새 순간을 만들기 위해 시간 값을 사용해야합니다. 나는 당신의 반환 값을 문자열로 생각하여 결과의 ​​처리 방법을 소비자가 결정하도록 할 수있다.

checkOut(int x, int y, long time) 

이 메서드는 checkIn 메서드와 매우 비슷해야합니다. 첫 번째 단계는 당신이 실제로 체크되어 있는지 확인하는 것.

if(!isCheckedIn(time)) { 
    // return error message 
} 

당신이 선택하는 경우에, 당신은 당신이 좌표를 저장하기 위해 체크인을 위해 만든 동일한 로직을한다. 이 시점에서 비용 계산, 잔액 차감 및 메시지 반환을 위해 공식을 실행할 수 있습니다.

관련 문제