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. |
I main-funktionen finns en programsnutt som ser ut så här:
Den ska ge en utmatning som liknar den här:PUNKT p1(1.5, 2.0); PUNKT p2; std::cout << p1 << p2; p2.flytta(0.5, 0.3); std::cout << p2;
[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);
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).
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.
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:
Textfilen heter observationer.txt. Den kan innehålla som mest 1000 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
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.
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.