Ö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 18 augusti 2008

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 38.
För godkänt betyg (3 respektive G) krävs 19 poäng.
Resultat och lösningar: Meddelas på kursens hemsida eller via e-post senast måndag 8 september 2008.
Återlämning av tentor: Efter att resultatet meddelats 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!

Scenario för uppgifterna

Det klassiska spelet Breakout går ut på att en boll studsar runt på skärmen:

Spelet

Om bollen träffar en sten, så försvinner stenen. Bollen kan studsa på kanterna och på racketen. Spelaren flyttar racketen i sidled, för att träffa bollen så att den studsar tillbaka in i spelet. Om spelaren missar bollen med racketen, så är den bollen förlorad.

Spelet behöver fyra olika saker som kan visas på skärmen:

Alla dessa fyra saker kan med ett gemensamt namn kallas för "spelsaker", och representeras av klassen Sak. Klassen Sak ska alltså vara en gemensam basklass (eller "superklass") för de andra klasserna, som alltså ärver från klassen Sak.

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)

Varje spelsak har en x-koordinat och en y-koordinat, som anger den sakens position på skärmen. De är heltal, och ska lagras i privata medlemsvariabler ("attribut"). Dessutom ska det finnas en konstruktor, som tar koordinaterna som argument, och publika funktioner som hämtar respektive ändrar de båda koordinaterna.

Dessutom ska det finnas en medlemsfunktion som heter skriv, och som skriver ut den sakens x- och y-koordinat.

På riktigt skulle det säkert också finnas någon funktion för att rita upp saken, men det hinner vi inte med här.

Skriv klassdefinitionen för klassen Sak. (Det är den som börjar med "class Sak", och som ofta skrivs i en egen .h-fil.)

Uppgift 2 (4 p)

Implementera konstruktorn och de andra medlemsfunktionerna i Sak.

Uppgift 3 (3 p)

Vi vill testa klassen Sak.

Skriv en main-funktion som först skapar två saker (dvs två Sak-objekt), och sedan 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)

Medlemsfunktionen skriv kan också göras i form av en operator. Vi lägger därför till följande i klassdefinitionen:
friend ostream& operator<< (ostream& out, const Sak& sak);
Implementera denna operator.

Uppgift 5 (1 p)

Vi vill testa den nya operatorn i klassen Sak.

Skriv en main-funktion som först skapar två saker (dvs två Sak-objekt), och sedan 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 Sak fungerar lika bra med dynamisk allokering.

Skriv därför ytterligare en main-funktion som skapar två saker (dvs två Sak-objekt), men den här gången ska den använda new för att skapa objekten. Sen ska den, precis som förut, skriva ut båda. Till sist ska den avallokera objekten.

Välj själv om du vill använda funktionerna, som i uppgift 3, eller operatorerna, som i uppgift 5. Glöm inte att avallokera objekten.

Uppgift 7 (3 p)

Stenar är saker, men förutom koordinaterna har de också en bredd och en höjd. Bredden och höjden är heltal, och ska lagras i privata medlemsvariabler. Dessutom behövs det en konstruktor, som tar både koordinaterna och bredden och höjden som argument, och publika funktioner som hämtar bredden och höjden. Stenarnas storlek kan inte ändras.

Dessutom ska det finnas en medlemsfunktion som heter skriv, och som skriver ut stenens koordinater, dess bredd och dess höjd.

Skriv klassdefinitionen för klassen Sten.

Uppgift 8 (3 p)

Implementera konstruktorn och de andra medlemsfunktionerna i Sten.

Uppgift 9 (7 p)

a) (2p)

Medlemsfunktionen skriv skriver ut data, men vi har inte gjort den virtuell. Visa, med programkod och tydliga förklaringar, vilket eller vilka problem som uppstår eftersom den inte är virtuell.

b) (3p)

Gör en ny skriv-funktion, som vi kan kalla visa. Ange vilken kod som ska stoppas in, och var, i klasserna Sak och Sten.

c) (2p)

Visa, med programkod och tydliga förklaringar, hur man kan använda funktionen visa. Förklara tydligt vad som händer.

Uppgift 10 (10 p)

Vi behöver också en klass Spelplan, som ska representera spelplanen. Som vi sett på figuren i scenariot innehåller en spelplan en boll, en racket, ett antal kantbitar och ett antal stenar.

Ha med både en eller flera lämpliga konstruktorer, och de "get"- och "set"-funktioner som verkar lämpliga för att hämta och ändra olika data.

a) (3p)

Skriv klassdefinitionen för klassen Spelplan.

b) (7p)

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