Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Помогите с кодом


Автор: tishaishii 15.2.2007, 08:00
Вобщем, дали мне такое задание:
Цитата
На JAVA. Желательно в JCreator.
Создать тип Date (дата), включающий члены-данные day, month, year и функции-члены. Определить статические член-данные Default_day, определяющий дату по умолчанию. Также задать несколько конструкторов Date(int, int, int), Date (int, int), Date(int), Date(). Определить функцию член Set_default (int, int, int), формирующую значение даты по умолчанию. Сформировать const функции-члены: Day(), Month(), Year(), выделяющие день, месяц и год для заданной даты. Определить вспомогательную функцию leapyear(int), определяющую, является ли год високосным. Задать функцию, осуществляющую вывод даты в удобном формате. Определите функции add_day(int), add_month(int), add_year(int), позволяющие увеличить заданную дату на соответствующее число дней, месяцев, лет.
Перегрузить операторы: ==, !=, <, > (сравнение дат на равенство, неравенство, меньше и больше); ++, -- (увеличение, уменьшение заданной даты на 1 день);  +,- (увеличение, уменьшение даты на заданное количество дней.)
Определите функцию main(), демонстрирующую применение заданных функций.


Я его как бы выполнил в Sun ONE Studio 5:
Код

public class Z2 {
    private int day, month, year;
    private final static int MONTHS[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public void Z2(int d, int m, int y) {
        day=d;
        month=m;
        year=y;
    }
    public final static void main(String[] args) {
        System.out.println(Day());
    }
    public final int Day() {return day;}
    public final int Month() {return month;}
    public final int Year() {return year;}

    public final boolean leapyear() {return (year % 4)!=0;}
    public final String toString() {
        return String.valueOf(day)+'.'+String.valueOf(month)+'.'+String.valueOf(year);
    }
    public final int addDay(int add) {
        day+=add;
    while(day>MONTHS[month]) {
            day-=MONTHS[month];
            addMonth(1);
    }
    return day;
    }
    public final int addMonth(int add) {
        month+=add;
    while(month>MONTHS.length) {
            month-=MONTHS.length;
            addYear(1);
    }
    return month;
    }
    public final int addYear(int add) {return year+=add;}
}


Вопросы:
1. При компиляции получаю ошибку 
Цитата
Z2.java [10:1] non-static method Day() cannot be referenced from a static context
        System.out.println(Day());
                           ^
1 error
Errors compiling Z2.

2. Странное задание, вроде, в Java нет перегрузки операторов.

Автор: Ivan Kolesnikov 15.2.2007, 08:30
Цитата

1. При компиляции получаю ошибку 

Ошибку ты получаешь потому что пытаешься вызвать нестатическую функцию из статической, ведь ты в main не создал даты, а пытаешься получить ее день smile
Код

Z2 date = new Z2(15, 2, 2007);
System.out.println(date.Day());

Цитата

2. Странное задание, вроде, в Java нет перегрузки операторов. 

Да, в Java нет перегрузки операторов.

Автор: powerOn 15.2.2007, 09:16
Модератор: Название темы должно отражать ее суть!
Правила форума: http://forum.vingrad.ru/index.php?act=SR&f=27

Автор: tishaishii 15.2.2007, 12:52
Ну надо её переименовать в "Помогите разобраться с синтаксисом", только я не умею.

Добавлено @ 12:55 
Я поменял:
Код

public class Z2 {
    private int day, month, year;
    private final static int MONTHS[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public void Z2(int d, int m, int y) {
        day=d;
        month=m;
        year=y;
    }
    public final static void main(String[] args) {
        Z2 d1=new Z2(28, 5, 2005);
        System.out.println(Z2.cmpDate(this));
    }
    public final int Day() {return day;}
    public final int Month() {return month;}
    public final int Year() {return year;}

    public final boolean leapyear() {return (year % 4)!=0;}
    public final String asString() {
        return String.valueOf(day)+'.'+String.valueOf(month)+'.'+String.valueOf(year);
    }
    public final int cmpDate(Z2 d1) {
        return (d1.year==this.year && d1.month==this.month && d1.day==this.day)?0:
                (d1.year>this.year && d1.month>this.month && d1.day>this.day)?1:-1;
    }
    public final int addDay(int add) {
        day+=add;
    while(day>MONTHS[month]) {
            day-=MONTHS[month];
            addMonth(1);
    }
    return day;
    }
    public final int addMonth(int add) {
        month+=add;
    while(month>MONTHS.length) {
            month-=MONTHS.length;
            addYear(1);
    }
    return month;
    }
    public final int addYear(int add) {return year+=add;}
}



Теперь при компиляции выдаёт:
Код
Z2.java [10:1] cannot resolve symbol
symbol  : constructor Z2 (int,int,int)
location: class Z2
        Z2 d1=new Z2(28, 5, 2005);
              ^
Z2.java [11:1] non-static variable this cannot be referenced from a static context
        System.out.println(Z2.cmpDate(this));
                                      ^
Z2.java [11:1] non-static method cmpDate(Z2) cannot be referenced from a static context
        System.out.println(Z2.cmpDate(this));
                             ^
3 errors
Errors compiling Z2.


Добавлено @ 12:56 
Какой символ он не может разрешить в 
Код
Z2 d1=new Z2(28, 5, 2005);
?

Автор: LSD 15.2.2007, 13:04
Код
class Z2
{
  private final static int MONTHS[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  private int day, month, year;

  public Z2(int d, int m, int y)
  {
    day = d;
    month = m;
    year = y;
  }

  public static void main(String[] args)
  {
    Z2 d1 = new Z2(28, 5, 2005);
    Z2 d2 = new Z2(15, 2, 2007);
    System.out.println(d1.cmpDate(d2));
  }

  public final int Day()
  {
    return day;
  }

  public final int Month()
  {
    return month;
  }

  public final int Year()
  {
    return year;
  }

  public final boolean leapyear()
  {
    return (year % 4) != 0;
  }

  public final String asString()
  {
    return String.valueOf(day) + '.' + String.valueOf(month) + '.' + String.valueOf(year);
  }

  public final int cmpDate(Z2 d1)
  {
    return (d1.year == this.year && d1.month == this.month && d1.day == this.day) ? 0 :
           (d1.year > this.year && d1.month > this.month && d1.day > this.day) ? 1 : -1;
  }

  public final int addDay(int add)
  {
    day += add;
    while(day > MONTHS[month])
    {
      day -= MONTHS[month];
      addMonth(1);
    }
    return day;
  }

  public final int addMonth(int add)
  {
    month += add;
    while(month > MONTHS.length)
    {
      month -= MONTHS.length;
      addYear(1);
    }
    return month;
  }

  public final int addYear(int add)
  {
    return year += add;
  }
}

Автор: Ivan Kolesnikov 15.2.2007, 13:13
Во 1-х у тебя неправильно описан конструктор класса, надо:
Код

public Z2(int d, int m, int y) {
    day=d;
    month=m;
    year=y;
}


Кодом:
Код

Z2.cmpDate(this)

Ты вызываешь метод класса(статик) cmpDate, а тебе нужно вызвать метод объекта для того чтобы сравнить его с другим объектом. И ты не имеешь в статическом методе ссылке на объект (ее просто не существует), поэтому в статических методах нельзя использовать this.

Например сравнить можно так:
Код

public final static void main(String[] args) {
    Z2 d1=new Z2(28, 5, 2005);
    Z2 d2=new Z2(28, 1, 2005);
    System.out.println(d1.cmpDate(d2));
}


А вообще советую почитать какую-нибудь книжку по java например "Философию java" там это все расписано.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)