zadanie kalendarz

0

witam mam zadanie o kalendarzu. Prubuję je zrobić za pomocą metody pair ale, nie do końca wiem jak jej użyć. mógłby ktoś napisać jak to powinno wyglądać
tutaj opis zadania

Poniższy fragment kodu dostarczy tablicę char reprezentującą aktualną datę i godzinę:
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HHss") ;
java.util.Date date = new java.util.Date(System.currentTimeMillis()) ;
char [] tab = formatter.format(date) .toCharArray() ;
System.out.println(tab) ;
Pozyskaną informację o dacie, godzinie i będzie można zakodować w pojedynczej zmiennej typu long korzystając z kodowania używającego:
• 3 bajtów na zakodowanie roku,
• 4 bitów na zakodowanie miesiąca,
• 1 bajtów na zakodowanie dnia,
• 1 bajtów na zakodowanie godziny,
• 2 bajtów na zakodowanie minuty.
Zdefiniuj statyczną metodę toLong(char[]) ekstrahującą potrzebne dane z argumentu i zwracającą pojedynczą wartość long reprezentującą zakodowane bitowo informacje zgodnie z powyższym schematem. Następnie przygotuj metodę printMonth przyjmującą jako argumenty long date, opisujące datę w powyższym formacie. Uzupełnij ciało tej metody tak aby wyświetlała pełen miesiąc kalendarza, jak w przykładzie:
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24>25<26
27 28 29 30 31
(nawiasy ostre wskazują aktualny dzień).

Tutaj jak na razie próbuję to jakoś zaimplementować

import javafx.util.Pair;
import java.util.ArrayList;

public
class p1 {

public static void main(String[] args) {
    java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    java.util.Date date = new java.util.Date(System.currentTimeMillis());
    char[] tab = formatter.format(date).toCharArray();
    System.out.println(tab);

}

}

static class toLong{
static long extract(int year, int month, int day, int hour, int minute) {

    Pair<String, Integer> values_table = new values_table<>(
            (year, 3);
            (month, 4);
            (day, 1);
            (hour, 1);
            (minute, 2);
    );
}

static class printMonth{

}

}

0

Dlaczego za pomocą klasy Pair? Jak dla mnie to raczej trzeba zrobić za pomocą operatorów bitowych i przesunięć. Ofc kodowanie tak dobrane, co by w Javie za łatwo nie było ;)

0

Znaczy że jak to ma wyglądać, w c++ było podobne zadanie z bitami i stringami i można i tam można to było zrobić przy pomocy pair, a tutaj nie wiem jak to miałoby wyglądać. Mógłbyś napisać żebym zobaczył jak to się robi?

0

No np tak dla roku:
tab[0] + tab[1] + tab[2] + tab[3] & 0xffff

W javie nie masz typów unsigned, można je stworzyc za pomocą klasy Byte ale jak zerkniesz tam w implementacje to dokładnie tak jak wyżej podałem to jest robione. Czyli jak potrzebujesz unsigned typu, to bierzesz o jeden typ większy, (np dla unsigned short, bierzemy inta) i wywalamy wieksze bity koniukcja. Do odkodowania tylko podstawiasz pod maskę i też koniukcją to ogarniesz

W zadaniu nie jest podane czy ma być big endian czy little endian wiec zakładam ze bez różnicy

0

Tylko że w zadaniu jest że wszystkie te informacje mają być zakodowane w typie long, a to jest przecież już najwieksza wartość. poza tym jest tam napisane że trzeba zdefiniować statyczną metodę toLong(char[]), i tu nie rozumiem bo przecież te wszystkie wartości można chyba zapisać chociażby w intach więc po co akurat tak. Wybacz ale z tego tematu nie jestem zbyt dobry więc fajnie by było jakbyś to trochę szczegółowiej wytłumaczył.

0

Nie potrzebujesz unsigned long'a więc poprzedni mój post tego typu nie dotyczył. Jak policzysz to kodowanie to wyjdzie dokładnie 8 bajtów wjęc się zgadza.
Tak, można to zapisać w int'ach ale wtedy po pierwsze byś zużył 20 bajtów a nie 8 a po drugie na tym polegają zadania - żeby coś sprawdzić / nauczyć się / przećwiczyć : D.
Wyciągasz sobie 4 znaki odpowiadające za rok, każdy znak jest przy okazji jakąś liczbą ale tutaj raczej bym wyabstrahował od kodów ASCII i sparsował je jako liczby, łatwiej będzie odkodowywać. za pomocą operatorów bitowych zapisujesz go zgodnie z kodowaniem, te ze sobą łączysz i zwracasz long'a.

Twoja statyczna metoda później patrzy: 0000 0111 1110 0011 0000 0011 ......że jej wpadło coś takiego. No to wiesz, że na przykład 2 bajty, odpowiadają za rok, więc robimy koniukcję bitową, żeby ustalić które bity są ustawione:

0000 0111 1110 0011 & 1111 1111 1111 1111 = 0000 0111 1110 0011 = 2019. I analogicznie dla pozostałych.

Miesiące można podzielić na grupy, te które mają 30 dni i te które mają 31 (zahardkodować tą informację), a dla lutego obliczać ad-hoc za każdym razem żeby upewnić się, czy to nie jest rok przestępny, bo wtedy trzeba będzie wyprintlowac kalendarz zawierający jeden dzień więcej

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