Sid 1 av 7 Datavetenskap Omtentamen för DAV A02 Programutvecklingsmetodik, 5 p tisdag 2003-06-10 kl. 08.15-13.15 Tentamen består av 7 sidor. Ansvariga lärare: Robin Staxhammar, Nils Dåverhög Tillåtna hjälpmedel: Carrano, F.M., Data Abstraction and Problem Solving with C++ Engelsk-svenskt/svensk-engelskt lexikon Betygsgränser: Tentamensgränser 3 = 25-33 poäng 4 = 33,5-41 poäng 5 = 41,5-50 poäng Kursgränser 3 = 30-39,5 poäng 4 = 40-49,5 poäng 5 = 50-60 poäng Ange alla antaganden! Skriv tydligt! Börja varje uppgift på ett NYTT papper! Lycka till! 1 Rekursion och länkad lista (5 p) (2 + 3) a) Vilka för- respektive nackdelar har rekursion jämfört med iteration? b) Skriv en rekursiv funktion, isSorted, som går igenom en länkad lista och returnerar true om listan är sorterad och false annars. Gör lämpliga antaganden. 2 a) Binära sökträd (5 p) (3 + 2) Summera träddata. Du har en pekare p av typen tpek som pekar på roten till ett träd med noder av typ enligt nedan. Skriv en funktion som summerar alla noders datavärden och returnerar värdet. typedef struct Node* tpek; struct Node { float data; Sid 2 av 7 tpek left, right; // pekar på nästa node eller NULL }; b) Konstruera träd Ett träds noder utskrivna i preorder ser ut som nedan. Rita upp trädet. 10 8 13 12 20 18 16 19 22 3 Algoritmeffektivitet (4 p) Ange storleksordningen för följande algoritmer. Använd O (”stora O”). 'görNågot' representerar kod som är lika varje gång. Varje korrekt svar ger 1 poäng. a) void a(int n) { for (int i = 0; i < n; i++) for (int j = 0; j < i; j++) görNågot; } b) void b(int n) { if (n > 0) { görNågot; b(n/2); } } c) void c(int n) { for (int i = 0; i < 10; i++) for (int j = 0; j < n; j++) görNågot; } d) void d(int n) { for (int i = 0; i < n; i++) görNågot; for (int j = 0; j < n; j++) görNågot; for (int k = 0; k < n; k++) görNågot; } 4 Copy-konstruktor (5 p) Vi skall skapa en klass Lista. Följande definitioner finns bland annat i h-filen: typedef int listElementTyp; Sid 3 av 7 struct listNod; typedef listNod * ptrTyp; class Lista { public: Lista(); Lista(const Lista& L); // copy constructor ~Lista(); …. private: int Size; ptrTyp Head; …. }; I cpp-filen finns bland annat: struct listNod { listElementTyp Item; ptrTyp Next; }; Din uppgift är att skriva koden till copy-konstruktorn. 5 För- och eftervillkor (6 p) (4 + 2) Det finns generellt sett två olika sätt att ta hand om abnorma situationer som kan uppstå i ett program vid anrop till en funktion. Det ena sättet är att låta funktionen själv ta hand om felkontrollen och returnera något värde som indikerar om det gick bra eller inte. Det andra sättet är att se till att inga felaktiga värden får skickas till funktionen genom att sätta upp för- och eftervillkor och se till att förvillkoret är uppfyllt innan anrop till funktionen sker. a) Skriv funktionen hamtaElement, som returnerar ett element på en viss position i en länkad lista, på båda de ovanstående sätten samt ett program som använder sig av funktionerna. Du behöver alltså skriva två olika funktioner enligt ovan samt två olika drivrutiner för att nyttja respektive funktion. b) Jämför de båda lösningarna, kommentera för- och nackdelarna. 6 Cirkulär kö (5 p) Om man använder en array för att lagra en kö uppstår snart ett problem, nämligen att arrayen ”tar slut”. Ett sätt att lösa problemet är att göra arrayen cirkulär, vilket innebär att man efter sista elementet (maximalt index) i arrayen går till element med index 0. Din uppgift är att skapa en klass som heter Circ_Ko utgående från nedanstående kod. Klassen skall ha normala köegenskaper vad gäller insättning och borttagande. Som du ser saknas returvärden, parametrar, datamedlemmar och implementation för funktionerna i klassen. Skriv allt detta och skriv också för-, och eftervillkor. Du ska inte skriva några drivrutiner. Sid 4 av 7 class Circ_Ko { public: //Högsta index är (MAX_ANTAL_ELEMENT - 1) const int MAX_ANTAL_ELEMENT; Circ_Ko(); ~Circ_Ko(); KoAdd(); KoRemove(); KoIsEmpty(); KoIsFull(); KoGetFront(); private: // plats för datamedlemmar }; Circ_Ko::MAX_ANTAL_ELEMENT = 100; Sid 5 av 7 7 Definitioner (5 p) Kryssa i de rätta påståendena nedan. OBS!! 1, 2, 3, 4 eller 5 påståenden kan vara rätt på samma uppgift. Varje rätt besvarad uppgift ger 1 p, och varje fel besvarad uppgift ger -1 p. Du kan också avstå från att svara genom att kryssa i alternativet 'Jag avstår från att svara', detta ger 0 poäng. Negativa poäng räknas endast inom frågan för uppgifterna a, b, c, d och e, därför kan frågan ej ge mindre än 0 poäng som ett bidrag till totalpoängen. a) En klass: O kan innehålla endast data. O kan definieras utifrån en template-klass. O kan ärvas av andra klasser. O är samma sak som ett objekt. O fungerar som en mall att skapa objekt utifrån. O Jag avstår från att svara. b) Ett objekt O karaktäriseras av tillstånd, operationer och identitet. O är en instans av en klass. O kan innehålla andra objekt. O är åtkomligt via en variabel. O är samma sak som klass. O Jag avstår från att svara. c) En typ O beskriver vilka operationer som kan utföras på en variabel av den typen. O beskriver hur många variabler man kan ha. O beskriver hur mycket minnesutrymme en variabel tilldelas. O beskriver vilka värden en variabel kan anta. O är samma sak som en klass. O Jag avstår från att svara. d) En variabel O är samma sak som en typ. O är en typ som kan ändra värde. O är ett värde. O är en operator. O är en representation av ett värde som kan varieras. O Jag avstår från att svara. e) En funktion (metod) O med samma namn men olika parametrar kan förekomma flera gånger i samma klass. O kan förekomma med samma namn och samma parametrar i olika klasser. O med samma namn och samma parametrar som en annan funktion kan förekomma i samma klass. O med olika namn men samma parametrar som en annan funktion kan förekomma i samma klass. O som skiljer sig från en annan endast med avseende på returtypen kan förekomma i samma klass. O Jag avstår från att svara. Sid 6 av 7 8 Design (5 p) Scenario: En person ska skaffa ett pass. I ett första steg att simulera scenariot ovan är ditt jobb att göra en design. Du behöver först identifiera relevanta klasser för scenariot. Därefter ska du visa de relationer som föreligger mellan klasserna i ett klassdiagram. UML-notation ska användas. 9 Begrepp (5 p) Beskriv kortfattat följande begrepp: a) Datatyp b) Klass c) Arv d) Värdeanrop e) Objekt 10 Sant eller falskt (5 p) Ange huruvida varje påstående nedan är sant eller falskt. Du kan också välja alternativet 'Jag avstår från att svara'. O O O Sant Falskt Jag avstår från att svara Varje rätt svar ger 1 p, varje fel ger -1 p och alternativet 'Jag avstår från att svara' ger 0 poäng. Negativa poäng räknas endast inom frågan och kan därför ej ge mindre än 0 poäng som ett bidrag till totalpoängen. OBS! Skriv dina svar på ett skrivpapper och EJ på tentan! a) Då man formulerat sina för- och eftervillkor måste man se till att det finns gränssnittsfunktioner för att användaren ska kunna efterleva kontraktet. b) En referensvariabel kan utgöras av såväl en pekare som ett alias. c) En abstrakt datatyp är samma sak som en klass. d) class Array_Lista: public Lista { public: //. . . private: //. . . }; Att använda arv på detta sätt är det bästa för att implementera en lista. Sid 7 av 7 e) void funk_1(int* a){ (*a)++; } void funk_2(int& b){ b++; } void funk_3(int c){ c++; } void main() { int *a = new int; *a = 7; int b = 3; int &c = b; c += 3; funk_1(&b); funk_2(*a); funk_3(c); cout << *a << ", " << } Utskriften blir: 8, 7, 6 Kawasaki ZZR 600 b << ", " << c << endl;