Tentamen Objektorienterad Programutveckling med C++ Datum 2001-06-08. Tid 14:30-19:30 Ordinarie Tentamen CD 5250 Ansvarig: Martin Skogevall Omtentamen CD 5250 Ansvarig: Daniel Flemström Omtentamen CD 5050 Ansvarig: Daniel Flemström Max Poäng: 40 (preliminär): Betygsgränser (preliminära): 3: 20 4: 28 5: 36 Minst 18 poäng måste samlas från tentamen. Därutöver adderas eventuella bonuspoäng för att ge den slutgiltiga poängsumman. Tillåtna hjälpmedel: Inga Observera: Alla blad skall vara försedda med namn och personnummer uppe i högra hörnet. Lös endast en uppgift per blad. Om du skriver på baksidan av ett blad, markera detta genom att skriva v.g vänd längst ned på den första sidan av pappret. Om förutsättningar saknas skall rimliga antaganden göras, OBS Skriv ned vad du antagit! Naturligtvis skall du använda standardbiblioteket när så är lämpligt. Kommer du inte ihåg exakt vad metoderna heter skriver du ditt antagande i marginalen. Lycka till, och ha en skön sommar! Martin och Daniel. 1/7
1. Finn fel ( 5p ) Givet följande klasser, vad är det som inte stämmer? Rätt ger +1, fel ger -1 poäng. #include <string.h> using namespace std; class CHusdjur CHusdjur(string n):name(n),no_claws(10),no_ears(5) int no_claws; protected: int no_ears; string name; class CKatt: public CHusdjur CKatt():CHusdjur() void blisnaell() no_claws = 0; class CHund:public CHusdjur CHund() void inkallning() no_ears = 0; 2. Allmänkunskap ( 4p ) Ange något alternativt sätt att deklarera följande: ( 1p ) using namespace std; vector<int> vektor; Förklara vad this-pekaren är för något. ( 1p ) Vad innebär det att en funktion är deklarerad som friend-funktion till en klass? ( 1p ) Vid vilka tillfällen bör man använda virtuella destruktorer? Förklara varför. ( 1p ) 2/7
3. Följ programkod ( 8p ) Vad blir utskriften av följande program? (Main som du skall följa kommer längre fram) class Bil Bil(string const & owner) : m_owner(owner) cout << "Bil::Bil(owner)" << endl; Bil() : m_owner("staten") cout << "Bil::Bil()" << endl; ostream& Dump(ostream& os) os << "Bil::Dump" << m_owner << endl; return os; virtual void Speed(ostream& os) os << "Bil::Speed" << endl; string m_owner; class Volvo740 : public Bil Volvo740() Volvo740(string const & owner) : Bil(owner) ostream& Dump(ostream& os) Bil::Dump(os); os << "Volvo740::Dump" << endl; return os; virtual void Speed(ostream& os) os << "Volvo740::Speed" << endl; class LamborghiniDiablo enum Color YELLOW, WHITE, RED LamborghiniDiablo() : m_color(yellow) Color m_color; 3/7
(forts..) Main ser ut som på tabellen nedan. Du kan anta att satserna exekveras i den ordning de står. Du kan också anta att standardbibliotekets filer finns korrekt inkluderade etc. Om du anser att ingenting skrivs ut bör du kommentera vad som händer i marginalen (om du vill ha poäng). Skriv dina svar direkt i tentan. Rad Programkod Utskrift 1 Bil bil1( Blomqvist ); 2 Volvo740 bil2( Johansson ); 3 bil1.dump(cout); 4 bil2.dump(cout); 5 bil1.speed(cout); 6 bil1 = bil2; 7 bil1.dump(cout); 8 Bil * pbil = &bil2; 9 pbil->dump(cout); 10 pbil->speed(cout); 11 Bil * pbil2 = &bil2; 12 pbil2->speed(cout); 4/7
4. Stack ( 5p ) Implementera en så kallad stack. En stack är en behållare där man kan lägga till och ta bort element. Det element som tas bort är det element i behållaren som sist stoppades in. Stackar kallas även för LIFO-kö (Last In First Out). Gör så att stacken kan innehålla godtyckligt antal heltal. Följande operationer skall stacken klara av (du behöver inte kunna ta bort element): Stack s1; // s1 = [] s1.push(23); // s1 = [23] s1.push(34); // s1 = [23,34] s1.push(26); // s1 = [23,34,26] int intar[] = 1,2,3 Stack s2(intar, 3); // s2 = [1,2,3] Stack s3 = s1 + s2; // s3 = [23,34,26,1,2,3] 5. Klassdiagram ( 4p ) Rita upp ett klassdiagram av följande programkod där alla relationer mellan klasserna framgår. class Car Car(Person * owner) : m_owner(owner) void Start(); Engine m_engine; Person * m_owner; class Ford : public Car Ford(Person * owner) : Car(owner) int m_rustlevel; class Person Person(string const & name) : m_name(name) string m_name; class Engine Engine(int valves = 4) : m_valves(valves) m_horsepowers = 90; int m_valves; int m_horsepowers; 5/7
6. Bokning ( 10p ) Du skall göra ett mycket enkelt bokningsprogram för att hålla reda på sittplatser i ett flygplan. Det finns dock inga krav på att passagerarna skall kunna välja plats, folk blir helt enkelt tilldelade nästa tillgängliga plats. Programmet skall kunna läsa in respektive spara ned bokningslistor för flygplan på diskett. Programmet skall dessutom kunna läsa in och skriva ut listorna via tangentbord och skärm. Implementera två klasser, Chair och Aircraft. Chair skall innehålla två datamedlemmar, stolsnummer och personnamn. Chair skall inte ha några vanliga metoder för att utifrån kunna modifiera eller läsa datamedlemmar, istället skall all förmedling av datamedlemmar gå via >> och << operatorerna. Samma kod skall fungera för att läsa från både tangentbord och fil. Minnesläckage får inte förekomma. Programmet skall inte behöva bli mer än 50 rader långt. (Om ni inte implementerar operatorsöverlagringen för << respektive >>, utan löser uppgifter på annat sätt, ger det 5 poäng avdrag.) Main är redan implementerad och ser ut som nedan: void main() Aircraft ac; // Läs in bokningslista ifstream is("c:\\planet.txt"); is >> ac; is.close(); // Skriv ut lista med alla bokningar cout << ac; // Läs in bokningar från tangentbordet // Fortsätt tills användaren trycker Ctrl-Z (EOF) cout << "Mata in [namn] [stolsnummer]. << Enter mellan varje rad. Ctrl Z när du är klar" << endl; cin >> ac; // Spara ned bokningslista på disk ofstream of("c:\\planet.txt"); of << ac; of.close(); Bokningslistan som sparas på diskett skall ha ett liknande utseende som exemplet nedan. Martin 42 Daniel 12 Gustav 28 Silvia 29 6/7
7. Ändra? ( 4p ) Vad skall man göra för förändringar för att programmet skall fungera så som programmeraren ursprungligen tänkte sig? Programmet skall skriva ut Using permissions for File? #include <string> #include <vector> #include <iostream> using namespace std; class Permission int type; class AccessControlList AccessControlList(int size) m_permissions.reserve(size); void PrintPermissions(ostream & os) const os << ToString(); string ToString() const return Abstract ; vector<permission *> m_permissions; class FileACL : public AccessControlList FileACL() : AccessControlList(0) string ToString() const return File ; void main() FileACL facl; statistics(facl); void statistics(accesscontrollist const & acl) cout << Using permissions for ; acl.printpermissions(cout); cout << endl; 7/7