Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)






Tentamen i

Objektorienterad programmering

för D2 m fl

måndag 5 november 2007 kl 08:00 - 13:00

Gäller som tentamen för:
DT2004 Datateknik B, Objektorienterad programmering, provkod 0100
DT2006 Datateknik B, Tillämpad datavetenskap B, provkod 0330
OBP012 Objektorienterad programmering, provkod 0101 (och 0100)
TDD122 Tillämpad datavetenskap B, provkod 0330 (och 0200)







Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 20 poäng.
Resultat och lösningar: Meddelas på kursens hemsida eller via e-post senast måndag 19 november 2007.
Visning och frågestund: Måndag 19 november 2007 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på institutionen. Man kan också få sin rättade tenta hemskickad.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-73 47 013.





LYCKA TILL!

För alla uppgifter på tentan gäller: Man får använda både standard-C++ (som till exempel har pekare som anges med * och objekt som skapas med new) och Microsofts dialekt C++/CLI (som till exempel har pekare som anges med ^ och objekt som skapas med gcnew). Man kan dock få poängavdrag om man blandar dem på ett felaktigt sätt, till exempel om man skapar ett objekt med gcnew och sen pekar på det med en *-pekare.

Uppgift 1 (3 p)

Ett C++-program som ska arbeta med olika datum, och behöver därför en klass som heter Datum och som ska användas för att representera datum. Ett datum har följande egenskaper:

Skriv klassdefinitionen för klassen Datum. Den ska ha en lämplig konstruktor, och tre medlemsfunktioner:

Det gör inget om skriv skriver 2007-9-1 i stället för det snyggare 2007-09-01.

Uppgift 2 (4 p)

Implementera konstruktorn och de tre andra medlemsfunktionerna i Datum.

Uppgift 3 (3 p)

Vi vill testa klassen Datum.

Skriv en main-funktion som först skapar två datum (dvs två Datum-objekt), läser in båda, skriver ut båda, och till sist jämför dem. Om de är lika ska programmet skriva ut Lika!, annars Olika!. Objekten ska lagras i vanliga variabler, och inte allokeras dynamiskt med new.

I den här och alla andra uppgifter på tentan gäller: Om du ska använda en klass, funktion eller liknande sak från en tidigare uppgift, behöver du inte skriva koden för den på nytt. Du får också använda den även om du inte gjort uppgiften där man skulle skriva den.

Uppgift 4 (3 p)

Medlemsfunktionerna skriv, las och lika kan också göras i form av operatorer. Vi lägger därför till följande i klassdefinitionen:
friend ostream& operator<< (ostream& out, const Datum& datum);
friend istream& operator>> (istream& in, Datum& datum);
bool operator== (Datum& andra_datumet);
Implementera dessa tre operatorer.

Uppgift 5 (2 p)

Vi vill testa de nya operatorerna i klassen Datum.

Skriv en main-funktion som först skapar två datum (dvs två Datum-objekt), läser in båda, skriver ut båda, och till sist jämför dem. Om de är lika ska programmet skriva ut Lika!, annars Olika!.

Till skillnad från i uppgift 3 ovan, ska vi använda de tre nya operatorerna för detta.

Uppgift 6 (2 p)

Vi vill testa om klassen Datum fungerar lika bra med dynamisk allokering.

Skriv därför ytterligare en main-funktion, som först skapar två datum (dvs två Datum-objekt), men den här gången ska den använda new för att skapa objekten. Sen ska den, precis som förut, läsa in båda, skriva ut båda, och till sist jämföra dem. Om de är lika ska programmet skriva ut Lika!, annars Olika!. Glöm inte att avallokera objekten.

Välj själv om du vill använda funktionerna, som i uppgift 3, eller operatorerna, som i uppgift 5.

Uppgift 7 (3 p)

Skriv ett C++-program som läser in datum från standardinmatningen, och sparar dem på en fil. Välj själv om det ska vara en text- eller binärfil. (Och ange vilket du valde!) Välj själv hur användaren ska avsluta inmatningen. (Och ange vilket sätt du valde!)

Uppgift 8 (3 p)

Skriv ett C++-program som först frågar efter ett datum, som användaren får skriva in på standardinmatningen, och sen talar om hur många förekomster av det datumet som finns på filen från uppgiften ovan.

Uppgift 9 (9 p)

Klassen Fartyg ska användas för att lagra data om fartyg. Ett fartyg har ett namn, till exempel Titanic, och ett datum när det sjösattes, till exempel 1911-05-31. Använd klassen Datum för att lagra sjösättningsdatumet.

Det ska finnas en medlemsfunktion skriv, som skriver ut data om fartyget på standardutmatningen, till exempel så här:

Fartyget Titanic från 1911-05-31
Den funktionen ska vara virtuell, så eventuella subklasser till Fartyg ska kunna göra sina egna, mer specialiserade, utskrifter.

Det ska finnas en medlemsfunktion antal_kanoner, som returnerar antalet kanoner som fartyget har. Den ska returnera noll, för vanliga fartyg har (normalt) inga kanoner. Den funktionen ska också vara virtuell, så eventuella mer beväpnade subklasser till Fartyg ska kunna returnera andra värden.

Dessutom ska alla fartygen lagras i en länkad lista. Lägg till lämpliga medlemsvariabler och medlemsfunktioner för detta.

a) (3p)

Skriv klassdefinitionen för klassen Fartyg. Glöm inte att det ska finnas (minst) en konstruktor.

b) (3p)

Skriv definitioner (dvs implementera) för alla medlemsfunktionerna, och eventuella andra saker som behövs.

c) (1p)

Skriv kodrader för att skapa fartyget Titanic, som sjösattes 1911-05-31, och sen skriva ut det med skriv-funktionen.

d) (2p)

Skriv funktionen skriv_alla_fartyg. Den ska skriva ut alla fartygen, genom att gå igenom den länkade listan och anropa skriv-funktionen i vart och ett av fartygen.

Uppgift 10 (8 p)

Ett Slagskepp är en sorts Fartyg, men har dessutom ett antal kanoner. Dess skriv-funktion ska skriva ut något i den här stilen:
Fartyget Yamato från 1940-08-08
Det är ett slagskepp med 61 kanoner.

a) (2p)

Skriv klassdefinitionen för klassen Slagskepp.

b) (2p)

Skriv definitioner (dvs implementera) för alla medlemsfunktionerna, och eventuella andra saker som behövs.

c) (1p)

Hur behöver funktionen skriv_alla_fartyg från uppgiften ovan förändras, nu när det finns en ny sorts fartyg att ta hänsyn till? Förklara också varför.

d) (1p)

Skriv funktionen besegrar, som tar två slagskepp som argument, och returnerar true om det första slagskeppet besegrar det andra, och false om det inte gör det. I en strid är det alltid slagskeppet med flest kanoner som vinner. Om de har lika många kanoner, vinner ingen, och funktionen ska då returnera false.

e) (2p)

Skapa två slagskepp, Yamato, som sjösattes 1940-08-08 och har 61 kanoner, och Iowa, som sjösattes 1942-08-27 och har 158 kanoner. Låt dem strida med varandra genom att anropa funktionen besegrar, och skriv ut det slagskepp som vinner.