Programmeren in C++ Efficiënte zoekfunctie in een boek

Vergelijkbare documenten
Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011

Examen Software Ontwikkeling I 2e Bachelor Informatica Academiejaar Januari, **BELANGRIJK** : Schrijf je naam onderaan dit blad

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Vraag 1: HashTable [op 2 punten van de 20] Gegeven de header file HashTable.h van een hashtabel die pointers naar strings bijhoudt (in bijlage).

Examen Programmeren I 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011

int getaantalpassagiers{): void setaantalpassagiers(int aantalpassagiers);

A. PriorityQueue [4/8]

Tentamen Programmeren in C (EE1400)

Een gelinkte lijst in C#

Tentamen Programmeren in C (EE1400)

Lineaire data structuren. Doorlopen van een lijst

Datastructuren: stapels, rijen en binaire bomen

Tentamen Programmeren in C (EE1400)

/20. richtlijnen. Lees deze richtlijnen! Log in op de pc met. login: paswoord: examen i examen001. Log in op. x.toledo.ucll.be

Modelleren en Programmeren

Examen Datastructuren en Algoritmen II

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Examen Datastructuren en Algoritmen II

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Software-Ontwikkeling I Academiejaar

Programmeren (1) Examen NAAM:

Informatica: C# WPO 12

Oefeningenexamen Informatica: juni 2015

Informatica: C# WPO 13

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

CLA-CMA ilab laboratory results v3.0 (mét bij-aanvragen, materiaal aanvragen en andere tools)

Tweede college algoritmiek. 12 februari Grafen en bomen

Versturen van vanuit een Delphi VCL toepassing

Handleiding P2Go upload

4EE11 Project Programmeren voor W. College 3, , Blok D Tom Verhoeff, Software Engineering & Technology, TU/e

Datastructuren: stapels, rijen en binaire bomen

EEN KRUISWOORDRAADSEL MAKEN MET HOT POTATOES IN 10 STAPPEN

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Software-Ontwikkeling I Academiejaar

Javascript oefenblad 1

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Elementary Data Structures 3

Modelleren en Programmeren

Datastructuren Uitwerking jan

Algoritmiek. 15 februari Grafen en bomen

Datastructuren Werkcollege Intro

Spreadsheets (Excel 2003)

Examen Datastructuren en Algoritmen II

Tabblad documenten

Demo document template available on the Rapptorlab website

Een ASP.NET applicatie opzetten. Beginsituatie:

Blackboard en MyMedia

Opgaven Abstracte Datastructuren Datastructuren, Werkgroep, 31 mei 2017.

6. Het maken van een database

Materiaalontwikkeling in PAV

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

EDpuzzle. Wat is EDpuzzle? Site. Kostprijs. Hoe werkt het?

Installatiehandleiding TiC Narrow Casting Manager

NAAM: Programmeren 1 Examen 21/01/2011

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Examen Algoritmen en Datastructuren III

Implementatie en toepassing van de trie

Java Programma structuur

EE1400: Programmeren in C BSc. EE, 1e jaar, , 4e college

Wat is EDUCANON? Site. Kostprijs. Hoe werkt het?

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

4EE11 Project Programmeren voor W. College 2, , Blok D Tom Verhoeff, Software Engineering & Technology, TU/e

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B;

NAAM: Programmeren 1 Examen 29/08/2012

Zero profile Gedocumenteerd door: Chris Twiest Versie: 0.1 Datum:

De stappenhandleiding is in hoofdstappen verdeeld, de volgende stappen zullen aan bod komen:

Surf naar en vul jouw gebruikersnaam en wachtwoord in.

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

Oefeningen Jaarproject I

Handleiding JCreator. Inhoud. Een Workspace en een eerste project maken

Les 6: Abstractie, methods en parameters in Alice

Modelleren en Programmeren

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Introductie in C++ Jan van Rijn. September 2013

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Handleiding handtekening, afwezigheidsbericht en mailforwarding instellen in Outlook

Inleiding. Instellingen. Agendamodule

Examen Datastructuren en Algoritmen II

IMAP-handleiding Bookinto

INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN

Opgaven. Python Assessment

Technische nota AbiFire5 Rapporten maken via ODBC

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

Dynamisch Programmeren. Het Rugzakprobleem

Let op dat de scoping regels gerespecteerd blijven; het volgende voorbeeld mag geen fout melden.

Handleiding SNS online docent (dus niet de beheerstool!) Let op: er is een verschil tussen: Openen

Handleiding Nieuwsbrief

EE1400: Programmeren in C BSc. EE, 1e jaar, , 3e college

Examen Algoritmen en Datastructuren III

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

4 Opmaak van een werkblad

Examen Datastructuren en Algoritmen II

Handleiding Project OCMW Beerse.

Handleiding website Sint-Carolus

Voorzie iedere pagina van een titel. Je kan de titel uit het menu aanhouden. Een titel voeg je toe als volgt: 1. Klik op Element toevoegen.

Transcriptie:

