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

Тема в разделе "Java", создана пользователем maxxi, 22 апр 2007.

Статус темы:
Закрыта.
  1. maxxi

    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, то даже если ты введешь правильную дату, то все равно она выдает что такая дата не существует.....
    Не догоню почему так....
     
  2. ois

    ois Гость

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

    ois Гость

    Сори, не сразу заметил, что теперь код выглядит куда как более читабельным...
    Итак, если я не ошибаюсь, определение високосного года - год является високосным, если он кратен 4 и при этом не кратен 100 либо кратен 400.
    Для начала можно слегка причесать функцию VisokosniiGod():
    Код (Text):
    // 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 , во вторых с февралем и проверкой на високосность - ошибочка.
    Я бы имеющийся вариант чуть-чуть подправил бы на более элегантный:
    Код (Text):
    // 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()) и почему-то последний вариант проверки был:
    Код (Text):
     else if ((mes==2)&&((god % 100 != 0))) {
    god % 100 != 0 - абсолютно лишняя проверка, в которую и закралась ошибка, так как, к примеру, 1000, 1700, 1800 года делятся на сто и при этом не являются високосными.
     
Загрузка...
Похожие Темы - помогите новичку найти
  1. rn3rjd
    Ответов:
    9
    Просмотров:
    1.231
  2. maxiik
    Ответов:
    3
    Просмотров:
    1.576
  3. zaza41rus
    Ответов:
    0
    Просмотров:
    1.054
  4. Radion2
    Ответов:
    0
    Просмотров:
    1.670
  5. forem0st
    Ответов:
    6
    Просмотров:
    3.541
Статус темы:
Закрыта.

Поделиться этой страницей