【解決方法】if/else文を使ってspeedlimitとclockspeedでデメリットポイントを計算する方法


問題: コードを実行すると、減点が差し引かれません!!!

違反内容の概要 デメリット:
短所 定められた制限速度を 10km/h 以下で超過すること (10) 制限速度を 10km/h を超え 20km/h 以下で超過すること (20) 制限速度を 20km/h を超えて超過するが 20km/h 以下であること30km/h以下 (35) 制限速度を30km/h以上35km/h以下で超過 (40)
制限速度を 35km/h 以上超える (50)

1-この表の情報に従って、Driver クラスの pullOverSpeeding メソッドを完了します。これには、2 つの double (速度と制限速度を表す) が必要で、このドライバーが現在持っているデメリット ポイントの数を更新します。 pullOverSpeeding メソッドには正の数のみが渡されると想定できます。 制限速度以下の速度は減点されないと思われるかもしれません。 (これは必ずしも実生活で真実であるとは限りません!)

2-提供されたコメントに従って、TrafficCop クラスのメイン メソッドを完成させます。

このコードはJgrasp(Java)用です

私が試したこと:

ドライバークラス

/** Represents a driver in New Zealand*/
public class Driver{

   private String name;
   private double demeritPoints;
   private final int MAX_DEMERIT = 100;
   private boolean banned;
   
   /** Takes a String to initialise the name data field
      @param n this driver's name
   */
   public Driver(String n){
      name = n;
   }

   /** Takes two doubles representing the speed limit and the speed this driver was going.
    It adjusts their demerit points total accordingly and then determines if they are banned
    @Fred speedLimit the speed limit in place as they are pulled over
    @Fred clockedSpeed the speed at which they have been clocked
   */
   public void pulledOverSpeeding(double speedLimit, double clockedSpeed){  
      // code goes here
      if (clockedSpeed >= 10) {
         System.out.println(demeritPoints + 10);
      } else if (( clockedSpeed >= 10) && clockedSpeed <= 10){
         System.out.println(demeritPoints + 20);
      } else if (( clockedSpeed >= 20) && clockedSpeed <= 30){
         System.out.println(demeritPoints + 30);
      } else if (( clockedSpeed >= 30) && clockedSpeed <= 35){
         System.out.println(demeritPoints + 40);
      } else if (clockedSpeed >= 35){
         System.out.println(demeritPoints + 50);
      }
   }
   
   public boolean getBanned (){
      if(demeritPoints > MAX_DEMERIT){
         return true;
      }else{
         return false;
      }
   }
 
   
   /**Displays the driver's details.*/
   public void displayDriverDetails(){
      System.out.println("Name: " + name);
      System.out.println("Current demerit points: " + demeritPoints);
      System.out.print(name + " is currently ");
      if(banned){
         System.out.print("not ");
      }
      System.out.println("allowed to drive.");
   }
}



Application class

/** A class responsible for penalising Drivers for speeding*/
public class TrafficCop{
public static void main (String[] args){
Driver d1 = new Driver("Fred");

// display the details of d1
      d1.displayDriverDetails();
     
  // Fred is pulled over doing 82 kph in a 50kph zone – call the appropriate method
      d1.pulledOverSpeeding(50,82);
     
      // Fred is pulled over doing 108 kph in a 100kph zone – call the appropriate method
      d1.pulledOverSpeeding(100,108);
      // Fred is pulled over doing 102kph in a 80kph zone – call the appropriate method
      d1.pulledOverSpeeding(80,102);
// display d1's details again
      d1.displayDriverDetails();
}
}

解決策 1

コンパイルしても、コードが正しいとは限りません! :笑う:
開発プロセスは電子メールを書くことと考えてください。コンパイルが成功したということは、電子メールを適切な言語 (たとえば、ドイツ語ではなく英語) で作成したことを意味します。電子メールに送信したいメッセージが含まれていたわけではありません。

これで、開発の第 2 段階に入ります (実際には第 4 段階または第 5 段階ですが、後で前の段階に進みます): テストとデバッグです。

それが何をするのか、そしてそれがあなたが望んでいたものとどのように違うのかを見ることから始めてください。 これは、なぜそれを行っているのかについての情報を提供するため、重要です。 たとえば、プログラムがユーザーに数字を入力させることを目的としており、それを2倍にして答えを出力する場合、入力/出力が次のようになると:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

次に、問題がそれを2倍にするビットにあることは明らかです-それ自体を加算したり、2倍したりするのではなく、それ自体を乗算して入力の2乗を返します。
それで、コードを見ることができ、それがここのどこかにあることは明らかです:

Java
int Double(int value)
   {
   return value * value;
   }

何がうまくいかないのかがわかったら、デバッガーを使用して原因を突き止めます。 メソッドの最初の行にブレークポイントを置き、アプリを実行します。 ブレークポイントに到達すると、デバッガーが停止し、制御がユーザーに渡されます。 コードを行ごとに実行し (「シングル ステップ」と呼ばれます)、必要に応じて変数の内容を確認 (または変更) できるようになりました (コードを変更して、必要に応じて再試行することもできます)。
コードを実行する前に、コードの各行が何をすべきかを考え、「ステップ オーバー」ボタンを使用して各行を順番に実行したときに実際に何をしたかを比較します。 それはあなたが期待したことをしましたか? その場合は、次の行に進みます。
そうでない場合、なぜですか? どう違うの?
うまくいけば、そのコードのどの部分に問題があり、何が問題なのかを突き止めるのに役立つはずです。
これはスキルであり、開発だけでなく現実の世界でも役立つため、開発する価値のあるスキルです。 そして、すべてのスキルと同様に、それは使用することによってのみ向上します!

解決策 2

君の clockedSpeed 比較は部分的に正しくありませんが、最初のテストのために機能しません:

Java
if (clockedSpeed >= 10) { // this covers all speeds from 10 to infinity
   System.out.println(demeritPoints + 10);
} else if (( clockedSpeed >= 10) && clockedSpeed <= 10){ // it cannot be greater and less at the same time
   System.out.println(demeritPoints + 20);
} else if (( clockedSpeed >= 20) && clockedSpeed <= 30){
   System.out.println(demeritPoints + 30);
} else if (( clockedSpeed >= 30) && clockedSpeed <= 35){
   System.out.println(demeritPoints + 40);
} else if (clockedSpeed >= 35){
   System.out.println(demeritPoints + 50);
}

必要なものは次のとおりです。

Java
if (clockedSpeed <= 10) {                    // less than or equal to 10
   System.out.println(demeritPoints + 10);
} else if (clockedSpeed <= 20){              // 11 to 20
   System.out.println(demeritPoints + 20);
} else if (clockedSpeed <= 30){              // 21 to 30
   System.out.println(demeritPoints + 30);
} else if (clockedSpeed <= 35){              // 31 to 35
   System.out.println(demeritPoints + 40);
} else if (clockedSpeed > 35){               // greater than 35
   System.out.println(demeritPoints + 50);
}

コメント

タイトルとURLをコピーしました