Skip to content
This repository has been archived by the owner on Feb 24, 2019. It is now read-only.

2.2 Abstract inheritance #30

Closed
emlun opened this issue Oct 28, 2014 · 6 comments
Closed

2.2 Abstract inheritance #30

emlun opened this issue Oct 28, 2014 · 6 comments
Milestone

Comments

@emlun
Copy link
Collaborator

emlun commented Oct 28, 2014

#2.2 (arv från abstrakt basklass)

Gör följande: skriv två klasser Julian och Gregorian för den julianska
respektive gregorianska kalendern. Dessa ska ärva (direkt eller indirekt) från
klassen Date i uppgiften ovan. Ta ställning till nedanstående fyra alternativ
att ärva. Vid redovisningen ska du reflektera över för- och nackdelar för alla
de fyra alternativen.

   Date   |    Date   |        Date       |        Date
    ^     |     ^     |        /  \       |         ^
Gregorian |   Julian  | Gregorian  Julian |       middle
    ^     |     ^     |                   |        /  \
  Julian  | Gregorian |                   | Gregorian  Julian

Funktionalitet hos klasserna:

  • Implementation av basklassens virtuella funktioner vid behov
  • Konstruktor som tar år, månad, dag som int.
  • Man ska kunna kopiera och tilldela dateobjekt. Skillnaden mellan datumen
    ska vara noll efter tilldelning/kopiering.
  • DONE: (6ec8511) postfix-operatorer ++ och -- som returnerar kopia av sig själv.
  • Konstruktion utan argument (defaultkonstruktorn) ger dagens datum. För
    att få dagens datum ska du inte använda systemanrop direkt utan gå via en
    speciell funktion, se filen kattistime.h på kurskatalogen.
  • Korrekt hantering av skottår. I den julianska är det vart fjärde år. I den
    Gregorianska kalendern infaller skottdagen vart fjärde år men utgår de
    sekelårtal som inte är jämnt delbara med 400.
  • DONE (72b961f, f27f61e) Utskriftsoperatorn ska definieras och skriva ut datumet på formen
    YYYY-MM-DD där ental fylls ut med nollor (2000-01-01).
  • add_month ska ge samma datum i nästa månad men om det inte går så
    ska det plussas på 30 dagar istället. Exempel 1/9 -> 1/10 och 31/5 -> 30/6. Den 31/1 kan bli 1:a eller 2:a mars beroende på om det är skottår.
  • För skottdagen ska add_year ge sista februari: 29/2 2004 -> 28/2 2005.
    Anropar man add_year den 29/2 först med 1 och därefter med -1 så ska man
    hamna på 28/2. Lägger man till fyra år till skottdagen ska man hamna på
    skottdagen igen om det nu är skottår då: 29/2 2004 -> 29/2 2008. Hade man
    istället lagt till ett år i taget hade man hamnat på den 28:e
  • Anropar man add_month med argumentet 5 så ska det vara ekivivalent
    med om man gör add_month 5 gånger. Motsvarande gäller inte alltid för
    add_year se ovan.
  • Försöker man komma åt eller skapa ogiltiga dagar så ska out_of_range
    slängas.
  • Använd engelska namn med små bokstäver på dagar och månader. Var
    noga med stavningen.
  • Deklaration och implementation av klasserna ska skrivas i i separata header-
    respektive implementationsfiler (.h .cpp).

Alla implementationsdetaljer (exempelvis om du har en hjälpfunktion
leap_year()) ska döljas med protected eller private.

För att underlätta räkningar kan du låta datumen representeras av ett avstånd
till ett fixt datum. Du behöver inte implementera en sluten formel för
datumberäkning utan det är tillåtet att använda en hårdkodad (förberäknad)
tabell som t.ex. innehåller avstånd till årets början. Det räcker om din
kalender klarar datum från och med år 1858 fram till och med år 2558. Prova
dina klasser med filen datetest.cpp. Utöka testprogrammet med egna tester.
T.ex.

Gregorian // dagens datum
Julian j; // också dagens datum
std::cout << "Today it is " << g << " gregorian and " << j << " julian";
if (g - j == 0) std::cout << ". It is the same date" << std::endl;
g = j;
if (g - j == 0) std::cout << "It is still the same date" << std::endl;

Vilket ger utskriften

Today it is 2006-08-01 gregorian and 2006-07-19 julian. It is the same date
It is still the same date

Dagens datum är alltså inte samma i kalendrarna. Följande gäller:

1/1   1900 Greg = 20/12 1899 Jul
1/1   1900 Jul  = 13/1  1900 Greg
16/11 1858 Greg = 4/11  1858 Jul  modified julian day -1
17/11 1858 Greg = 5/11  1858 Jul  modified julian day  0
18/11 1858 Greg = 6/11  1858 Jul  modified julian day  1

Det finns flera datumkonverterare mellan gregorianska och julianska kalendern
på nätet om man vill kontrollera fler datumskillnader.

Historisk bakgrund

Den Julianska kalendern infördes av Julius Caesar år 46 f.Kr. Detta år infogade
Julius Caesar hela 90 dagar till den romerska kalendern för att återföra
månaderna till deras rätta ställe på året med hänsyn till årstiderna. I den
Julianska kalendern infinner sig skottår vart fjärde år.

På grund av tillkortakommanden i skottårsberäkningen i den Julianska kalendern
hade påsken vid tiden för påven Gregorius XIII förskjutits tio dagar
(förskjutningen var cirka 3/4 dag per århundrade). Gregorius ansåg att det var
dags att räta upp detta och proklamerade att torsdagen den 4:e oktober 1582
skulle följas av fredagen den 15:e oktober. Det var bara katolska länder som
följde påbudet. I Sverige bestämdes det att man skulle införa gregorianska
kalendern succesivt mellan år 1700 och 1740 genom att ta bort skottdagarna var
fjärde år vilket inte fungerade så bra i praktiken. Bland annat glömde man bort
att man inte skulle ha skottår 1708.

@emlun emlun added this to the Lab2 milestone Oct 28, 2014
@emlun
Copy link
Collaborator Author

emlun commented Oct 31, 2014

Use middle class with common utility stuff:

  • Days per month, months per year, month names etc.
  • Virtual utility functions for leap years etc.

@emlun
Copy link
Collaborator Author

emlun commented Oct 31, 2014

Things to implement in the middle class:

  • months_per_year
  • days_per_week
  • Day/month name constants

@ZetaTwo
Copy link
Owner

ZetaTwo commented Oct 31, 2014

Added basic WesternDate as middle class in e9cd2a3

@emlun
Copy link
Collaborator Author

emlun commented Nov 3, 2014

Tests for WesternDate added in a02e31c

@emlun
Copy link
Collaborator Author

emlun commented Nov 5, 2014

GregorianDate implemented in db17653 (#34)

@emlun
Copy link
Collaborator Author

emlun commented Nov 5, 2014

JulianDate implemented in 55dfd81 (#35)

@emlun emlun closed this as completed Nov 5, 2014
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants