помогите новичку найти ошибку в коде

  • Автор темы maxxi
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

maxxi

Извиняюсь за неудобства...... :)

Вот программка в более пристойном виде -


задание такое - программа определяет является ли заданный год високосным (надо написать самому такую функцию).
И является ли вводимая дата правильной. Например, 1.2.2000 - правильная дата, а 34.34.2000-не правильная

public class God {
public static boolean VisokosniiGod (int god) { //opredelim, visokosnii li zadannii god
return ((god % 100 == 0) && ((god % 400 == 0))
|| ((god % 100 != 0)) && (god % 4 == 0));
}


public static boolean OprMesjaz(int den, int mes, int god){ // opredelim, javljaetsja li zadannii den", mesjaz i god pravilnimi


if ((mes==1) || (mes==3)||(mes==5)|(mes==7)||(mes==8)||(mes==10)||(mes==11)) {
return den<=31&den>=1;

}
else if ((mes==4)||(mes==6)||(mes==9)||(mes==11)) {
return den<=30&den>=1;

}
else if ((mes==2)&&((god % 100 == 0) && ((god % 400 == 0))
|| ((god % 100 != 0)) && (god % 4 == 0))){
return den<=29&den>=1;
}
else if ((mes==2)&&((god % 100 != 0))) {
return den<=28&den>=1;
}


return false;}}



Второй класс +

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



int den=6;
int mes=2;
int god=1600;


boolean VisokosniiGod=God.VisokosniiGod(god);
boolean mesjaz= God.OprMesjaz(den, mes, god);



if(mesjaz) {
if(VisokosniiGod) {
System.out.println(god + " ist schaltjahr");
}else if (!VisokosniiGod){System.out.println(god + " ist KEIN schaltjahr");}
System.out.printf(den+"."+mes+"."+god+" EST' TAKAJA DATA");}


else if(!mesjaz) {
{System.out.printf(den+"."+mes+"."+god+" NET TAKOI DATI");
}}

}}





Проблема в том, что вроде она работает.... но как только вводишь год 1000, то даже если ты введешь правильную дату, то все равно она выдает что такая дата не существует.....
Не догоню почему так....
 
O

ois

Дружище, ты бы сначала все с немецкого перевел и написал бы, что вообще программа должна делать! :D
А уж с ошибками мы разберемся...
 
O

ois

Сори, не сразу заметил, что теперь код выглядит куда как более читабельным...
Итак, если я не ошибаюсь, определение високосного года - год является високосным, если он кратен 4 и при этом не кратен 100 либо кратен 400.
Для начала можно слегка причесать функцию VisokosniiGod():
Код:
// opredelim, visokosnii li zadannii god
public static boolean VisokosniiGod(int god) {
return ((god % 400 == 0) || ((god % 100 != 0) && (god % 4 == 0)));
}

(god % 100 == 0) в данном случае избыточная проверка...если год кратен 400, то он и подавно кратен 100.

Теперь идем далее, если я правильно понял, то как раз ошибка в функции OprMesyaz. Во первых у тебя декабрь никуда не попал, описка скорее всего :D , во вторых с февралем и проверкой на високосность - ошибочка.
Я бы имеющийся вариант чуть-чуть подправил бы на более элегантный:
Код:
// opredelim, javljaetsja li zadannii den", mesjaz i god pravilnimi
public static boolean OprMesjaz(int den, int mes, int god) {
if (den < 1 || god < 0 || mes > 12 || mes < 1) 
return false;

if ((mes == 1) || (mes == 3) || (mes == 5) | (mes == 7) || (mes == 8)
|| (mes == 10) || (mes == 12)) {
return den <= 31;

} else if ((mes == 4) || (mes == 6) || (mes == 9) || (mes == 11)) {
return den <= 30;

} else if (VisokosniiGod(god)) {
return den <= 29;
} else {
return den <= 28;
}
}

В таком случае, мы перебираем варианты для каждого месяца. В твоем коде зачем-то повторно дублировался код проверки года на високосность (вместо замечательной функции VisokosniiGod()) и почему-то последний вариант проверки был:
Код:
 else if ((mes==2)&&((god % 100 != 0))) {
god % 100 != 0 - абсолютно лишняя проверка, в которую и закралась ошибка, так как, к примеру, 1000, 1700, 1800 года делятся на сто и при этом не являются високосными.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!