Examen Software Ontwikkeling I 2e Bachelor Informatica Faculteit Wetenschappen Academiejaar 2010-2011 21 januari, 2011 **BELANGRIJK** 1. Lees eerst de volledige opgave (inclusief de hints/opmerkingen)! 2. In dit deel komt enkel C++ aan bod (geen C) 3. Kladpapier vind je achteraan 4. Veel succes! Programmeren in C++ [op 12 punten van de 20] Efficiënte zoekfunctie in een boek Men wenst alle woorden, die in een boek voorkomen, op te slaan in een datastructuur, zodat men gemakkelijk een woord kan opzoeken. Van elk woord wordt de bladzijde, de lijn en de positie binnen die lijn bijgehouden. Een woord kan uiteraard verschillende keren voorkomen. Gegeven de headers IndexItem.h, BookIndex.h, BinarySearchTree.h, HashTable.h en de cpp bestanden BookIndex.cpp, BinarySearchTree.cpp, HashTable.cpp, template_instantiations.cpp en main.cpp. Een IndexItem stelt een voorkomen voor van een bepaald woord (een string) op een bladzijde, lijn en positie binnen die lijn. BookIndex stelt de volledige index voor, en houdt intern een HashTable en een BinarySearchTree bij. De BinarySearchTree is een gewone binaire zoekboom (cursus Appendix B3.3 blz 190 en volgende) zonder balancering waarbij elk element een pointer naar zijn eventuele linkse en rechtse kind bijhoudt, en een pointer naar zijn ouder in de boom. De BinarySearchTree is opgebouwd uit TreeElements die telkens een sleutel en een waarde bijhouden: een woord en een corresponderend IndexItem. De HashTable gebruikt het woord van een IndexItem als sleutel, en als waarde houdt deze (voor elke sleutel dus) een enkelvoudig gelinkte lijst van TreeElement pointers bij, die verwijzen naar het boomelement dat het IndexItem bevat dat bij deze sleutel hoort. Zie onderstaande figuur met een schematische voorstelling van de datastructuur van BookIndex. Naam:.. blz. 1

De HashTable bevat ook een extra array die de lengte van elke lijst van de HashTable bijhoudt. Opzoeken van de IndexItems behorend bij een woord kan dus op twee manieren: via de HashTable of via de BinarySearchTree. Voor een klein aantal IndexItems zal de HashTable efficiënter zijn, voor een groter aantal de BinarySearchTree. Gevraagd: vul de cpp files verder aan. Meerbepaald, implementeer In BinarySearchTree.cpp o operator[ ] (2,5 punten) (signatuur in headerbestand, geeft std::list<v> terug) In HashTable.cpp: o destructor (1,5 punten) o put (2 punten) o operator[ ] (1,5 punten) (signatuur in headerbestand, geeft std::list<v> terug) In BookIndex.cpp: o constructor (0,5 punten) o destructor (0,5 punten) o add (1,5 punten) o operator[ ] (2 punten) (zie ook hints en header, geeft std::list<indexitem> terug) Naam:.. blz. 2

Enkele hints/opmerkingen: Schrijf je naam, stamnummer en richting bovenaan elk cpp bestand. Je mag de gegeven header bestanden NIET aanpassen! Doe je dit toch, dan verlies je punten. Bestudeer aandachtig de gegeven header bestanden; ze bevatten extra informatie over de te implementeren functies en de werking van de code. Zoals hierboven vermeld is het opzoeken van de waarden behorend bij een bepaalde sleutel (woord) efficiënter via ofwel de BinarySearchTree ofwel de HashTable, afhankelijk van de lengte van de lijst in de HashTable. Implementeer de [ ] operator in BookIndex zodanig dat er enkel in de BinarySearchTree gezocht wordt indien er meer dan 20 elementen met dezelfde hashwaarde aanwezig zijn in de HashTable. Anders wordt steeds via de HashTable gezocht. Voor de implementatie van de HashTable heb je een hashfunctie nodig; die is reeds aanwezig in de klasse: deze neemt een string als argument en geeft een unsigned int terug In de main methode kan je gemakkelijk enkel je BinarySearchTree testen door de functie testbst uit te voeren. Deze zal een BinarySearchTree van strings aanmaken, en er de gevraagde methoden op testen. Hetzelfde geldt voor HashTable, hiervoor is de functie testht voorzien. Eens je de BookIndex klasse hebt afgewerkt kan je die testen via testbookindex. De main methode hoeft in principe niet aangepast te worden, maar dit is wel toegelaten. Veel succes! Appendix (voor de volledigheid): Project aanmaken in MS Visual C++ EE: Kies File New Project en selecteer als Project Type Win32. Als Template selecteer je Win32 Console Application. Onderaan vul je dan een projectnaam, een opslaglocatie en de naam van de (nieuwe) Solution in. Na bevestigen wordt een Win32 Application wizard opgestart. Druk op Next, check of Console Application als Application type wordt weergegeven en vink Empty Project aan. Vervolgens kan je deze wizard beëindigen. Er is nu een nieuw project en een nieuwe Solution aangemaakt. De header files toevoegen kan je door rechts te klikken op de Header files folder en Add Existing Item aan te klikken Naam:.. blz. 3

