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




Tentamen i

Objektorienterad programmering

för D2 m fl

lördag 15 december 2007 kl 08:00 - 13:00 i L001 och L003

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 lördag 5 januari 2008.
Visning och frågestund: Tisdag 8 januari 2008 kl 15:00-15: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 (4 p)

Ett C++-program ska arbeta med data för ett bibliotek, och behöver därför en klass som heter Bok. Den ska användas för att representera böcker. En bok har följande egenskaper:

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

Uppgift 2 (4 p)

Implementera konstruktorn och de andra medlemsfunktionerna i Bok.

Uppgift 3 (3 p)

Vi vill testa klassen Bok.

Skriv en main-funktion som först skapar två böcker (dvs två Bok-objekt), läser in båda, och till sist skriver ut båda. 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 (2 p)

Medlemsfunktionerna skriv och las 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 Bok& bok);
friend istream& operator>> (istream& in, Bok& bok);
Implementera dessa operatorer.

Uppgift 5 (2 p)

Vi vill testa de nya operatorerna i klassen Bok.

Skriv en main-funktion som först skapar två böcker (dvs två Bok-objekt), läser in båda, och till sist skriver ut båda.

Till skillnad från i uppgift 3 ovan, ska vi använda operatorerna från uppgift 4.

Uppgift 6 (2 p)

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

Skriv därför ytterligare en main-funktion som skapar två böcker (dvs två Bok-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 och skriva ut båda. 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 (7 p)

Ett bibliotek innehåller normalt mer än en enda bok. Därför vill vi kunna lagra böcker i en länkad lista. Skapa därför klassen Listbok, som ärver från klassen Bok men som utökar den klassen med en pekare till nästa Listbok.

Välj själv vilka konstruktorer och andra medlemsfunktioner som behövs, för att det ska gå att skapa länkade listor av Listbok-objekt.

a) (2p)

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

b) (2p)

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

c) (3p)

Skriv en main-funktion som skapar en lista med följande tre böcker, och sen skriver ut dem med skriv-funktionen:

Glöm inte att skriva ut dem också!

Uppgift 8 (11 p)

Skapa klassen Bibliotek, som ska representera ett bibliotek. Den ska spara alla böckerna i biblioteket som Listbok-objekt i en länkad lista. Det ska gå att lägga till böcker, att spara alla böckerna på en fil, och att läsa in alla böckerna från en fil.

Följande main-funktion ska fungera.

int main () {
    Bibliotek bib1;

    bib1.ny_bok("Tjuvarnas marknad", "Jan Guillou", 2004);
    bib1.ny_bok("The Good Terrorist", "Doris Lessing", 1985);
    bib1.spara_pa_fil("bibliotek.txt");

    Bibliotek bib2;

    bib2.las_fran_fil("bibliotek.txt");
    bib2.spara_pa_fil("bibliotek2.txt");
}
Det som ska hända här är att ett bibliotek (bib1) skapas, och vi lägger in två böcker i det. Sen sparas dessa böcker på en fil, kallad bibliotek.txt. Därefter skapas ett nytt bibliotek (bib2), och böckerna på filen bibliotek.txt läses in till detta nya bibliotek. Slutligen sparas böckerna på filen bibliotek2.txt.

a) (3p)

Skriv klassdefinitionen för klassen Bibliotek.

b) (8p)

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

Uppgift 9 (5 p)

Ett luciatåg består av stjärngossar, tärnor, lucior, tomtenissar och pepparkakor, som bildar en länkad lista. Skriv klassdefinitioner för klasserna Stjarngosse, Tarna, Lucia, Tomtenisse och Pepparkaka (och eventuella andra klasser som behövs) så att man kan skapa en länkad lista av dessa. Deltagarna i luciatåget (dvs, objekten i den länkade listan) ska kunna komma i godtycklig ordning.