Как перенести логику в отдельный метод и воспользоваться им?

Рейтинг: -3Ответов: 3Опубликовано: 01.04.2023

Мне сказали доработать код с таким комментарием:

Логику определения високосности (или дней в году) лучше было вынести в отдельный метод. Для этого создайте отдельный метод, который будет принимать год (т.е. всего один параметр) и возвращать (return) количество в нём дней и ничем другим он заниматься не будет. А затем используйте его в своей программе.

Вот я сделал он не срабатывает, код не хочет компилироваться:

import java.util.Scanner;

public class Main {

    public static final int NUMBER_GOD = 400;
    public static int leapYear(int year) {
        int result = (year % NUMBER_GOD);
        return result;

    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int sum = 0;
        while (true) {
            System.out.println("Введите года в формате уууу");
            int year = scanner.nextInt();
            System.out.println("Введите количество дней:");
            int day = scanner.nextInt();
            if (leapYear) == 0 && day == 366 || leapYear != 0 && day == 365) {
                sum = sum + 1;
            } else if (year % NUMBER_GOD != 0 && day == 366) {
                System.out.println("Неправильно! В этом году 365 дней! Набрано очков: " + sum);
                break;
            } else if (year % NUMBER_GOD == 0 && day == 365) {
                System.out.println("Неправильно! В этом году 366 дней! Набрано очков: " + sum);
                break;
            }
        }
    }
}

Ошибки при компиляции:

Main.java:21: error: illegal start of expression
    if (leapYear) == 0 && day == 366 || leapYear != 0 && day == 365){
                  ^
Main.java:21: error: not a statement
    if (leapYear) == 0 && day == 366 || leapYear != 0 && day == 365){
                                     ^
Main.java:21: error: ';' expected
    if (leapYear) == 0 && day == 366 || leapYear != 0 && day == 365){
                                                                   ^
Main.java:23: error: 'else' without 'if'
    }else if (year % NUMBER_GOD != 0 && day == 366) {
     ^
4 errors

Ответы

▲ 2

Прежде всего Вам посоветовали все абсолютно правильно. С созданием метода Вы справились хорошо (хотя формула определения високосности не совсем точная)

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

Компилируя ваш код я получаю:

Main.java:21: error: illegal start of expression
    if (leapYear) == 0 && day == 366 || leapYear != 0 && day == 365){
                  ^
Main.java:21: error: not a statement
    if (leapYear) == 0 && day == 366 || leapYear != 0 && day == 365){
                                     ^
Main.java:21: error: ';' expected
    if (leapYear) == 0 && day == 366 || leapYear != 0 && day == 365){
                                                                   ^
Main.java:23: error: 'else' without 'if'
    }else if (year % NUMBER_GOD != 0 && day == 366) {
     ^
4 errors

Итак мы получаем 4 ошибки первая из них говорит о не правильно закрытых скобках

Условие if всегда пишется в таком формате все условие в скобках:

if (условие){
  действие
} 

Именно поэтому мы видим стрелочку ^ под символами == где по логике компилятора должно быть уже тело условия предваряемое { скобкой.

Три других ошибки порождены как цепочка первой. Т.е. исправив одну мы исправим все четыре. Просто компилятор запутался в коде. Убираем скобку после leapYear:

if (leapYear == 0 && day == 366 || leapYear != 0 && day == 365){

}

Компилируем и получаем следующие ошибки:

Main.java:21: error: cannot find symbol
    if (leapYear == 0 && day == 366 || leapYear != 0 && day == 365){
        ^
  symbol:   variable leapYear
  location: class Main
Main.java:21: error: cannot find symbol
    if (leapYear == 0 && day == 366 || leapYear != 0 && day == 365){
                                       ^
  symbol:   variable leapYear
  location: class Main
2 errors

Теперь их 2 и они говорят о том что переменная leapYear не определена, и действительно у Вас есть только одноименная функция, но не переменная.

Вы вводите year и я подозреваю что именно с ним и нужно работать:

int year = scanner.nextInt();

Cоответсвенно переписываем код так:

  if (year == 0 && day == 366 || year != 0 && day == 365){
      sum = sum + 1;
  }else if (year % NUMBER_GOD != 0 && day == 366) {
    System.out.println ("Неправильно! В этом году 365 дней! Набрано очков: " + sum);
    break;
  }else if (year % NUMBER_GOD == 0 && day == 365){
    System.out.println ("Неправильно! В этом году 366 дней! Набрано очков: " + sum);
    break;
  } 

Теперь код компилируется без ошибок.

После чего остается только заменить year % NUMBER_GOD на вызов функции с передачей аргументов. Т.е. year % NUMBER_GOD == 0 мы меняем на leapYear(year) != 0 и получаем:

  if (year == 0 && day == 366 || year != 0 && day == 365){
      sum = sum + 1;
  }else if (leapYear(year) != 0 && day == 366) {
    System.out.println ("Неправильно! В этом году 365 дней! Набрано очков: " + sum);
    break;
  }else if (leapYear(year) != 0 && day == 365){
    System.out.println ("Неправильно! В этом году 366 дней! Набрано очков: " + sum);
    break;
  } 

Однако, не стоит на этом останавливаться, исправив основные ошибки Вам еще предстоит решить логические ошибки в програме, а точнее при вводе например количества дней в году 1 программа не выдает сообщений, как- будто это нормально.

Введите года в формате уууу
2023
Введите количество дней:
365
Введите года в формате уууу
2023
Введите количество дней:
1
Введите года в формате уууу
2023
Введите количество дней:
365
Введите года в формате уууу
2023    
Введите количество дней:
366
Неправильно! В этом году 365 дней! Набрано очков: 2
▲ 1

Во-первых, високосными годами в григорианском календаре считаются все года, кратные 400 или кратные 4 и не кратные 100.

Во-вторых, предложенный метод должен возвращать правильное количество дней для заданного года: 365 для невисокосного и 366 для високосного:

static int daysInYear(int year) {
    return  (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 366 : 365;
}

Соответственно, логику основного метода можно упростить, убрав ненужные проверки:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int sum = 0;
    while (true) {
        System.out.println("Введите год в формате уууу");
        int year = scanner.nextInt();
        System.out.println("Введите количество дней:");
        int days = scanner.nextInt();

        if (daysInYear(year) != days) {
            if (days == 365) {
                System.out.println("Неправильно! В этом году 366 дней!");
            } else {
                System.out.println("Неправильно! В этом году 365 дней!");
            }
            break;
        } else {
            sum++;
        }
    }
    System.out.println("Набрано очков: " + sum);
}
▲ 0
public static int getNumberOfDays(int year) {
  Calendar calendar = Calendar.getInstance();
  calendar.set(Calendar.YEAR, year);
  return calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
}