KLADPAPIER: Naam:.. blz. 4

Examen Software Ontwikkeling I 2e Bachelor Informatica Faculteit Wetenschappen Academiejaar 2010-2011 21 januari, 2011 **BELANGRIJK** 1. Schrijf je naam onderaan op elk blad. 2. Dit deel gaat enkel over C, GEEN C++. 3. Kladpapier vind je achteraan. 4. Veel succes! Programmeren in C [op 8 punten van de 20] Deze vraag handelt over een (op positie) gesorteerde enkelvoudig gelinkte lijst van elementen die een woord en de positie van dat woord in een tekstbestand bijhouden. Gegeven volgend header bestand: typedef struct list_element{ int position; char* word; struct list_element* next; list_element; /* maakt een nieuw list_element aan met de opgegeven waarden*/ /* geeft NULL terug indien niet genoeg geheugen beschikbaar is*/ list_element* init_list_element(int position, char* word); /* gesorteerd invoegen van een element to_add*/ /* return waarde : /* 0 -> toevoegen is gelukt */ /* -1 -> er is al een element op de betreffende positie */ int add_list_element(list_element* to_add, list_element** head); /* verwijderen van het element op positie position*/ /* return waarde : /* 0 -> verwijderen is gelukt */ /* -1 -> er is geen element op positie position */ int remove_list_element(int position, list_element** head); /* vernietigt de opgegeven lijst */ /* en geeft het gealloceerde geheugen vrij */ void destroy_list(list_element** head); Naam:.. blz. 5

/* concateneert de opgegeven string word achteraan aan de string */ /* op positie position */ /* indien er geen element is op positie position, */ /* wordt een nieuw element toegevoegd */ /* 0 -> achteraan toevoegen is gelukt */ /* -1 -> er is niet genoeg geheugen beschikbaar */ int append_word(int position, char* word, list_element** head); a. Waarom geeft de functie init_list_element een pointer naar list_element terug en niet een list_element zelf? [op 0,5 punten van de 20] Geef ook de implementatie van de functie init_list_element [op 1,5 punten van de 20] list_element* init_list_element(int position, char* word) b. Waarom wordt een dubbele pointer meegegeven naar de kop van de lijst in de functies add_list_element en remove_list_element [op 0,5 punten van de 20] Naam:.. blz. 6

c. Geef de implementatie van de functie destroy_list [op 1 punt van de 20] void destroy_list(list_element** head) d. Geef de implementatie van de functie append_word [op 1,5 punten van de 20] int append_word(int position, char* word, list_element** head) Naam:.. blz. 7

e. Stel dat men 2 dergelijke lijsten wil samenvoegen. Hiermee wordt bedoeld dat in de resulterende lijst alle elementen uit de 2 oorspronkelijke lijsten aanwezig zijn, en indien er op een bepaalde positie in beide lijsten een element aanwezig is, dan worden de woorden van deze elementen geconcateneerd, zoals hieronder schematisch voorgesteld: De code op de volgende pagina implementeert deze list merging. Er zitten echter in totaal 4 foutjes in deze code (zowel programmeerfouten als mogelijks algoritmische fouten). Bekijk de code kritisch en corrigeer deze fouten. Indien je niet genoeg plaats hebt mag je de (mogelijks) ontbrekende code onder het codefragment schrijven. [op 2 punten van de 20] Naam:.. blz. 8

int plus(list_element* list1, list_element* list2, list_element** new_list){ char* sum; list_element* temp = NULL; while(list1!= NULL list2!= NULL){ if(list1!= NULL && list2!= NULL){ if(list1->position < list2->position){ temp = init_list_element(list1->position, list1->word); list1 = list1->next; else{ sum = (char*)malloc(sizeof(char)*(strlen(list1->word)+strlen(list2->word))); if(sum == NULL){ destroy_list(new_list); return -1; strcpy(sum,list1->word); strcpy(sum,strncat(sum,list2->word,sizeof(list2->word))); temp = init_list_element(list1->position, sum); list1 = list1->next; list2 = list2->next; else if(list1 == NULL && list2!= NULL){ temp = init_list_element(list2->position, list2->word); list2 = list2->next; else if(list2 == NULL && list1 == NULL){ temp = init_list_element(list1->position, list1->word); list1 = list1->next; if(temp == NULL add_list_element(temp,new_list)){ destroy_list(new_list); return -1; return 0; Naam:.. blz. 9

Leg uit hoe een Make bestand automatisch kan gegenereerd worden. Vermeld de voorwaarde waaraan moet voldaan zijn om dit automatisch te kunnen. Indien deze voorwaarde voldaan is, welke input is dan nog van de gebruiker vereist? [op 1 punt van de 20] Naam:.. blz. 10

KLADPAPIER: Naam:.. blz. 11