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








Tentamen i

Objektorienterad programmering

för D2 m fl

onsdag 16 augusti 2006 kl 8:00 - 13:00 i L001








Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För betyget 3 respektive G krävs 20 poäng.
Resultat: Meddelas på kursens hemsida senast måndag 28 augusti 2006.
Visning: Måndag 28 augusti 2006 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentor hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-7347013.



LYCKA TILL!

Uppgift 1 (5 p)

Vi behöver en klass som heter PUNKT, och som håller reda på punkter med x- och y-koordinater. En PUNKT ska ha två privata medlemsvariabler, kallade x och y, som (förstås) ska innehålla x- och y-koordinaten för punkten. Den ska ha en eller flera lämpliga konstruktorer, en utmatningsoperator, och en medlemsfunktion som heter flytta, som flyttar punkten, dvs ändrar dess x- och y-koordinat.

I main-funktionen finns en programsnutt som ser ut så här:

  PUNKT p1(1.5, 2.0);
  PUNKT p2;
  std::cout << p1 << p2;
  p2.flytta(0.5, 0.3);
  std::cout << p2;
Den ska ge en utmatning som liknar den här:
  [Punkt: x = 1.5, y = 2]
  [Punkt: x = 0, y = 0]
  [Punkt: x = 0.5, y = 0.3]

Skriv klassen PUNKT. Du ska skriva specifikationen för klassen (dvs den som börjar med nyckelordet class), och även skriva de implementationer som behövs (till exempel av medlemsfunktionen flytta).

Som en ledtråd finns den här raden, som kan ingå i specifikationen:

  friend std::ostream& operator<< (std::ostream& o, const PUNKT& p);

Uppgift 2 (5 p)

a) (1p)

Variablerna p1 och p2 i uppgiften ovan innehåller PUNKT-objekt, men man kan också skapa fler PUNKT-objekt dynamiskt med hjälp av new, som sen kan pekas ut med pekare. Behöver man ändra något i specifikationen av klassen PUNKT för att det ska gå att skapa PUNKT-objekt med hjälp av new? I så fall vad?

b) (2p)

Skriv en programsnutt som definierar två variabler, pp1 och pp2, som är pekare till PUNKT-objekt. Skapa två PUNKT-objekt med new, en med koordinaterna (x = 0, y = 1.2) och en med koordinaterna (x = 0.3, y = -0.3), och låt pp1 och pp2 peka ut dessa nya PUNKT-objekt.

c) (1p)

Skriv en programsnutt som först flyttar punkten med koordinaterna (x = 0, y = 1.2), dvs den som pekas ut av pp1, till koordinaterna (x = 14, y = 7), och som sen skriver ut den med hjälp av utmatningsoperatorn.

d) (1p)

Efter deluppgift c kommer den punkt som anges av pp1 att ha koordinaterna (x = 14, y = 7), och den punkt som anges av pp2 att ha koordinaterna (x = 0.3, y = -0.3). Skriv en programsnutt som, på något sätt, byter plats på punkterna, alltså så att den punkt som anges av pp1 får koordinaterna (x = 0.3, y = -0.3), och den punkt som anges av pp2 får koordinaterna (x = 14, y = 7).

Uppgift 3 (5 p)

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

a) (3p)

Skapa klassen LINJE, som representerar en rät linje som går mellan två punkter. Ett LINJE-objekt ska innehålla två PUNKT-objekt, som vi sen tänker oss att linjen dras emellan.

Skriv först specifikationen och implementationerna, och skriv sen en programsnutt som skapar två linjer: en som går från punkten (x = 0, y = 0) till punkten (x = 1.0, y = 2.0), och en som går från punkten (x = 0, y = 0) till punkten (x = 2.0, y = 3.0).

b) (2p)

Längden på en linje från punkten (x1, y1) till punkten (x2, y2) kan beräknas så här:
sqrt(pow(x1-x2, 2) + pow(y1-y2, 2))

Nu vill vi att klassen LINJE ska ha en medlemsfunktion som heter langd, och som returnerar längden på linjen. Kom ihåg att x och y var privata i klassen PUNKT.

Vilket problem uppstår? Berätta hur vi måste ändra klassen PUNKT, och skriv sen också medlemsfunktionen langd.

Uppgift 4 (5 p)

Totalförsvarets forskningsinstitut, FOI, har byggt ett system för automatiska UFO-observationer. UFO betyder unidentified flying object, dvs oidentifierat flygande föremål. Dygnet runt spanar FOI:s radar efter mystiska flygande föremål, och alla observationer lagras i ett C++-program. Det som behöver lagras för varje observation är tid (mätt i sekunder sedan midnatt) och plats (bestående av en x- och en y-koordinat enligt något meterindelat kartsystem). Alla dessa lagras som flyttal (datatypen float). Så här ser specifikationen ut:

class UFOobservation {
protected:
  float x, y; // Koordinater
  float t; // Tid i sekunder
public:
  UFOobservation(float x, float y, float t);
  void las();
  void visa();
  bool lika(UFOobservation u);
  bool liknande(UFOobservation u);
};

Implementera alla medlemsfunktionerna i klassen UFOobservation:

Uppgift 5 (5 p)

Skriv ett C++-program som först läser in två UFO-observationer med hjälp av medlemsfunktionen las, och som sen berättar dels om de är exakt lika (använd medlemsfunktionen lika), och dels om de är ungefär lika (använd medlemsfunktionen liknande).

Uppgift 6 (5 p)

En textfil innehåller ett antal UFO-observationer, lagrade som tre flyttal per rad, nämligen x-koordinat, y-koordinat och tid. Ett exempel på en fil med fyra UFO-observationer:
17811.22  9678.3   4100.0
67871.29  17277.1  4129.1
67871.28  17277.2  4129.2
8192.33   567.1    6789.2
Textfilen heter observationer.txt. Den kan innehålla som mest 1000 UFO-observationer.

Ibland hakar FOI:s radar upp sig, och registrerar samma UFO flera gånger. I filen ovan är andra och tredje raden väldigt lika, och om man läser in dem till två UFOobservation-variabler och sen använder medlemsfunktionen liknande, så kommer den att returnera ett sant värde.

Skriv ett C++-program som sorterar bort sådana upprepade observationer av samma UFO. En ny textfil, unika-observationer.txt, ska skapas, med samma data men med bara en rad av varje observation. Använd klassen UFOobservation och funktionen liknande.

I exemplet med de fyra observationerna ska alltså rad 2 eller rad 3 ha försvunnit i den nya filen.

Uppgift 7 (5 p)

FOI köper ännu en radar. Den är av en mer avancerad typ, som dessutom kan mäta höjden på de UFO:n den observerar.

Observationerna från både den nya och den gamla radarn ska hanteras av samma datorsystem. Skapa därför en ny klass som heter AvanceradUFOobservation och som ärver från den gamla klassen UFOobservation, och utökar den med en variabel som anger höjden.

a) (2p)

Skriv specifikationen för klassen AvanceradUFOobservation. Den ska ha en egen konstruktor (med fyra parametrar), och egna versioner av las, visa, lika och liknande.

b) (1p)

Skriv implementationen av klassens konstruktor.

c) (1p)

Skriv implementationen av medlemsfunktionen visa.

d) (1p)

Skriv implementationen av medlemsfunktionen liknande.

Uppgift 8 (5 p)

Visa ett kodexempel där man behöver ha en destruktor, och förklara varför destruktorn behövs. (Destruktorn ska vara med i kodexemplet.)