Проблема с условиями цикла Java - PullRequest
0 голосов
/ 15 апреля 2019

Я работаю над циклами Java для назначения. Мне пришлось написать цикл, который начинается с численности населения трех стран, поднимает / понижает каждую из них до тех пор, пока одна страна не станет ниже, чем две другие, и печатает данные о населении и о годах, которые потребовались для достижения этого результата.

Я использую два условия с правильным кодом, но когда условия правильные, они не работают правильно. Цикл должен работать до тех пор, пока население Мексики и Японии не превысит население США, поэтому я работаю с этим:

Если я использую это условие - mexpop> usapop && jappop> usapop, цикл не запускается, потому что США уже выше, чем Мексика и Япония (315 000 000 против 121 000 000 и 127 000 000).

Если я использую это условие - mexpop

Последний вариант, который я попробовал: usapop

Ожидаемый результат должен быть очевиден, но вот что я получаю:

Население Мексики составляет 273 286 490 человек. Население Соединенных Штатов составляет 278 014 339 человек. Население Японии составляет 278 115 163 человек. Это изменение заняло 78 лет.

Я думаю, что популярность в Японии выше благодаря чистой удаче, но, похоже, она не отвечает обоим условиям, даже если я использую логический оператор AND.

/* Import Java utilities required for the program. */
import java.text.DecimalFormat;

class Population_for {
   public static void main(String[] args) {

   /** Declare variables that will be used in the program. **/
   double usapop, mexpop, jappop;
   int years;

   /** This is the start of the for loop.
     * The first line declares the variables (mexpop, usapop, jappop), the second line declares the conditions (mexpop less than**/
   for(mexpop=121000000, usapop=315000000, jappop=127000000, years=1; mexpop < usapop && jappop < usapop; years++){
      mexpop = mexpop * 1.0105;
      usapop = usapop * 0.9984;
      jappop = jappop * 1.0101;
      DecimalFormat df = new DecimalFormat("###,###,###");
      System.out.println("The Mexican population is "+(df.format(mexpop))+". The United States population is "+(df.format(usapop))+". The Japanese population is "+(df.format(jappop))+". This change took "+years+" year(s).");
      System.out.println("");
   }
   }
}```

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Я думаю, вы неправильно поняли, как работают логические and и or. Для оператора and необходимо, чтобы обе стороны были истинными, чтобы получить значение true, а для оператора or необходимо, чтобы обе стороны были истинными, чтобы оценить их как true.

Так что, если вы хотите, чтобы цикл for прекратился, когда mexpop и jappop больше, чем usapop, вы можете сделать это с помощью or.

Но еще лучше было бы написать отрицательную версию того, что вы на самом деле тестируете, поэтому, если вы хотите, чтобы цикл for выполнялся до тех пор, пока usa не станет больше, чем один из двух других, вы можете написать:

!(mex>usa && jap>use)

, что было бы правдой, пока и мекс, и джап не стали больше, чем США.

0 голосов
/ 15 апреля 2019

Ваша проблема в том, что вы допустили неудачную ошибку применения логики, которая была бы правильной, если бы она использовалась в операторе if для цикла for. Цикл for выполняется, пока условие истинно.

Когда вы попадаете в точку, в которой японское население составляет> население США, mex < use && japan < usa больше не соответствует истине (поскольку один ложный). Поэтому вам нужно использовать логические или (||), чтобы цикл продолжал работать, пока они оба не станут истинными.

...