Как перенести логику в отдельный метод и воспользоваться им?
Мне сказали доработать код с таким комментарием:
Логику определения високосности (или дней в году) лучше было вынести в отдельный метод. Для этого создайте отдельный метод, который будет принимать год (т.е. всего один параметр) и возвращать (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
Ответы (3 шт):
Прежде всего Вам посоветовали все абсолютно правильно. С созданием метода Вы справились хорошо (хотя формула определения високосности не совсем точная)
Второй момент это то, что как разработчику Вам нужно учиться читать ошибки и работать с ними, 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
Во-первых, високосными годами в григорианском календаре считаются все года, кратные 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);
}
public static int getNumberOfDays(int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
return calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
}