Symboliska konstanter const

Relevanta dokument
Exempel ( )

const och pekare Output: char *unsafe(char *s) { // Returnerar pekare till det andra tecknet i s printf("%s \n", s);

Föreläsning Datastrukturer (DAT036)

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning 9 Datastrukturer (DAT037)

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

Föreläsning 3 Datastrukturer (DAT037)

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Algoritmer och datastrukturer

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Samlingar Collection classes

public boolean containskey(string key) { return search(key, head)!= null; }

Algoritmer och datastrukturer 2012, fo rela sning 8

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Träd. Rot. Förgrening. Löv

Tentamen Datastrukturer (DAT036)

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Föreläsning 9 Innehåll

Träd. Ett träd kan se ut på detta sätt:

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning 3 Datastrukturer (DAT037)

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

DAI2 (TIDAL) + I2 (TKIEK)

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Föreläsning 2. Länkad lista och iterator

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

Tentamen, Algoritmer och datastrukturer

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

Användning av stack: evaluera uttryck i RPN

Föreläsning 7. Träd och binära sökträd

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Tentamen Programmeringsteknik II

Tommy Färnqvist, IDA, Linköpings universitet

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Dugga Datastrukturer (DAT036)

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Föreläsning 2. Länkad lista och iterator

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

Föreläsning 7. Träd och binära sökträd

TDIU01 Programmering i C++

Föreläsning 4 Datastrukturer (DAT037)

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Länkade strukturer, parametriserade typer och undantag

Föreläsning 14 Innehåll

Föreläsning 8. Mängd, Avbildning, Hashtabell

Repetition av OOP- och Javabegrepp

Pekare ( )

Avancerad SSL-programmering II

Repetition av OOP- och Javabegrepp

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Lösningsförslag till tentamen Datastrukturer, DAT037,

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Tentamen Datastrukturer, DAT037 (DAT036)

Länkade strukturer. (del 2)

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

13 Prioritetsköer, heapar

Föreläsning 11 Innehåll

Föreläsning 4 Datastrukturer (DAT037)

Obligatorisk uppgift 5

Lämna in ifylld kursvärdering tillsammans med tentamen! Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Övning från förra gången: readword

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Lösningsförslag till exempeltenta 1

TDIU01 - Programmering i C++, grundkurs

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Föreläsning 8. Mängd, Avbildning, Hashtabell

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Observera. Tentamen Programmeringsteknik II Skrivtid:

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Föreläsning 10 Innehåll

Datastrukturer. föreläsning 6. Maps 1

Datastrukturer. föreläsning 10. Maps 1

Lösningar Datastrukturer TDA

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Abstrakta datastrukturer

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Transkript:

(5 oktober 2010 T11.1 ) Symboliska konstanter const Tre sätt som en preprocessormacro med const-deklaration med enum-deklaration (endast heltalskonstanter) Exempel: #define SIZE 100 const int ANSWER = 42; const double PI = 3.14159; enum {IT, DV, NV; // IT=0, DV=1, NV=2

(5 oktober 2010 T11.2 ) Mer om uppräkningstypen enum Man kan använda enum som typdeklaration: enum program {IT=1, DV=2, NV=3; enum program p; for (p = IT; p<= NV; p++) { printf("%d ", p); // Kan ge egna värden Deklarationerna ovan är således liktydigt med const int IT = 1, DV = 2, NV = 3; int program; Bättre att använd typedef: typedef enum {IT, DV, NV program; program p;

(5 oktober 2010 T11.3 ) Pekare till funktioner /* simplelist.h - listor med heltal */ typedef struct listnode { int item; struct listnode *next; listnode, *link;... diverse funktioner void apply(link l, void (*f)(int *) ) { while (l) { f(&(l->item)); l = l->next; void add1(int *it) { *it = *it + 1; void pr(int *it) { printf(" %d ", *it); int main() { //... stuff print(l); printf("\n"); apply(l, add1); apply(l, pr); return 0; Output: [0, 0, 2, 3, 6, 6, 8, 9] 1 1 3 4 7 7 9 10

(5 oktober 2010 T11.4 ) Exempel: En generell treemap En map är (i detta sammanhang) en avbildning från en mängd med nycklar till en mängd med värden. Exempel: Personnamn telefonnummer Registeringsnummer för fordon ägaruppgift Personnummer folkbokföringsuppgifter Symboltabell i C-kompilator uppgift om datatyp, adress mm Representeras typiskt som ett binärt sökträd eller en hashtabell Skall visa hur man kan implementera en sådan som ett binärt sökträd. Exemplifierar bl a funktionspekare, en mer avancerad iterator och stackanvändning.

(5 oktober 2010 T11.5 ) Generell treemap forts Noderna i skall alltså innehålla både nycklar och värden. Trädet skall sorteras på nycklarna Kravet på generalitet innebär typen void * för både nycklar och värden. Hur skall nycklar av typen void * kunna jämföras? Det skall finnas operationer för att lagra nyckel värdepar (put), hämta nyckel värdeparvärdet som hör till en viss nyckel (get), fråga om en viss nyckel finns (containskey) Dessutom skall det finnas en inorderiterator

(5 oktober 2010 T11.6 ) Generell treemap forts Ett första utkast till gränssnitt: Tree maketree(); void put(tree t, void *key, void *value); void *get(tree t, void *key); int containkey(tree t, void *key); void iterinit(tree t); int itermore(tree t); void *currentkey(tree t); void *currentvalue(tree t); void iternext(tree t); Olöst problem: put, get och containskey kräver att nycklarna kan jämföras storleksmässigt.

(5 oktober 2010 T11.7 ) Generell treemap forts Möjliga lösningar: Förse dessa med en funktionsparameter som avgör ordningen mellan två godtyckliga nycklar. Exempel: void put(tree t, void *key, void *value, int (*compare)(void *, void *)); där funktionen compare returnerar ett negativt värde om första argumentet är mindre än det andra, noll om de är lika och ett positivt värde om det första är större än det andra (jämför strcmp) Det vore vackrare om man kunde upplysa trädet hur nycklar skall jämföras när man skapar det!

(5 oktober 2010 T11.8 ) Generell treemap forts Lösning: Lagra en pekare till jämförelsefunktionen i trädposten! Vi får då följande deklarationer: typedef struct treenode { // Noderna i trädet void *key; void *value; struct treenode *left; struct treenode *right; treenode, *TreeNode; typedef int (*comparator)(void *, void *); // Jämförelsefunktionens interface typedef struct { TreeNode root; comparator cmp; Stack current; treerecord, *Tree; // Trädpost // Pekare till jämföresefunktionen // Används av iteratorn. Förklaras senare.

(5 oktober 2010 T11.9 ) Generell treemap forts Resten av deklarationsfilen: /* Tree interface functions */ Tree maketree(comparator cmp); void put(tree t, void *key, void *value); void *get(tree t, void *key); int containkey(tree t, void *key); /* Iterator functions */ void iterinit(tree t); int itermore(tree t); void *currentkey(tree t); void *currentvalue(tree t); void iternext(tree t); /* Internal functions */ static TreeNode putprivate(treenode, void *, void *, comparator); static TreeNode search(treenode, void *, comparator);

(5 oktober 2010 T11.10 ) Implementationsfil treemap.c static TreeNode maketreenode(void *key, void *value) { TreeNode result = (TreeNode) malloc(sizeof(treenode)); result->key = key; result->value = value; result->left = NULL; result->right = NULL; return result; Tree maketree(comparator cmp) { Tree result = (Tree) malloc(sizeof(treerecord)); result->root = NULL; result->cmp = cmp; result->current = newstack(); // Förklaras senare return result;

(5 oktober 2010 T11.11 ) Implementationsfil treemap.c Intern funktion för att lokalisera trädnod med viss nyckel. Används av get och containskey: static TreeNode search(treenode r, void *key, comparator cmp) { if (r==null) return NULL; else if (cmp(key, r->key)==0) return r; else if (cmp(key, r->key)<0) return search(r->left, key, cmp); else return search(r->right, key, cmp);

(5 oktober 2010 T11.12 ) Inorderiterator Mer komplicerad än en listiterator måste hålla reda på vägen tillbaka till roten. Använd en stack för detta. Se till att det aktuella elementet alltid ligger överst på stacken. Initiera genom att gå ner till vänster och pusha alla noder på vägen Vid stegning: Poppa stacken. Om den poppade noden har högerbarn så pusha det och hela dess vänstergren

(5 oktober 2010 T11.13 ) Implementation av iteratorn void iterinit(tree t) { drain(t->current); // Töm stacken (ny funktion) TreeNode tn = t->root; while(tn) { push(tn,t->current); tn = tn->left; int itermore(tree t) { return!isempty(t->current);

(5 oktober 2010 T11.14 ) Implementation av iteratorn void *currentkey(tree t) { assert(!isempty(t->current)); return ((TreeNode)top(t->current))->key; void *currentvalue(tree t) { assert (!isempty(t->current)); return ((TreeNode)top(t->current))->value; void iternext(tree t) { // Övning!

(5 oktober 2010 T11.15 ) Testkod Tree t = maketree((comparator)strcmp); put(t, "j", "jjj"); put(t, "a", "aaa"); put(t, "k", "kkk"); put(t, "l", "lll"); for (iterinit(t); itermore(t); iternext(t)) { printf("%10s = %s\n", (char *)currentkey(t), (char *)currentvalue(t)); put(t, "a", "bbb"); printf("nya värdet på a: %s\n", (char *)get(t, "a")); Output: Marvin$./a.out a = aaa j = jjj k = kkk l = lll Nya värdet på a: bbb

(5 oktober 2010 T11.16 ) Övningar 1. Implementera funktion int size(tree t) som returnerar antalet noder i trädet. 2. Implementera funktionen void drain(stack s) som tömmer stacken. 3. Implementera funktionen int containskey(tree t, void *key) som letar efter nod med angiven nyckel och returnerar 1 om den finns, annars 0. 4. Implementera funktionen void *get(tree t, void *key) som returnerar värdet som hör till angiven nyckel eller NULL om nyckeln inte finns. 5. Implementera funktionen void put(tree t, void *key, void *value) som lagrar angivet par av nyckel och värde. Om nyckeln redan finns så skall värdet bytas ut. 6. Implementera funktionen void itenext(tree t) som stegar fram iteratorn