2017-10-01 7 views
0

私は公共交通機関カードを作成しています。私は3つの関連するメソッドを定義する際にあなたの助けをしたいと思います。それが正常に最後の120分以内で確認した、と最後の成功しチェックイン以降、チェックアウトされていない時間と距離の差を計算する方法

isCheckedIn(long time) 

復帰するかどうか。

  • xおよびyは新しい旅にチェックした場合、現在位置
  • あるパラメータは、メッセージれる
    checkIn(int x, int y, long time) 
    

    : "Inをチェック"。

  • すでにチェックインされている場合は、現在のメッセージを続行する場合は、メッセージ「継続する旅」を選択します。
  • 少なくとも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の値を配列に格納することです。しかし、メモリ消費は不必要に増加します。

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

がさえ、このコードを書いた後、まだ問題が持続人がautoの120分後にチェックアウトされている場合、どのようにその正確な第120分でxとyの値を取得します。実生活では、xとyの値の変化を常に聞き、それを継続的に更新します。

+0

このスレッドは保留になっていますが、 OPのために、この解決法は旅を始める際に問題を引き起こすかもしれないと言及する。 checkIn関数は、min/maxを適切に追跡するために旅を開始したときにminとmaxの座標をxとyに渡すように設定する必要があります – Zyxer22

1

これは大学の宿題によく似ています。あなたの解釈だけではなく、質問の完全な文脈を持つことは、おそらくもっと役立つと思います。たとえば、isCheckedIn()関数で時間値を渡す必要があるのはなぜですか?これは必須条件なのか、それとも答えがどうあるべきかのあなたの解釈だけです。あなたは実際には計算に変数を使用しているようには見えないので、結果を0または1000にするかどうかは変わりません。私はまた、あなたのTA /先生に助けを頼むことを勧めます。なぜなら、それはそのような特定の問題であり、より迅速な助けを得るためです。

しかし、あなたの質問のいくつかにお答えしようとします。

ischeckedIn(lomg time) 

最初に気づくのは、インスタント変数をコンストラクタで初期化せずに使用することです。その変数がcheckIn時まで値を持たないように見えるので、そのロジックの周りにヌルチェックがあるはずです。

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

機能についての第二のものは以来ということである:2つ目は、あなたがチケットが以前にチェックインされたかどうかを確認するために値を持っているので、あなたが作業を繰り返していないので、それはあなたの最初のステップでなければならないことです120はあなたのチェックインした時間の定数です、あなたは実際に関数からそれを移動し、あなたのクラスの静的final intとして格納する必要があります。

isCheckedIn()メソッドがfalseを返す場合は、再度チェックインするまでisCheckedInの値をfalseに設定する必要があります。

checkIn(int x, int y, long time) 

ここには多くの点があります。 xとyの最小値と最大値を追跡する必要があるので、チェックイン座標をある種の配列に格納するか、座標に3つの変数が必要です。 minX、maxX、currentX、yは同じです。人がすでに確認されている場合

あなたの座標を格納するためのロジックを実行した後、あなたは確認する必要があります。時間が> 120分であれば

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

あなたの現在の方法は失敗します。もう一度チェックインする前に残高を支払わなければならないというメッセージが表示された時間が120を超える場合、checkInプロセスに失敗するメソッドを用意する方が良いかもしれません。あなたがチェックインされている場合は、古い値を置き換える新しい瞬間を作成するために時間値を使用する必要があります。あなたの戻り値を文字列にすることを検討して、メソッドの消費者に結果をどうするかを決定させることができます。

checkOut(int x, int y, long time) 

このメソッドは、checkInメソッドとよく似ています。あなたの最初のステップは、あなたが実際に確認されているかどうかを確認する必要があります。

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

あなたがチェックインされている場合、あなたは座標を格納するためにチェックインのために作られた同じロジックを実行します。その時点で、コストを計算し、残高を減額し、メッセージを返すための数式を実行することができます。

関連する問題