Skriftlig eksamen i Datalogi

Relaterede dokumenter
Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi

Løsning af møntproblemet

Vejledende løsninger

DANMARKS TEKNISKE UNIVERSITET

Om binære søgetræer i Java

Træer. Datastrukturer & Algoritmer, Datalogi C Forelæsning 9/

Søgetræer: Generel repræsentation af (sorterede) mængder og funktioner Databasesystemer...

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Sortering. Eksempel: De n tal i sorteret orden

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Tree klassen fra sidste forelæsning

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Invarianter. Invariant: Et forhold, som vedligeholdes af algoritmen gennem (dele af) dens udførelse. Udgør ofte kernen af ideen bag algoritmen.

Kursus navn: Indledende programmering Kursus nr

Sortering. Eksempel: De n tal i sorteret orden

Opgaven fortsat. Opfølgning på Opgave 2 og Use Cases. Opgaven. Trin 1: Væsentlige begreber. Resultatliste: 100 bryst, herrer

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Sortering af information er en fundamental og central opgave.

Sortering af information er en fundamental og central opgave.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

BRP Sortering og søgning. Hægtede lister

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Ugeseddel 4 1. marts - 8. marts

Stakke, køer og lidt om hægtede lister

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Forelæsning Uge 2 Torsdag

Eksempel: Skat i år 2000

DM507 Algoritmer og datastrukturer

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Kursusarbejde 3 Grundlæggende Programmering

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Hanne Niels Edith Harald Carsten Jørgen Henrik.

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

DM507 Algoritmer og datastrukturer

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17

BRP Kursusintroduktion og Java-oversigt

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

16 Træer. Noter. Definition af et træ. Definitioner i tilknytning til træer. Repræsentation af træer. Binære træer. Den abstrakte datatype.

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

DATALOGI 0GB. Skriftlig eksamen tirsdag den 6. januar 2004

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Forelæsning Uge 5 Mandag

Danmarks Tekniske Universitet

Aritmetiske Forelæsning Pr ogrammering operatorer tir 1999 sda præcedens september 1999 Logiske Sammenligningsoperatorer operatorer præcedens

Rekursion og dynamisk programmering

Forelæsning Uge 5 Mandag

Forelæsning Uge 2 Torsdag

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer:

Forelæsning Uge 2 Torsdag

DM507 Algoritmer og datastrukturer

DATALOGI 0GB. Skriftlig eksamen mandag den 7. juni 2004

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Klasser og nedarvning

Lær Python dag 1 - modul 1

Danmarks Tekniske Universitet

Forelæsning Uge 2 Torsdag

DM507 Algoritmer og datastrukturer

Danmarks Tekniske Universitet

Lær Python - Dag 4, modul 2 Objektorienteret programmering

Danmarks Tekniske Universitet

Virkefeltsregler i Java

DM507 Algoritmer og datastrukturer

Fundamentale sprogbegreber

Danmarks Tekniske Universitet

Databaseadgang fra Java

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Forelæsning Uge 2 Mandag

Parallelle algoritmer

Forelæsning Uge 2 Mandag

Forelæsning Uge 1 Torsdag

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

JavaScript. nedarvning.

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Forelæsning Uge 2 Mandag

Noter til C# Programmering Selektion

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Science and Technology EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Forelæsning Uge 1 Torsdag

dintprog Manual Revision: 731 September 30, Introduktion Notation... 3 I Begreber 4 2 Grundbegreber om programmering 4

Introduktion til ActionScript

DRONNINGER (QUEENS) Opgave 1

Poly. - Javapakke til behandling af polynomier

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Forelæsning Uge 6 Mandag

Skriftlig eksamen, Programmer som Data Onsdag 6. januar Spørgsmål 1 (20 %): Regulære udtryk og automater

Transkript:

Skriftlig eksamen i Datalogi Modul 1 Sommer 1998 Opgavesættet består af 4 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 24% Opgave 2 35% Opgave 3 15% Opgave 4 26% Alle sædvanlige hjælpemidler er tilladt. Der må ikke medbringes datamaskine. I tilfælde af unøjagtigheder i opgaveteksterne forventes det, at deltagerne selv præciserer besvarelsernes forudsætninger. Opgavesættet består af en forside og 11 paginerede sider. Kontroller at din kopi er fuldstændig.

