You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Feb 24, 2019. It is now read-only.
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:
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.
The text was updated successfully, but these errors were encountered:
#2.2 (arv från abstrakt basklass)
Gör följande: skriv två klasser
Julian
ochGregorian
för den julianskarespektive gregorianska kalendern. Dessa ska ärva (direkt eller indirekt) från
klassen
Date
i uppgiften ovan. Ta ställning till nedanstående fyra alternativatt ärva. Vid redovisningen ska du reflektera över för- och nackdelar för alla
de fyra alternativen.
Funktionalitet hos klasserna:
int
.ska vara noll efter tilldelning/kopiering.
++
och--
som returnerar kopia av sig själv.att få dagens datum ska du inte använda systemanrop direkt utan gå via en
speciell funktion, se filen kattistime.h på kurskatalogen.
Gregorianska kalendern infaller skottdagen vart fjärde år men utgår de
sekelårtal som inte är jämnt delbara med 400.
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
och31/5 -> 30/6
. Den 31/1 kan bli 1:a eller 2:a mars beroende på om det är skottår.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 manhamna 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 manistället lagt till ett år i taget hade man hamnat på den 28:e
add_month
med argumentet5
så ska det vara ekivivalentmed om man gör
add_month
5 gånger. Motsvarande gäller inte alltid föradd_year
se ovan.out_of_range
slängas.
noga med stavningen.
respektive implementationsfiler (
.h
.cpp
).Alla implementationsdetaljer (exempelvis om du har en hjälpfunktion
leap_year()
) ska döljas medprotected
ellerprivate
.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.
Vilket ger utskriften
Dagens datum är alltså inte samma i kalendrarna. Följande gäller:
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.
The text was updated successfully, but these errors were encountered: