TENTAMEN CD5250 Objektorienterad programutveckling med C++, 5p Max poäng: 40 Betygsgränser: 3: 20 4: 28 5: 36 Datum: 1999-06-01, Tid: 14:00-19:00 Ansvarig: Ivica Crnkovic Upp till 5 poäng kan komma från laborationerna och projektet. Minst 18 poäng måste samlas från tentamen. Tillåtna hjälpmedel: Inga Observera: - Alla blad skall förses med namn och personnummer. - Lös endast en uppgift per blad. - Skriv endast på framsidan av varje blad. - Om förutsättningar saknas skall rimliga antaganden göras. Lycka till! CD5250 Objektorienterad programutveckling med C++ Sida 1 (5)
Uppgift 1, 5 poäng 1.1 Vilka definitioner är felaktiga? Rätta dem. 1. int rep = 200, per = 100; 2. double salary = wage = 99.99; 3. cin >> int input_value; 4. int i = 100; int k = i + 10; 5. char ref&; 1.2 Vilka fel finns det i klassdefinitionen? Skriv den rätta lösningen: class Sphere int x, y; int r; static const double PI = 3.14; Sphere( int xr = 0, int yr = 0, int rad = 0) : x(xr), y(yr), r(rad)} double volume() const; void setradius( int newradius): r(newradius) } void newposition(int xr, int yr) x = xr; y = yr; } 1.3 Beskriv betydelsen av följande const definitioner: 1. const int mydog = newdog; 2. class A void print() const; A& operator= (const A&); 1.4 Förklara begreppen: - virtuell funktion (virtual function) - ren virtuell funktion ( pure virtual function) - virtuell destruktor (virtual destructor) CD5250 Objektorienterad programutveckling med C++ Sida 2 (5)
Uppgift 2, 6 poäng Vilken utskrift ger följande program: #include <string.h> #include <iostream.h> class Fordon Fordon () cout << "Fordon" <<endl; } ~Fordon() cout << "~Fordon" << endl;} virtual void info() cout << "Info Fordon " << endl; } class Motorfordon : public Fordon Motorfordon(char n): namn(n) cout << "Motorfordon: " << namn << endl; } ~Motorfordon() cout << "~Motorfordon: " << namn << endl ; } void info()cout << "Info Motorfordon: " << namn << endl; } class Personbil : public Motorfordon Personbil(char n) : Motorfordon(n), namn(n) cout << "Personbil: " << namn << endl;} ~Personbil() cout << "~Personbil: " << namn << endl;} void info() cout << "Info Personbil: " << namn << endl; } class Buss : public Motorfordon Buss(char n) : Motorfordon(n), namn(n) cout << "Buss: " << namn << endl;} ~Buss() cout << "~Buss: " << namn << endl;} void info() cout << "Info Buss: " << namn << endl; } void main() cout << "------------------- 1" <<endl; Fordon fordon; cout << "------------------- 2" <<endl; Motorfordon motorfordon( A ); cout << "------------------- 3" <<endl; Personbil personbil( B ); cout << "------------------- 4" <<endl; Buss buss1( C ); cout << "------------------- 5" <<endl; Fordon *fp1, *fp2; cout << "------------------- 7" <<endl; fp1 = &buss1; cout << "------------------- 8" <<endl; fp1->info(); cout << "------------------- 9" <<endl; fp2 = new Personbil( D ); cout << "-------------------10" <<endl; fp2->info(); cout << "-------------------11" <<endl; delete fp2; cout << "-------------------12" <<endl; } CD5250 Objektorienterad programutveckling med C++ Sida 3 (5)
Uppgift 3, 6 poäng 1. Vilken ändring kommer att ske i programutskriften från uppgift 2 om nyckelordet "virtual" tas bort från medlemsfunktionen info i klassen Fordon? 2. Ändra programmet från uppgift 2, så att programmet automatiskt räknar hur många Fordonsobjekt (inklusive alla subobjekt) som existerar. Main-programmet skall inte ändras, och inga globala variabler skall användas. Skriv en ny funktion antalfordon i klassen Fordon, för att visa hur många Fordon objekt det finns. Det måste vara möjligt att anropa funktionen även om ingen Fordon-instans existerar. Uppgift 4, 10 poäng Definiera en klass Matris. Matrisens element är av typen float. Matrisens dimension ( r- antal rader och k - antal kolumner) definieras vid skapandet av ett Matris-objekt. Då allokeras också minnet för elementen (en array med r*k float element). Matris-objektet innehåller en pekare till det allokerade minnet. Vilka är de medlemsfunktioner som är absolut nödvändiga för ett sådant typ av objekt? Skriv deras deklaration och deras implementation. Deklarera dessutom följande operatorer för klassen: +=, +, -, ()och <<. Implementera +=, + och (). För de som har glömt vad en matris är: M= a 11 a 12 a 13 a 14... a 1k a 21 a 22 a 23 a 24... a 2k... a r1 a r2 a r3 a r4... a rk Summan av två matriser A och B är en matris M, där varje element är summan av motsvarande element från A och B, dvs. m ij = a ij + b ij. Antal rader och kolumner i båda matriser måste vara lika. Index-operatorn () skall retunera ett element från matrisen och skriva ett element i matrisen. Följande programavsnitt skall fungera: Matris M1(10,20), M2(10,20); for (int i =1; i<=10; i++) for (int j=1; j <= 20; j++) M1(i,j) = i + j + 1.5; Matris M3 = M1; M3(2,6) = 1.4; M2 = M1 + M3; M3 += M2; // ekvivalent till M3 = M3 + M2 CD5250 Objektorienterad programutveckling med C++ Sida 4 (5)
Uppgift 5, 9 poäng Man har lagrat information om ställningen i en fotbollsserie i en fil. För varje lag i serien finns en post i filen. En post innehåller: Lagets namn Lagets poäng Antal gjorda mål Antal insläppta mål (30 tecknen) Skriv ett program som läser filen och skriver ut posterna till standard output. Använd objektorienterad stil, dvs. definiera en klass som motsvarar posten, skriv << och >> operatorerna och använd dem för att läsa och skriva posterna. Input-filnamnet specificeras som första parameter till programmet. Uppgift 6, 4 poäng Betrakta följande kodavsnitt: Animal *aptr; Animal a; Dog d; Cat c; Fish f; aptr =&a; aptr =&d; aptr =&c; aptr =&f; När denna kod körs så skall följande utskrift erhållas: Can t speek Wouf Mjau Can t speak Implementera klasserna Animal, Dog, Cat och Fish så att detta stämmer. CD5250 Objektorienterad programutveckling med C++ Sida 5 (5)