Zdefiniuj klasę opisującą date c#

0

Witam, jestem zielony w temacie programowanie w jakimkolwiek języku. Potrzebuję zrobić zadanie przedstawione poniżej.
Będę bardzo wdzięczny za jakąkolwiek pomoc w tym zadaniu, nawet za samo naprowadzenie.
Język: c#

Zdefiniuj klasę opisującą datę. Zastanów się nad wyborem wewnętrznej reprezentacji dat (bez użycia dostępnych struktur jak DateTime). Zdefiniuj metody pozwalające na odczytywanie bieżącej daty i przestawianie jej o jeden tydzień w przód i w tył. Zadbaj o dobranie odpowiednich modyfikatorów dostępu do składowych. Pokaż przykłady użycia klasy.

0
somekind napisał(a):

https://pl.wikibooks.org/wiki/C_Sharp/Klasa

Najpierw po prostu opisać w klasie z czego się składa data? Ogólnie nie rozumiem jak trzeba to zrobić bez tego datatime tak ?

0

Wydaje mi się ,że w zadaniu chodzi abyś trzymał wszystko w intach. Data składa się z minuty,godziny,dnia,miesiąca,roku.

0

Masz zrobić klasę, która będzie taką twoją implementacją DateTime

więc raczej przyda Ci się w środku chociaż od biedy jakiś rok, miesiąc, dzień, godzina, sekunda, coś do stref czasowych, utc itd.

1

Stref czasowych lepiej nie ruszać na początek, bo to komplikuje wszystko wykładniczo. Zacząć od pól na rok, miesiąc, dzień, godzinę, minutę i sekundę, właściwości tylko do odczytu tych wartości, konstruktor i metody do przestawiania w przód i tył.

1
public class MyDateTime
{
     // Dodaj argumenty do konstruktora aby utworzyć instancję obiektu i przypisać wartości do właściwości
     public MyDateTime()
     {
     }
     
     // Tutaj zmienne które możesz tylko odczytać z zewnątrz, aby nikt nie wpisał złej wartości. Sterowanie właściwościami odbywać się będzie przez publiczne metody
     public int Year { get; private set; }
     public int Month { get; private set; }
     public int Days { get; private set; }
     public int Hours { get; private set; }
     public int Minutes { get; private set; }
     public int Seconds { get; private set; }

     // Tutaj metody który potencjalna osoba może wykorzystać w niecnych celach
    public override string ToString()
    {
         // Tutaj na przykład zwracanie daty w formie tekstowej
    }
    public void AddDay(uint count)
    {
         // Tutaj musisz dodać do Days wartość 1 i obliczyć, czy nie masz np. we właściwości Days wartości 32, bo wtedy trzeba przejść do kolejnego miesiąca. Musisz przewidzieć absolutnie wszystko, roboty na 2 lata
    }
    // i tak dodajesz resztę metod, które według Ciebie okażą się przydatne dla osoby, która będzie używać Twojej klasy
{
3
Grzegorz Świdwa napisał(a):
public class MyDateTime
{
     // Dodaj argumenty do konstruktora aby utworzyć instancję obiektu i przypisać wartości do właściwości
     public MyDateTime()
     {
     }
     
     // Tutaj zmienne które możesz tylko odczytać z zewnątrz, aby nikt nie wpisał złej wartości. Sterowanie właściwościami odbywać się będzie przez publiczne metody
     public int Year { get; private set; }
     public int Month { get; private set; }
     public int Days { get; private set; }
     public int Hours { get; private set; }
     public int Minutes { get; private set; }
     public int Seconds { get; private set; }

     // Tutaj metody który potencjalna osoba może wykorzystać w niecnych celach
    public override string ToString()
    {
         // Tutaj na przykład zwracanie daty w formie tekstowej
    }
    public void AddDay(uint count)
    {
         // Tutaj musisz dodać do Days wartość 1 i obliczyć, czy nie masz np. we właściwości Days wartości 32, bo wtedy trzeba przejść do kolejnego miesiąca. Musisz przewidzieć absolutnie wszystko, roboty na 2 lata
    }
    // i tak dodajesz resztę metod, które według Ciebie okażą się przydatne dla osoby, która będzie używać Twojej klasy
{

Górę klasy zaczałęś jakby immutable, jeśli taki jest rzeczywisty zamysł powinno być

 public MyDateTime AddDay(uint count)
  {
         // Tutaj musisz dodać do Days wartość 1 i obliczyć, czy nie masz np. we właściwości Days wartości 32, bo wtedy trzeba przejść do kolejnego miesiąca. Musisz przewidzieć absolutnie wszystko, roboty na 2 lata
  return ... 
  }
2

@AnyKtokolwiek: Przy Twoim przykładzie w przeciwieństwie do mojego możliwe jest wtedy wywołanie np.

MyDateTime dt = (new MyDateTime()).AddDays(1).AddDays(2).AddMinutes(1)

?

1
Grzegorz Świdwa napisał(a):

@AnyKtokolwiek: Przy Twoim przykładzie w przeciwieństwie do mojego możliwe jest wtedy wywołanie np.

MyDateTime dt = (new MyDateTime()).AddDays(1).AddDays(2).AddMinutes(1)

?

Right.

Zarazem jednak tzreba powiedzieć, że "starego typu" wzorzec do wielokrotnego użycia kropki, zwracający zmodyfikowane this, jest jakościowo głęboko różny od zwracania nowego niezmienniczego obiektu.
Akurat "wyrażenie kropkowe" w tych różnych wzorcach zewnętrznie wygląda identycznie (flaki już niekoniecznie: Immutable generuje obiekty dla GC, mutable tak jak tutaj, nie)

1

Przepraszam, że ja się wtrącam w nie swój wątek, ale napotkałem na nowość.
Chodzi o takie 2 przykłady?

  1. Pamięciożerny i obciążający GC. Nie potrafię wskazać plusów użycia w stosunku do punktu 2
public MyDateTime AddDay(uint count)
{
     return new MyDateTime(2020, 4, days + count, 13, 20, 0);
}
  1. Zwracanie this.
public MyDateTime AddDay(uint count)
{
     days += count
     return this;
}
0

https://referencesource.microsoft.com/#mscorlib/system/datetime.cs,df6b1eba7461813b
Nie wiem po co wymyślać na nowo koło . Zobacz sobie jak jest napisana klasa DateTime

1
Zimny Krawiec napisał(a):

https://referencesource.microsoft.com/#mscorlib/system/datetime.cs,df6b1eba7461813b
Nie wiem po co wymyślać na nowo koło . Zobacz sobie jak jest napisana klasa DateTime

Zapewne dlatego, że tego wymagał od niego prowadzący.
Też mi się trafiło pisanie programu do obsługi daty, co prawda w Javie, i niestety ni jak nie można się było wzorować na klasie z biblioteki standardowej.

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