Ö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 20 december 2006 kl 08: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 8 januari 2007.
Visning: Måndag 8 januari 2007 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!

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 (2 p)

Personer har följande egenskaper: Ett C++-program som ska arbeta med data om personer behöver en klass Person, som ska användas för att representera personer.

Skriv klassdefinitionen för klassen Person. Den ska ha en lämplig konstruktor. Det ska också finnas medlemsfunktioner för att komma åt de olika variablerna:

Uppgift 2 (2 p)

Implementera konstruktorn och de övriga medlemsfunktionerna i Person.

Uppgift 3 (4 p)

Vi vill kunna skriva ut personer på standardutmatningen (som normalt är kopplad till skärmen), och även läsa in personer från standardinmatningen (som normalt är kopplad till tangentbordet). Därför lägger vi till två medlemsfunktioner, skriv och las, och lägger till dem i klassdefinitionen med följande funktionshuvuden:
void skriv();
void las();
Implementera medlemsfunktionerna skriv och las.

Uppgift 4 (2 p)

Förutom funktionen skriv i uppgiften ovan, vill vi skapa en riktig utskriftsoperator för klassen Person. Vi lägger därför till följande i klassdefinitionen:
friend ostream& operator<< (ostream& o, const Person& person);
Implementera utskriftsoperatorn.

Uppgift 5 (4 p)

Vi vill testa klassen Person.

Skriv en main-funktion som först skapar en person (dvs ett Person-objekt) och sen kollar att de tre medlemsfunktionerna get_namn, get_alder och get_vikt ger rätt resultat. Om alla ger rätt resultat ska programmet skriva ut Rätt!, annars Fel!.

Därefter ska main-funktionen använda las för att läsa in data om en person, och skriva ut den personens data med hjälp av skriv-funktionen.

Slutligen ska den skriva ut personens data en gång till, men den här gången med utskriftsoperatorn (från uppgift 4 ovan).

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 6 (3 p)

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

Uppgift 7 (3 p)

Skriv ett C++-program som läser filen med personer från uppgiften ovan, och talar om den sammanlagda vikten av alla personer som väger mer än 100 kilo.

Uppgift 8 (2 p)

Vi vill kunna lagra personer i länkade listor. Skriv klassdefinitionen för klassen LankadPerson, som ärver från klassen Person men som dessutom innehåller en pekare till nästa LankadPerson i listan.

Det behövs en konstruktor, som förutom de vanliga argumenten till Person-konstruktorn också tar en LankadPerson-pekare att lagra som nästa-pekare.

Dessutom behöver vi en funktion som heter get_next, som returnerar en pekare till nästa LankadPerson i listan.

Uppgift 9 (2 p)

Implementera konstruktorn för klassen LankadPerson.

Uppgift 10 (3 p)

Personer kan vara antingen dagisbarn eller dagispersonal. Skriv klassdefinitionerna för klasserna Dagisbarn och Dagispersonal, som båda ärver från LankadPerson.

Ett dagisbarn har samma egenskaper som en person, men en dagispersonal har dessutom egenskapen max_antal_barn, som är ett heltal som anger hur många dagisbarn som han eller hon klarar av att vakta samtidigt.

(Ordet "personal" används här i den nya, moderna betydelsen, där man till exempel kan säga "en personal" om en sjuksköterska.)

Glöm inte att klassdefinitionerna ska innehålla lämpliga konstruktorer. Dessutom måste det på något sätt gå att få tillgång till egenskapen max_antal_barn hos en dagispersonal.

Uppgift 11 (2 p)

Ett dagis innehåller ett antal dagisbarn och ett antal dagispersonal. Vi ska skapa en klass Dagis, som innehåller två länkade listor: en med dagisbarnen på det dagiset, och en med dagispersonalen.

Skriv klassdefinitionen för klassen Dagis. Den ska ha en konstruktor som skapar ett tomt dagis (utan barn och personal), och det ska finnas tre medlemsfunktioner:

Uppgift 12 (2 p)

Implementera funktionen ny_personal.

Uppgift 13 (5 p)

Implementera funktionen skriv_statistik. Den ska skriva ut tre saker:

Uppgift 14 (4 p)

Vi vill testa klassen Dagis.

Skriv en main-funktion som gör följande:

  1. Skapa ett tomt dagis.
  2. Lägg till tre personal.
  3. Lägg till hundra barn, som alla heter Olle och som har slumpmässiga men rimliga värden på övriga variabler. (Ledtråd: rand ger ett slumpmässigt heltal, och srand initierar slumpsekvensen.)
  4. Skriv ut statistik om det dagiset med hjälp av funktionen skriv_statistik.