Ö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.
|
-
Skriv tydligt och klart. Lösningar som inte går att läsa kan
naturligtvis inte ge några poäng. Oklara formuleringar kommer att
misstolkas.
-
Skriv den personliga tentamenskoden på varje inlämnat blad.
Skriv inte namn eller personnummer på bladen.
-
Lös bara en uppgift per blad. Skriv bara på en sida av papperet.
Använd inte röd skrift.
-
Antaganden utöver de som står i uppgifterna måste anges. Gjorda
antaganden får inte förändra den givna uppgiften.
-
Skriv gärna förklaringar om hur du tänkt!
Även ett svar som är fel kan ge poäng,
om det finns med en förklaring som visar att huvudtankarna var rätt.
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 namn (som kan anges med en textsträng med högst 100 tecken)
- en ålder (som kan anges med ett heltal)
- en vikt (som kan anges med ett reellt tal)
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:
- get_namn som returnerar namnet på en person
- get_alder som returnerar åldern
- get_vikt som returnerar vikten
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:
- nytt_barn som (på lämpligt sätt) tar emot data om ett barn och lägger till det i den länkade listan med barn
- ny_personal som (på lämpligt sätt) tar emot data om en personal och lägger till den i den länkade listan med personal
- skriv_statistik som ska skriva ut viss statistik om dagiset
Uppgift 12 (2 p)
Implementera funktionen ny_personal.
Uppgift 13 (5 p)
Implementera funktionen skriv_statistik.
Den ska skriva ut tre saker:
- Den sammanlagda vikten av alla barn och all personal.
- En information om ifall personalen på dagiset räcker till för att vakta barnen, eller om de inte gör det.
(Jämför personalens sammanlagda max_antal_barn med antalet barn.)
Uppgift 14 (4 p)
Vi vill testa klassen Dagis.
Skriv en main-funktion som gör följande:
- Skapa ett tomt dagis.
- Lägg till tre personal.
- 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.)
- Skriv ut statistik om det dagiset med hjälp av funktionen skriv_statistik.