Roskilde Universitetscenter side 1 af 11 sider Opgave 1: Objektorienteret programmering (24%) Nedenfor er vist et udkast til en samling Java-klasser, der er beregnet til katalogisering af dyr. Klassen Animal er en fælles overklasse for de to klasser Carnivore og Herbivore, der repræsenterer henholdsvis mængden af kødædende og planteædende dyr. class Animal { Animal(String n) { /* Kode ikke medtaget. Se spørgsmål 1.1 */ static void printanimals() { /* Kode ikke medtaget. Se spørgsmål 1.3 */ static Animal firstanimal; String name; Animal next; public String tostring() { return name; class Herbivore extends Animal { Herbivore(String n, int g) { /* Kode ikke medtaget. Se spørgsmål 1.2 */ int grassneeded; class Carnivore extends Animal { Carnivore(String n, int m) { /* Kode ikke medtaget */ int meatneeded; Hvert Animal-objekt er forsynet med en tekststreng name, der angiver dyrets navn. Referencen next benyttes til opbevaring af Animal-objekterne i en envejsliste, idet den statiske reference firstanimal peger på det forreste objekt i denne liste, og next angiver objektets efterfølger i listen. Spørgsmål 1.1 Programmér en konstruktør for klassen Animal, som tildeler name en værdi og indsætter det genererede objekt forrest i envejslisten.

Roskilde Universitetscenter side 2 af 11 sider For hvert planteædende dyr (Herbivore-objekt) angives dets daglige fødebehov ved hjælp af attributten grassneeded. Spørgsmål 1.2 Programmér en konstruktør for klassen Herbivore, som tildeler værdier til name og grassneeded, og som indsætter objektet i envejslisten ved hjælp af konstruktøren for Animal. Spørgsmål 1.3 Programmér metoden printanimals, der gennemløber envejslisten af dyr og udskriver deres navne. Spørgsmål 1.4 Programmér en metode printherbivores, der kun udskriver navnene på de af dyrene i envejslisten, der er planteædere (Herbivore-objekter). Klassen Herbivore benyttes nu som overklasse for klassen Giraffe, der repræsenterer mængden af giraffer. Attributten necklength angiver halslængden for en giraf. class Giraffe extends Herbivore { Giraffe(String n, int g, double nl) { /* Kode ikke medtaget */ double necklength; Lad der være givet følgende erklæringer: Animal a; Herbivore h; Carnivore c; Giraffe g1, g2; Spørgsmål 1.5 Antag at objekterne a, h, c, g1 og g2 eksisterer. Hvilke af følgende sætninger vil da give fejl under oversættelsen? (1) a = g1; (2) a = h; (3) g1 = a; (4) g1 = g2; (5) g1 = (Giraffe) h; (6) g1 = (Carnivore) h; (7) g1 = (Giraffe) c;

Roskilde Universitetscenter side 3 af 11 sider Nedenfor ses et interface, Sortable, samt en klasse Sort til sortering af en tabel af Sortableobjekter i stigende orden. interface Sortable { boolean lessthan(sortable s); class Sort { static void selectionsort(sortable a[]) { for (int i = 0; i < a.length - 1; i++) { int min = i; for (int j = i+1; j < a.length; j++) if (a[j].lessthan(a[i])) min = j; Sortable temp = a[min]; a[min] = a[i]; a[i] = temp; Spørgsmål 1.6 Angiv hvilke ændringer der skal foretages i klassen Giraffe på side 2, hvis dette interface skal kunne benyttes til at sortere en tabel af Giraffe-objekter i stigende orden efter deres halslængde.

Roskilde Universitetscenter side 4 af 11 sider Opgave 2: Parsetræer (35%) Spørgsmål 2.1 Omskriv nedenstående udtryk til omvendt polsk (postfix) notation. 2 * (5-3) + 1 Et parsetræ for et udtryk er et binært træ, der opbygges ved følgende simple rekursive regel: Lad operatoren være rod. Lad træet, der svarer til den venstre operand, være venstre undertræ for roden, og lad træet, der svarer til den højre operand være højre undertræ for roden. Spørgsmål 2.2 Tegn et parsetræ for udtrykket ovenfor. På næste side ses et udkast til en samling Java-klasser, der skal benyttes til at repræsentere udtryk i form af parsetræer. Som operander tillades heltal. Som operatorer tillades +, - og * (addition, subtraktion og multiplikation). Spørgsmål 2.3 Programmér en Java-klasse, Div, som tillader brugen af operatoren / (division). Spørgsmål 2.4 Programmér en kodestump i Java, der benytter klasserne til at oprette et parsetræ for udtrykket i spørgsmål 2.1. Spørgsmål 2.5 Lad root pege på roden i dette parsetræ. Hvad udskrives da ved udførelse af følgende sætninger? root.print(); System.out.println(); System.out.println( Value = + root.eval());

Roskilde Universitetscenter side 5 af 11 sider abstract class Node { abstract int eval(); abstract void print(); abstract class Operator extends Node { Node left, right; void print() { System.out.print("("); left.print(); System.out.print(this); right.print(); System.out.print(")"); class Plus extends Operator { Plus(Node l, Node r) { left = l; right = r; int eval() { return left.eval() + right.eval(); public String tostring() { return "+"; class Minus extends Operator { Minus(Node l, Node r) { left = l; right = r; int eval() { return left.eval() - right.eval(); public String tostring() { return "-"; class Mult extends Operator { Mult(Node l, Node r) { left = l; right = r; int eval() { return left.eval() * right.eval(); public String tostring() { return "*"; abstract class Operand extends Node { void print() { System.out.print(this); class Constant extends Operand { int value; Constant(int v) { value = v; int eval() { return value; public String tostring() { return Integer.toString(value);

Roskilde Universitetscenter side 6 af 11 sider Tilladte udtryk kan defineres ved hjælp af nedenstående grammatik. <expression> ::= <term> <term> + <expression> <term> - <expression> <term> ::= <factor> <factor> * <term> <factor> / <term> <factor> ::= <constant> ( <expression> ) <constant> er en sekvens af cifre (og repræsenterer dermed ikke-negative heltal). Grammatikken kan benyttes næsten direkte til at programmere en metode til at undersøge, om en tekststreng indeholder et lovligt udtryk (expression). I klassen Parser nedenfor er implementeret en sådan metode, parse. Metoden syntaksanalyserer den tekststreng, der overføres som parameter. Hvis tekststrengen repræsenterer et lovligt udtryk, opbygges og returneres et parsetræ for udtrykket; i modsat fald afbrydes programafviklingen med en fejludskrift. class Parser { static final int PLUS = 0, MINUS = 1, MULT = 2, DIV = 3, LPAR = 4, RPAR = 5, CONST = 6, EOS = 7; int token; int value; StringTokenizer str; Node parse(string s) { str = new StringTokenizer(s, "+-*/() ", true); gettoken(); return expression(); Node expression() { Node t = term(); while (token == PLUS token == MINUS) if (token == PLUS) { gettoken(); t = new Plus(t, term()); else { gettoken(); t = new Minus(t, term()); return t; Node term() { /* se spørgsmål 2.7 */ // fortsættes på næste side

Roskilde Universitetscenter side 7 af 11 sider Node factor() { Node t = null; if (token == CONST) t = new Constant(value); else if (token == LPAR) { gettoken(); t = expression(); if (token!= RPAR) error("missing right paranthesis"); else error("illegal factor " + token); gettoken(); return t; void error(string s) { throw new RuntimeException(s); void gettoken() { String s; try { s = str.nexttoken(); catch(nosuchelementexception e) { token = EOS; return; if (s.equals(" ")) gettoken(); else if (s.equals("+")) token = PLUS; else if (s.equals("-")) token = MINUS; else if (s.equals("*")) token = MULT; else if (s.equals("/")) token = DIV; else if (s.equals("(")) token = LPAR; else if (s.equals(")")) token = RPAR; else { try{ value = Integer.parseInt(s); token = CONST; catch(numberformatexception e) { error( constant expected ); Spørgsmål 2.6 Programmér metoden term. Spørgsmål 2.7 Skriv en programstump, der benytter klassen Parser til at beregne og udskrive værdien af udtrykket 2 * (5-3) + 1

Roskilde Universitetscenter side 8 af 11 sider Opgave 3: Sortering (15%) Quicksort er en effektiv metode til sortering. Sortering af en tabel af heltalsvariabler ved hjælp af Quicksort kan i Java programmeres på følgende måde. public void quicksort(int a[]) { quicksort(a, 0, a.length-1); private void quicksort(int a[], int i, int j) { if (i < j){ int m = partition(a, i, j); quicksort(a, i, m-1); quicksort(a, m+1, j); Her er partition en hjælpemetode, der omordner et delsegment (a[i], a[i+1],..., a[j]) af tabellen a, således at følgende 3 betingelser er opfyldt: (1) Elementet a[m] er på sin endelige og korrekte plads i tabellen. (2) Intet af elementerne a[i],..., a[m-1] er større end a[m]. (3) Intet af elementerne a[m+1],..., a[j] er mindre end a[m]. At programmere en fejlfri udgave af partition er imidlertid ikke nogen simpel opgave. Nedenstående udgave er således ikke korrekt. private int partition(int a[], int i, int j) { int v = a[(i+j)/2]; while (i < j) { while (a[i] < v) i++; while (a[j] > v) j--; swap(a, i, j); return i; private void swap(int a[], int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; Spørgsmål 3.1 Angiv et sæt af værdier a[1],..., a[n] for hvilke kaldet partition(a, 1, n) ikke terminerer.

Roskilde Universitetscenter side 9 af 11 sider Nedenfor ses en skitse til en anden udgave af partition. private int partition(int a[], int i, int j) { // 1 while (true) { // 2 while (i < j && a[i] < a[j]) j--; // 3 if (i >= j) return i; // 4??? // 5 while (i < j && a[i] < a[j]) i++; // 6 if (i >= j) return j; // 7??? // 8 // 9 // 10 Spørgsmål 3.2 Angiv den manglende kode ved spørgsmålstegnene i linjerne 5 og 8, således at metoden bliver korrekt. Rekursionen i quicksort kan let elimineres ved brug af eksplicit stak. Nedenstående klasse, Frame, kan benyttes til at repræsentere hvert metodekald i form af en post indeholdende værdierne af metodens lokale variable (i, j og m) samt en angivelse af returpunktet for metodekaldet (PC). Pegeren prev udpeger det underliggende stakelement. class Frame { int i, j, m, PC; Frame prev; Frame(int i, int j, Frame prev) { this.i = i; this.j = j; this.prev = prev; PC = 1; Nedenfor er angivet en næsten færdig version af quicksort, hvor rekursion er elimineret ved hjælp af klassen Frame. private void quicksort(int a[], int i, int j) { Frame top = new Frame(i, j, null); while (top!= null) { switch(top.pc) { case 1: if (top.i >= top.j) top = top.prev; else {??? /* se spørgsmål 3.3 */ continue; case 2: top.pc = 3; top = new Frame(top.m + 1, top.j, top); continue; case 3: top = top.prev; Spørgsmål 3.3 Angiv den manglende kode ved spørgsmålstegnene, således at metoden bliver korrekt.

Roskilde Universitetscenter side 10 af 11 sider Opgave 4: OOA-modellering (26%) De praktiserende læger i Happykøbing sender deres patienter til et privat laboratorium for at få taget blodprøver. Lægerne skriver en rekvisition med patientens stamdata (cpr. nummer, navn, adresse), lægens navn og adresse, samt en specifikation af de analyser der ønskes taget. For nemheds skyld antager vi, at de forskellige mulige analyser kaldes A1 til AN. Patienten ringer selv til laboratoriet for at bestille tid og medbringer selv rekvisitionen til laboratoriet, hvor den samme laborant tager blodprøverne, foretager de specificerede analyser og påfører resultaterne på rekvisitionen. Laboratoriet benytter postvæsenet til at sende resultatet af analyserne til lægen. Der har været mange problemer med denne arbejdsgang. Dels synes læger og patienter, at der går for lang tid inden lægen modtager analyseresultaterne, dels har der været mange eksempler på, at der er foretaget forkerte analyser. De praktiserende læger og laboratoriet er derfor blevet enige om at bestille en analyse med henblik på at indføre et edb-baseret system, der kan sikre færre problemer. Du skal foretage denne analyse ved hjælp af OOA. Sammen med 2 læger og 3 repræsentanter fra laboratoriet er du kommet frem til følgende foreløbige systemdefinition udtrykt i BATOFF: Betingelser: Edb-systemet skal benyttes af lægerne, der skal kunne bestille tid til patienter og de ønskede analyser via systemet, mens patienten er i konsultationen. Laboratoriet skal kunne overføre analyseresultaterne elektronisk til lægerne. Lægerne bruger i forvejen en elektronisk patientjounal, mens laboratoriet har et papir-baseret system og derfor ikke kan forventes at have erfaringer med edb. Anvendelsesområde: Lægerne og laboratoriet skal kunne udveksle oplysninger om patienterne. Lægerne skal sende patientens stamdata (cpr. nummer, navn, adresse), eget navn og post- og e-mailadresse, samt en specifikation af de analyser der ønskes taget. Laboratoriet skal sende analyseresultaterne til lægen. Teknologi: De eksisterende PC er hos lægerne skal benyttes, mens laboratoriet skal have nyt udstyr. Af hensyn til sikkerheden skal der etableret et lukket netværk mellem lægerne og laboratoriet. Objektsystem: Patient, læge, tidsbestilling, rekvisition, laboratorium, laborant. Funktionalitet: Støtte til tidsbestilling og kommunikation mellem læger og laboratorium om patienter, rekvisitioner og analyseresultater. Desuden skal det være muligt at finde ud af hvilken laborant der har foretaget hvilke blodprøver og analyser for hvilken patient. På sigt overvejes det endeligt at føre kontrol med laboranternes tidsforbrug. Filosofi: Et værktøj til de arbejdsopgaver, der er involveret i at bestille tid til patienterne og udveksle de nødvendige oplysninger. Systemet skal også kunne udveksle data med lægernes elektroniske patientjournal.

Roskilde Universitetscenter side 11 af 11 sider Spørgsmål 4.1: Lav et klassediagram for objektsystemet og begrund diagrammet. Spørgsmål 4.2: Lav et tilstandsdiagram for rekvisition og begrund diagrammet. NB. Hvis du foretager afgrænsninger eller gør dig yderligere forudsætninger end de beskrevne, skal du beskrive disse i opgavebesvarelsen.