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

2.3 Calendar #31

Closed
emlun opened this issue Oct 28, 2014 · 1 comment
Closed

2.3 Calendar #31

emlun opened this issue Oct 28, 2014 · 1 comment
Milestone

Comments

@emlun
Copy link
Collaborator

emlun commented Oct 28, 2014

#2.3 (polymorfi, pekare till basklass, strömmar)

I den här uppgiften kommer du att skriva en klass Calendar som:

  • internt håller en lista med händelser (såsom julafton, födelsedag) kopplade
    till datum
  • har en defaultkonstruktor som sätter aktuellt datum till nuvarande datum.
  • kan tilldelas en annan kalender (som kan vara instansierad med en annan
    datumtyp)
  • har en metod bool set_date(int år, månad, dag) som sätter om aktuellt
    datum. Om parametrara bildar ett ogiltigt datum ska false returneras.
  • har metoden bool add_event som kan ta en till fyra parametrar: händelse
    (string) och parametrarna dag, månad, år (int). Om någon av de senare
    parametrarna saknas så används aktuellt datum. Om datumet är ogiltigt ska
    false returneras. Om händelsen (strängen) redan finns i kalendern på det
    angivna datumet ska false returneras och ingenting nytt läggas in.
  • remove_event med samma parametrar som add_event. Om det inte går
    att ta bort händelsen returneras false.

Använd STL för att hantera dina händelser. Använd std::string till strängarna
som representerar händelser. En dålig lösning är att ha datum och händelse i
två parallella vektorer med gemensamt index. Varför? Förklara dig vid redo-
visningstillfället.

Låt din kalenderklass vara en mallklass som tar en klass nedärvd från Date
som argument. När du använder datum ska du endast använda dig av funktioner som
ligger i basklassen Date. På så sätt håller du kalenderklassen
datumoberoende. Några exempel på hur din klass ska bete sig:

std::cout << "----------------------------------------" << std::endl;
Calendar<Gregorian> cal;
cal.set_date(2000, 12, 2);
cal.add_event("Basketträning", 4, 12, 2000);
cal.add_event("Basketträning", 11, 12, 2000);
cal.add_event("Nyårsfrukost", 1, 1, 2001);
cal.add_event("Första advent", 1);          // år = 2000, månad = 12
cal.add_event("Vårdagjämning", 20, 3);      // år = 2000
cal.add_event("Julafton", 24, 12);
cal.add_event("Kalle Anka hälsar god jul", 24); // också på julafton
cal.add_event("Julafton", 24); // En likadan händelse samma datum ska
                               // ignoreras och inte sättas in i kalendern
cal.add_event("Min första cykel", 20, 12, 2000);
cal.remove_event("Basketträning", 4);

std::cout << cal; // OBS! Vårdagjämning och första advent är
                  // före nuvarande datum och skrivs inte ut
std::cout << "----------------------------------------" << std::endl;
cal.remove_event("Vårdagjämning", 20, 3, 2000);
cal.remove_event("Kalle Anka hälsar god jul", 24, 12, 2000);
cal.set_date(2000, 11, 2);
if (! cal.remove_event("Julafton", 24)) {
    std::cout << " cal.remove_event(\"Julafton\", 24) tar inte"<< std::endl
              << " bort något eftersom aktuell månad är november" << std::endl;
}
std::cout << "----------------------------------------" << std::endl;
std::cout << cal;

Man ska kunna skriva ut kalendern m.hj.a utskriftsoperatorn. Enbart händelser
efter(!) aktuellt datum ska skrivas ut. Kalenderns händelser ska vara sorterade
i första hand på datum och i andra hand på insättningsordning. Formatet ska
vara på formen datum : händelse med efterföljande retur, se nedan. OBS!
nollor framför ental (enligt Date) samt mellanslag före och efter kolon

----------------------------------------
2000-12-11 : Basketträning
2000-12-20 : Min första cykel
2000-12-24 : Julafton
2000-12-24 : Kalle Anka hälsar god jul
2001-01-01 : Nyårsfrukost
----------------------------------------
 cal.remove_event("Julafton", 24) tar inte
 bort något eftersom aktuell månad är november
----------------------------------------
2000-12-01 : Första advent
2000-12-11 : Basketträning
2000-12-20 : Min första cykel
2000-12-24 : Julafton
2001-01-01 : Nyårsfrukost

Testa din kod innan du skickar in den. Endast inskickad och testad kod kan
redovisas. Redovisningen sker vid schemalagda labbtillfällen. Om redovisningen
går bra och källkoden skickades in innan bonusdatum (står på labkvittot) får du
två bonuspoäng. Det är mycket vanligt att man får komplettera sin labb innan
den blir godkänd. Se för din egen skull till att få en underskrift på
labbkvittot av handledaren oavsett om labben ska kompletteras eller inte.

@emlun emlun added this to the Lab2 milestone Oct 28, 2014
@ZetaTwo
Copy link
Owner

ZetaTwo commented Nov 6, 2014

Implemented in 8d1d587

@ZetaTwo ZetaTwo closed this as completed Nov 6, 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