zadanie1, przeciążone konstruktory

zadanie1, przeciążone konstruktory
SA
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:7
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:

Kopiuj
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

Kopiuj
	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);

"...4 sektundy i życie nie boli" by La Sante-4sekundy
edytowany 2x, ostatnio: saltcushy
Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:9 dni
  • Lokalizacja:Stacktrace
  • Postów:6822
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.

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 4x, ostatnio: bogdans
Koziołek
Pytanie czy można używać klas API.
bogdans
Autor nie wspominał o zakazie. Jeśli jest zakaz, to również lata przestępne należy wyznaczać samodzielne (uwzględniając zmianę kalendarza z juliańskiego na gregoriański). Funkcja przesun_date() staje się koszmarnie skomplikowana.
KK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:135
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:

Kopiuj
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.

edytowany 2x, ostatnio: kaskader_kl
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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

Kopiuj
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));
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
SA
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:7
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 :).


"...4 sektundy i życie nie boli" by La Sante-4sekundy
edytowany 3x, ostatnio: saltcushy
KK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:135
0

Masz dane:

Kopiuj
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:

Kopiuj
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ć.

bogdans
Zgodnie z wymaganiami powinno być (w funkcji drukuj): System.out.println(&quot;Data to: &quot;+(dzien&lt;10?&quot;0&quot;:&quot;&quot;)+dzien +&quot; - &quot;+(mies&lt;10?&quot;0&quot;:&quot;&quot;)+mies +&quot; - &quot;+rok);
KK
@bogdans Sorry, Nie zauważyłem tego
WE
  • Rejestracja:około 14 lat
  • Ostatnio:około 12 lat
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ą:

Kopiuj
public boolean  przystepny(int rok){
       return ((rok % 4 == 0 && rok % 100 != 0) || rok % 400 == 0);
}
edytowany 1x, ostatnio: Weniu
bogdans
Jak przesunięcie będzie rzędu -600000, to wylądujesz w kalendarzu juliańskim. Wtedy obowiązywały inne zasady.
WE
chyba teraz będzie dobrze, poprawiłem błędy ;p
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
KK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:135
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.

Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:9 dni
  • Lokalizacja:Stacktrace
  • Postów:6822
0

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
edytowany 1x, ostatnio: Koziołek
SA
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:7
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

Kopiuj
 Data data_przesunieta = data_ur.przesun_date(7);

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


"...4 sektundy i życie nie boli" by La Sante-4sekundy
KK
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:135
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.