Datavetenskap Tentamen för DAV A02 Programutvecklingsmetodik, 5p tisdag 2001-03-20 Kl 08.15-13.15 Ansvarig lärare: Martin Blom Tillåtna hjälpmedel: Carrano, F.M., Data Abstraction and Problem Solving with C++ Engelsk-svenskt lexikon Betygsgränser: 3 = 25-33 poäng 4 = 33,5-41 poäng 5 = 41,5-50 poäng Ange alla antaganden! Lycka till! 1. Begrepp (5p) Förklara kortfattat följande begrepp: a) Arv b) Referensparameter (till funktion) c) Variabel d) Copy constructor e) Iteration 2. För- och eftervillkor (10p) För- och eftervillkor är ett sätt att försöka undvika felhantering genom att inte tillåta några fel och genom att sätta upp kontrakt mellan olika delar i programmet. En programdel förbinder sig att utföra ett visst jobb om den anropas på rätt sätt från någon annan del. Följande klass är skapad utan tanke på förvillkor. a) Beskriv klassens funktionalitet och vad den kan användas till (2p) b) Din uppgift är att se vilka för- och eftervillkor (pre- och postconditions) som bör gälla för klassens funktioner samt att lägga till eventuella funktioner för testning av förvillkoren.(6p) c) Hur påverkar för- och eftervillkor koden generellt sett? Förklara kortfattat och exemplifiera gärna. (2p) #include <iostream.h> typedef int eT; typedef struct node* pT; typedef struct node{ eT data; pT next; node(eT d, pT n); }; node::node(eT d, pT n) { data=d; next=n; } class Uppgift2 { public: Uppgift2(); ~Uppgift2(); void a(int aP); eT b(int aP); eT b(int aP, int aN); void c(eT aE, int aP); bool d(int aP){return s[aP]>0;}; int e(int aP){return s[aP];}; private: pT array[MAX]; int s[MAX]; int tot; }; Uppgift2::Uppgift2() { for(int i=0;i<MAX;i++) { array[i]=NULL; s[i]=0; } tot=0; } Uppgift2::~Uppgift2() { for(int i=0;i<MAX;i++) while(s[i]>0) a(i); } void Uppgift2::c(eT aE, int aP) { pT temp=new node(aE, array[aP]); array[aP]=temp; s[aP]++; tot++; } eT Uppgift2::b(int aP) { return array[aP]->data; } eT Uppgift2::b(int aP, int aN) { pT temp=array[aP]; for(int i=0;i<aN;i++) temp=temp->next; return temp->data; } void Uppgift2::a(int aP) { pT temp=array[aP]; array[aP]=array[aP]->next; delete temp; temp=NULL; s[aP]--; tot--; } 3. Rekursion (5p) Skriv en rekursiv funktion, sorted, för en länkad lista som kontrollerar om listan är sorterad eller inte. Exempelkod: Lista L; ... print(L); L.sorted(); L.sort(); print(L); L.sorted(); // // // // // // // Listan skapas Värden läggs in Utskrift: 1 2 3 2 6 10 Svarar ’false’ sorterar listan Utskrift: 1 2 2 3 6 10 Svarar ’true’ Tänk på att head-pekaren inte är synlig utanför listan och att du därför behöver ha en gränssnittsfunktion som i sin tur anropar den rekursiva (privata) funktionen. 4. Algoritmeffektivitet (5p) Ange storleksordning för följande algoritmer. Använd O (”stora O”). 1p per korrekt svar. a) void f(int n) { n=0; for(int i=0;i<n;i++) görNågot; for(int j=0;j<n;j++) görNågot; } b) void g(int n) { if(n>0) { görNågot; g(n-1); g(n-1); } } c) void h(int n) { int max=n/2; for(int i=0;i<max;i++) for(int j=0;j<5;j++) görNågot; } d) void k(int n) { for(int i=0;i<n;i=i+2) for(int j=0;j<n;j=j+3) görNågot; for(int k=0;k<n;k=k+4) görNågot; } e) void m(int n) { if(n>0) { m(n/2); görNågot; } } 5. Binära sökträd (5p) Ett binärt sökträd är en datastruktur bestående av ett antal noder, där varje nod dels innehåller ett värde, men även två referenser till så kallade barn-noder, ett till höger och ett till vänster. Alla barn, barnbarn etc till vänster om en given nod är har alltid mindre värden lagrade, och alla barn till höger har större värden jämfört med aktuell nod. Varje nod har 0, 1 eller 2 barn, men inte fler. Dessa barn kan i sin tur ha barn och så vidare. S 470 och framåt i Carrano innehåller alla detaljer om BST inklusive full kod för alla algoritmer. a) Sätt in följande värden (i den ordning de räknas upp) i ett binärt sökträd som från början är tomt. M A R T I N C O P E S (3p) b) Skriv ut alla noder i preorder. (2p) 6. Komplexa strukturer (10p) Följande program (laboration 3) har din labbkompis gjort under tiden du var på skidsemester i Åre. Kompisen har tröttnat på att du inte gör något och kräver nu att du skriver resten av programmet. Använd cout för utskrift och cin för inmatning. De funktioner som saknas är: a) Skriv ut alla personer som handlar och alla personer i alla kassor. b) Flytta en person från allmänt handlande till en specifik kassa. Du ska både skriva själva drivrutinen och de funktioner i affären som behövs. För list- och köoperationer räcker det med deklarationen, dvs returtyp namn(parametrar). Dina funktioner ska anropas enligt följande: void print(Affar& enAffar) { // din kod för utskrift och anrop till affärens funktioner } void move(Affar& enAffar) { // din kod för inmatning och anrop till affärens funktion } void main(void) { Affar A; ... //diverse inmatningar och förflyttningar print(A); move(A); } --------------------------------------------------------------------#include "person.h" #include "list.cpp" #include "queue.cpp" class Affar { // dina funktioner för hämtning och förflyttning ... private: List <Person> kunder; Queue<Person> kassor[MAX]; }; --------------------------------------------------------------------class Person { public: Person(); Person(char* name, int age); ~Person(); void setName(char* newName); void setAge(int newAge); const char* getName(); const int getAge(); private: int age; char name[NAMESIZE]; }; 7. Återanvändning (10p) Du har som nyanställd på ett programmeringsföretag fått i uppgift att implementera en telefonlista för SIM-kort i mobiltelefoner. Så långt allt väl. Problemet är att kortet bara kan hantera små datamängder i varje modul på grund av dess minnesstruktur. Du har efter lite beräkningar och efterforskningar kommit fram till att du får plats med en lista som rymmer 10 personer i varje modul. Kravet du har är att kortet ska kunna lagra minst 200 adresser. Du måste alltså använda dig av många mindre listor och skapa ett gemensamt gränssnitt mot dessa listor. Din uppgift är att skapa en datastruktur storLista, som ligger som ett skal runt ett okänt antal (minst 20st) litenLista, som har vanlig listfunktionalitet, fast som mest kan lagra 10 personer. Du ska både definiera klassen storLista samt implementera funktionerna sattIn, taBort och hamtaElement. Du ska även skriva för- och eftervillkor för funktionerna. Ett tips är att tänka till lite extra vad gäller taBort-funktionen. Modul 1 Gränssnitt mot användaren Modul 2 StorLista Modul 3 LitenLista Modul 4 LitenLista ... Modul n LitenLista En trevlig bil att titta på när du väntar på att tiden ska ta slut. Mercedes Benz 420 SEL