изменение переменной, которая была объявлена ​​вне цикла - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть программа, которая должна рассчитывать количество високосных лет, которые происходят между двумя годами. У меня есть al oop, который проходит через каждые l oop между двумя выбранными годами, вычисляет, является ли он високосным годом, и, если это так, увеличивает переменную count. В конце я попытался напечатать переменную для отображения моего ответа, но он сказал мне, что переменная не была инициализирована. Итак, я объявил его со значением ноль в начале программы, но теперь он будет отображать только ноль, а изменения, внесенные в переменную, останутся в пределах l oop. Я не хочу помещать оператор print в l oop, потому что это просто заставит его печатать несколько чисел снова и снова. Что я должен сделать, чтобы это исправить.

public class Main {
  public static void main(String[] args) {
    int year1 = 1808;
    int year2 = 1805;
    boolean leap;
    int count = 0;

    for (int b = 0; b < 1; b++) {
      for (int i = year1; i <= year2; i++) {
        if (i % 4 == 0) {
          leap = true;
        }
        if (i % 4 == 0 && i % 100 == 0) {
          leap = false;
        }
        if (i % 100 == 0 && i % 400 == 0) {
          leap = true;
        }
        if (leap = true) {
          count++;
        }
      }

      System.out.print(count);
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Прежде всего, я рекомендую вам адаптировать методы модульного тестирования для такого рода сценариев ios. Для этого я приведу пример того, как разработать свой код, чтобы вы могли его правильно протестировать.

Ваш текущий код:

  • ваш l oop не является выполняется, year1 больше year2, поэтому i <= year2 всегда ложно. Вот почему.

я рекомендую переписать ваш код следующим образом:

public class Main {

    public boolean isLeapYear(int year) {
      boolean isLeap = false;
      if (i % 4 == 0) {
        isLeap = true;
      }
      if (i % 4 == 0 && i % 100 == 0) {
        isLeap = false;
      }
      if (i % 100 == 0 && i % 400 == 0) {
        isLeap = true;
      }
      return isLeap;
    }

    public int getLeapYears(int firstYear, int secondYear) {
      int count = 0;
      int tmp;

      // firstYear must be less than secondYear
      if (firstYear > secondYear) {
        tmp = firstYear;
        firstYear = secondYear;
        secondYear = tmp;
      }

      while(firstYear <= secondYear) {
        if (isLeapYear(firstYear)) {
          ++count;
        }
        ++firstYear;
      }        

      return count;
    }

    public static void main(String[] args) {
      int year1 = 1805;
      int year2 = 1808;

      System.out.print(getLeapYears(year1, year2));
    }
  }

я разделил ваш код на 3 функции:

  • main, которая будет просто передавать аргументы в основную функцию
  • getLeapYears, с ответственностью l oop через годы и подсчитывать високосные
  • isLeapYear, с ответственностью знать, это заданный год это прыжок или нет

Почему это ?? Такой дизайн вашего кода позволит вам писать модульные тесты и получать информацию о том, где находятся ошибки вашего кода, если они появляются.

Если у вас есть отдельные функции, даже если вы не пишете модульные тесты, вы можете попробовать свои отличные функции от вашей основной функции и знать, что происходит:)

0 голосов
/ 16 апреля 2020

Ваш внутренний для l oop никогда не выполняется, поэтому.

year1 больше year2, поэтому i <= year2 никогда не соответствует действительности.

...