zadanie1, przeciążone konstruktory

0

Nie rozumiem jak zrobić drugą cześć. Prosił bym o jakieś wskazówki, chyba za mało przerobiłem turlali żeby zrobić te zadanie.
Nie ma pojęcia jak użyć "7" w metodzie Data przesun_date. Kolega doradzał mi żebym zwrócić parametr w metodzie, nie mam pojęcia jak to zrobić .
Prosił bym o pomoc, nie chce sobie zrobić większych zaległości:(

Napisz klasę daty, operującą na składowych w postaci dnia, miesiąca i roku, które są
inicjalizowane w dwóch przeciążonych konstruktorach, tak aby utworzenie referencji do klasy
Data w klasie Wydruk:

public class Wydruk
{
public static void main(String[] args)
{
Data data_ur = new Data(25,2,2010);
Data data_przesunieta = data_ur.przesun_date(7);
data_ur.drukuj();
data_przesunieta.drukuj();
}
}

dało następujący wynik wydruku:
Data to: 25 - 02 - 2010
Data to: 04 - 03 - 2010

Mam tylko

	public Data(int dzien, int mies, int rok) {
		this.dzien=dzien;
		this.mies=mies;
		this.rok=rok;
		// TODO Auto-generated constructor stub
	}

	
	

	public void drukuj() {
		// TODO Auto-generated method stub
		System.out.println("Data to: "+dzien +" - "+mies +" - "+rok);
0

W przesun_date (zakładam, że chodzi o dzień) powinieneś:

  • dodać parametr do liczby dni i zapisać w zmiennej lokalnej(broń boże na polu obiektu!)
  • sprawdzić czy suma nie wypada za zakres dla danego miesiąca
  • jeżeli tak to podbić miesiąc i w razie czego rok (kolejne zmienne lokalne)
  • mając nowe wartości zwrócić nowy obiekt Data utworzony na ich podstawie.
0

Można też w metodzie przesun_date wykorzystać klasę GregorianCalendar: jej konstruktor GregorianCalendar(year,month,day) i metodę add(), która sama zajmie się odpowiednią zmianą miesiąca i roku. Samodzielne obliczenia dla przesunięcia równego 15784 mogą być dość kłopotliwe :P.
Metoda drukuj() wymaga przeróbek, aktualna wyświetli 4 - 3 - 2010, a nie 04 - 03 - 2010.

0

Jak pamiętam swoje studia, to te zadania miały być zrobione następująco:
Robisz metodę dodajDzien(), która dodaje do daty jeden dzień sprawdzając, czy się nie przesunął miesiąc, dodajMiesiac(), która dodaje miesiąc, przy czym znów przy 12 zamiast wpisać 13, to wpisuje 1 i wywołuje dodajRok(). Podobnie robisz z odejmowaniem.
później:

public void przesunDate(int ile){
   if (ile<0){
      for (int i=0;i>ile;i--){
         odejmijDzien();
      }
   } else {
      for (int i=0;i<ile;i++){
         dodajDzien();
      }
   }
}

Powyższy sposób nic nie zwraca, ale zawsze można zrobić "return this;" lub na początku metody stworzyć nową datę, przesunąć ją i zwrócić. Mogło nawet chodzić o to drugie rozwiązanie tak, żeby stworzyć nowy konstruktor, który pobiera obiekt klasy "Data" i wczytuje sobie z niego dzień/miesiąc/rok. Jak już masz taki nowy obiekt, to do niego dodajesz/odejmujesz 7 dni.

Oczywiście można to zrobić inaczej (użyć biblioteki Calendar, lub zamienić na reprezentację "ilość milisekund od.." i dodać/odjąć), ale domyślam się, że w tym zadaniu chodziło jednak o coś w tym stylu.

0

Jak już nastała pora na rozwiązania, to pokażę też swoje.

public Data przesun_date(int day)
{
     GregorianCalendar date = new GregorianCalendar(rok,mies-1,dzien);
     date.add(GregorianCalendar.DAY_OF_MONTH,day);
     return new Data(date.get(GregorianCalendar.DAY_OF_MONTH),date.get(GregorianCalendar.MONTH)+1,date.get(GregorianCalendar.YEAR));
}
0

@kaskader_kl, wszystko mi się mota, wydaje mi się że chodzi o przesuniecie dni przez obiekt(bez zmiany w main), z tym dodawanie to np. jak dzień 28 to następny miesiąc? == nie wiem czy się zdążę "dokształcić" :(, mam jeszcze kilka zadań.
@bogdans, bez GregorianCalendar ale fajne ułatwienie :).

0

Masz dane:

public class Wydruk{
     public static void main(String[] args){
          Data data_ur = new Data(25,2,2010);
          Data data_przesunieta = data_ur.przesun_date(7);
          data_ur.drukuj();
          data_przesunieta.drukuj();
     }
}

Stanowczo potrzebujesz klasy Data, a w niej:

public class Data{
    int dzien;
    int mies;
    int rok;
    public Data(int dzien, int mies, int rok) {
        this.dzien=dzien;
        this.mies=mies;
        this.rok=rok;
    }

     public void drukuj(){
        System.out.println("Data to: "+dzien +" - "+mies +" - "+rok);
     }

     public Data przesunDate(int ile){
         Data nowaData = new Date(dzien, mies, rok);
         if (ile<0){
                for (int i=0;i>ile;i--){
                     nowaData.odejmijDzien();
                }
         } else {
                for (int i=0;i<ile;i++){
                     nowaData.dodajDzien();
                }
         }
         return nowaData;
     }

     public void dodajDzien(){
         //analogicznie do odejmowania
     }

     public void odejmijDzien{
         if (dzien>1){
              dzien--;
         } else {
              if (miesiac>1){
                   miesiac--;
                   //sprawdzenie, do kŧórego miesiąca przeskoczyliśmy i ustawienie dnia na ostatni w tym miesiącu (pamiętaj, że różne miesiące kończą się różnymi dniami!)
              } else {
                    miesiac = 12;
                    rok--;
                    dzien=31;
              } 
         }
     }
}

Pisane w notatniku, więc mogą być literówki. Już bardziej Ci nie pomogę, musisz sam pokombinować.

0

Ilość dni w każdym miesiącu łatwo sprawdzić. Mamy 12 miesięcy. Nieparzyste mają 31, a parzyste 30. Po prostu robisz działanie, numer miesiąca % 2 i sprawdzasz czy jest parzysty bądź nieparzysty. @Edit Po 7 miesiącach parzyste mają 31, a nieparzyste 30.
Problem pojawia się z lutym, wtedy musisz sprawdzić dodatkowo rok czy jest przystępny. Aby rok był przystępny musi być: podzielny przez 4, ale nie podzielny przez 100, oraz dodatkowo musi być podzielny przez 400. Zrobisz to taką funkcją:

public boolean  przystepny(int rok){
       return ((rok % 4 == 0 && rok % 100 != 0) || rok % 400 == 0);
}
0

Nieparzyste mają 31, a parzyste 30

Chyba w twoim wyimaginowanym świecie. Lipiec oraz Sierpień mają 31 -> w połowie roku następuje zmiana i to parzyste mają 31

0

Najlepiej sprawdzać każdy miesiąc osobno. If (mies == 1 || mies == 3 ....) to ostatni dzień, to 31. Jeśli prowadzący jest upierdliwy, to warto dowiedzieć się, kiedy w historii nasz kalendarz miał zaburzenia - dodatkowe dnie i inne cuda.

0

Przepraszam że z pośłizgiem odpisuje. w tym zadaniu nie wiedziałem jak poprzerabiać według wskazówek więc wstawiłem na sztywno date dzięki @kaskader_kl ;)
czy może mi ktoś wytłumaczyć co jest

 Data data_przesunieta = data_ur.przesun_date(7);

</quote> nie tworzy to obiektu bo nie ma new tylko...?

0

data_ur, jest obiektem klasy Data. W klasie tej jest metoda przesun_date(int). Metoda przesun_date(int) coś zwraca. W tym przypadku zwraca nowy obiekt tej samej klasy "Data". Zauważ, że w tym, co nabazgrałem parę postów wyżej jest metoda przesunDate(ile), która na początku tworzy nowy obiekt klasy "Data" (masz tutaj swoje "new"), później ileś razy przesuwa tę utworzoną datę w odpowiednią stronę, a na końcu ją zwraca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1