Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: помогите новичку найти ошибку в коде
Форум программистов > Системное программирование > Java
maxxi
Извиняюсь за неудобства...... smile.gif

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


задание такое - программа определяет является ли заданный год високосным (надо написать самому такую функцию).
И является ли вводимая дата правильной. Например, 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, то даже если ты введешь правильную дату, то все равно она выдает что такая дата не существует.....
Не догоню почему так....
ois
Дружище, ты бы сначала все с немецкого перевел и написал бы, что вообще программа должна делать! wink.gif
А уж с ошибками мы разберемся...
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. Во первых у тебя декабрь никуда не попал, описка скорее всего wink.gif , во вторых с февралем и проверкой на високосность - ошибочка.
Я бы имеющийся вариант чуть-чуть подправил бы на более элегантный:
// 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 года делятся на сто и при этом не являются високосными.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.