Högskolan Dalarna sid 1 av 7 TENTAMEN I PROGRAMUTVECKLINGSMETODIK, DEL 2 för SY1 2001-05-30, kl 09.00-13.00 Hjälpmedel: Inga hjälpmedel är tillåtna Återlämningstillfälle: Fredag den 15 juni kl 12.00 i S319. Max: 60 poäng. Betygsgränser: betyg G - ca 36p, betyg VG - ca 48p Skriv tydliga och kortfattade svar! 1. Objektorienterade programspråk, grundläggande begrepp. (10p) Svara på följande frågor. Begränsa dina svar till ungefär fem till sex rader per svar. a) Förklara skillnaden mellan de båda begreppen objekt och klass. (2p) b) Vad menas med inkapsling? (2p) c) Vad är arv? (2p) d) Vad innebär polymorfi? (2p) e) Förklara skillnaden mellan de båda begreppen attribut och operation (2p) 2.Objektorienterad systemutveckling (10p) a) Förklara begreppen aktör. (2p) b) Vad menas med domänanalys? (2p) c) Vilka användningsfall bör förekomma i utvecklingsprocessens tidigaste iterationer. (2p) d) Förklara hur användningsfallen används i utvecklingsprocessen. (2p) e) Beskriv en metodik för att hitta klasser (2p)
Högskolan Dalarna sid 2 av 7 3. Klasser (10p) Här följer definitioner av klasserna Sphere och Box. class Sphere Sphere(double radien):pi(3.14)radie = radien; double area()return radie*radie*pi*4.0; //3.14*4 = 12.56 double volyme()return radie*radie*radie*pi*4.0/3.0; //3.14*4/3 = 4.18667 double getradie()return radie; double radie; const double PI; ; class Box Box(double asida, double bsida, double csida)a = asida; b = bsida; c = csida; double volyme()return a * b * c; double getsidaa()return a; double getsidab()return b; double getsidac()return c; double a, b, c; ; a) Återge exakt den utskrift som följande main-funktion ger. (2p) Sphere thesphere(10.0); double radie = 0.0; double area = 0.0; radie = thesphere.getradie(); area = thesphere.area(); cout << "Radie = " << radie << endl; cout << "Area = " << area << endl;
Högskolan Dalarna sid 3 av 7 b) Följande main-funktion fungerar inte. Den innehåller fyra fel och ett antal följdfel orsakade av dessa fyra fel. Beskriv vart och ett av de fyra felen och var i koden varje fel förekommer. (8p) Sphere thesphere(10); Box thebox(20.0); double radie = thesphere.radie; double a = thebox.a; double area = thesphere.area(1.0); cout << "Radien = " << radie << ", area = " << area << endl; cout << "Sida A = " << a << ", area = " << thebox.area() << endl; 4. Arv och polymorfi (10p) I den här uppgiften ska klasserna Sphere och Box i uppgift 3 användas. a) Skriv en klass Cube som ärver av klass Box. Medlemsfunktionen "volyme()" får inte definieras i klass Cube. Följande main-funktion ska gå att köra. (4p) #include <iostream.> Cube cubea(2.0), cubeb(3.0); cout << "Kub A, volym = " << cubea.volyme() << endl; cout << "Kub B, volym = " << cubeb.volyme() << endl; Mainfunktionen ska generera följande utskrift: Kub A, volym = 8 Kub B, volym = 27
Högskolan Dalarna sid 4 av 7 b) Skriv en klass Solid och modifera klasserna Sphere och Box så att följande main-funktion blir möjlig att köra. Observera att du inte behöver upprepa koden för klasserna Sphere och Box, utan endast beskriva förändringarna i de båda klasserna. (6p) Solid *pekare[2]; pekare[0] = new Sphere(10.0); pekare[1] = new Box(20.0, 30.0, 40.0); cout << "Sfärens volym = " << pekare[0]->volyme() << endl; cout << "Rätblockets volym = " << pekare[1]->volyme()<< endl; delete pekare[0]; delete pekare[1]; pekare[0] = new Sphere(1.0); pekare[1] = new Box(1.0, 2.0, 3.0); cout << "Sfärens volym = " << pekare[0]->volyme() << endl; cout << "Rätblockets volym = " << pekare[1]->volyme()<< endl; delete pekare[0]; delete pekare[1]; Mainfunktionen ska generera följande utskrift: Sfärens volym = 4186.67 Rätblockets volym = 24000 Sfärens volym = 4.18667 Rätblockets volym = 6 5. Grafiska användargränssnitt (10p) a) Förklara vad en dialogmodell är och ge ett enkelt exempel på en sådan. (3p) b) Nämn tre riktlinjer för användning av knappar i grafiska gränssnitt (3p) c) Nämn två fallgropar som kan förekomma i samband vid utvekling av prototyper (2p) d) Vad är en "Style Guide"? (1p) e) Förklara vad som menas med en "metafor med magisk effekt". (1p)
Högskolan Dalarna sid 5 av 7 6) Unified Modeling Language (10p). a) Rita ett klassdiagram enligt UML som beskriver klasser och de typer av olika relationer som förekommer i följande program. Ta även med multipliciteter, dataattribut och operationer (5p) b) Rita ett sekvensdiagram enligt UML. Beskriv med hjälp av diagrammet hur en aktör och programmets objekt samverkar när aktören väljer alternativ 2, "Visa Bok". (5p) #include <string> //-Definitioner av klasser--------------------------------- class Bok Bok(string entitel, string enforfattare) :titel(entitel), forfattare(enforfattare) string gettitel()return titel; string information()return titel + ", skriven av " + forfattare; string titel; string forfattare; ; class Hylla Hylla(); ~Hylla(); void nybok(string titel, string forfattare); void visatitlar(); void visabok(int nr); Bok *boken[20]; int antaltitlar; ; class Meny Meny(); void skrivmeny(); Hylla hyllan; ; //Programmets kod forsätter på följande sida
Högskolan Dalarna sid 6 av 7 //-Hylla, medlemsfunktioner-------------------------------- Hylla::Hylla():antalTitlar(0) for (int i=0; i<20; i++) boken[i] = 0; Hylla::~Hylla() for (int i=0; i<antaltitlar; i++) delete boken[i]; void Hylla::nyBok(string titel, string forfattare) if (antaltitlar < 20) boken[antaltitlar++] = new Bok(titel, forfattare); void Hylla::visaTitlar() for (int i = 0; i < antaltitlar; i++) cout << i << "; " << boken[i]->gettitel() << endl; void Hylla::visaBok(int nr) if (nr >= 0 && nr < antaltitlar) cout << boken[nr]->information() << endl; //Programmets kod forsätter på följande sida
Högskolan Dalarna sid 7 av 7 //- Meny, medlemsfunktioner ------------------------------- Meny::Meny() char val[80], titel[80], forfattare[80]; int nr; skrivmeny(); cin.getline(val,sizeof(val),'\n'); while (val[0]!= '0') switch(val[0]) case '1': cout << "Titel: "; cin.getline(titel,sizeof(titel),'\n'); cout << "Forfattare: "; cin.getline(forfattare,sizeof(forfattare),'\n'); hyllan.nybok(titel, forfattare); break; case '2': hyllan.visatitlar(); cout << "Visa bok nr: "; cin >> nr; cin.get(); //Läser bort '\n' hyllan.visabok(nr); break; default: cout << "Fel val!" << endl; skrivmeny(); cin.getline(val,sizeof(val),'\n'); void Meny::skrivMeny() cout << "*Hyllan****************" << endl; cout << "0 <- Avsluta" << endl; cout << "1 <- Ny bok" << endl; cout << "2 <- Visa bok" << endl; cout << "***********************" << endl; cout << "Alternativ (0, 1, 2)?:"; //- main-funktionen --------------------------------------- Meny menyn;