Nada KTH 2003 okt 23 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Relevanta dokument
Nada KTH 2004 jan 12 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Del : Paradigmer allmänt.

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Nada Tentamensdag 2004 okt 18 Tentamen Programmeringsparadigm Skrivtid 5 h

Del : Paradigmer allmänt.

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Föreläsning 9 i programmeringsparadigm. Unifiering (Brna Chapter 4.1).

Föreläsning 8. newtype Chess = Chess [(Square, Chessman)] -- data ist f newtype OK -- data istället för newtype krävs om >1 konstruerare.

Kungliga Tekniska Högskolan Ämneskod 2D1370 Tentamensdag 2001-maj-31 Tentamen i Funktionell Programmering Skrivtid 4 h

DD1361 Programmeringsparadigm. Carina Edlund

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Föreläsning 4 (och 5?) i programmeringsparadigm.

Föreläsning 5 i programmeringsparadigm.

Föreläsning 8. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Föreläsning 4 i programmeringsparadigm.

Tentamensdag 2002-aug-20 Tentamen i Funktionell Programmering Skrivtid 5 h

Föreläsning 6 i programmeringsparadigm. Tips kring programmering i Haskell och kring labbarna.

Föreläsning 9 i programmeringsparadigm. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Funktionell programmering DD1361

Imperativ programmering

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Kursanalys för Programmeringsparadigm 2D1361, läsperiod 1 och 2 läsåret 2005/2006

Tentamen i Grundläggande programmering STS, åk 1 lördag

Nada, KTH Tentamensdag maj -24 Tentamen i Funktionell Programmering Skrivtid 5 h

Enjoy Vattenfallsmodellen i funktionella språk

Tentamen ID1004 Objektorienterad programmering May 29, 2012

TDDD78, TDDE30, 729A Introduktion till Java -- för Pythonprogrammerare

LÖSNINGSFÖRSLAG TENTAMEN PROGRAMMERING I ETT FUNKTIONELLT SPRÅK ML, 5P

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Imperativ programmering. Föreläsning 4

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Föreläsning 4 (och 5?) i programmeringsparadigm.

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Datalogi I, grundkurs med Java 10p, 2D4112, Tentamen 29 november 2003, svar och lösningar

Föreläsning 3: Booleans, if, switch

Enjoy Vattenfallsmodellen i funktionella språk

TDDD78, TDDE30, 729A Introduktion till Java -- för Pythonprogrammerare

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Programmering C: Tentamen of 5 Prioritet och associativitet hos operatorerna i C De viktigaste operatorerna: Prioritet Kategori Operator

TENTAMEN OOP

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Programmering A. Johan Eliasson

Programmering = modellering

Objektorienterad programmering. Grundläggande begrepp

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Objektorienterad programmering

Objektorienterad Programmering (TDDC77)

Grundläggande programmering med C# 7,5 högskolepoäng

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

DD1361 Programmeringsparadigm HT15

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Programkonstruktion. Tentamen,

LÖSNINGSFÖRSLAG TENTAMEN

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Syfte : Lära sig objektorienterad programmering Syfte : Lära sig programmering i ett OO-språk vilket?

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Tentamen i Introduktion till programmering

Objektorienterad Programmering (TDDC77)

Tentamen i Objektorienterad programmering

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Programkonstruktion. Tentamen,

Arv. Objektorienterad och komponentbaserad programmering

Tentamen TEN1 HI

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

TENTAMEN OOP

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Introduktion till Haskell

Tentamen TEN1 HI

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Introduktion till programmering. Programspråk och paradigmer

Instruktioner - Datortentamen TDDE24 och TDDD73 Funktionell och imperativ programmering (i Python)

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Kopiering av objekt i Java

Föreläsning REPETITION & EXTENTA

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

Transkript:

Nada KTH 2003 okt 23 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13 Antalet uppgifter : 1 (allmänt)+ 4 (Haskell) + 4 (Prolog) = 9 10p +(14p + 12p +10p+ 14p) + (8p +12p + 12p +8p) = 10p + 50p + 40 p = 100p Lärare, jourhavande lärare : Leif Kusoffsky ------------------------------------------------------------------------------------------------------------------ Tillåtna hjälpmedel: Fokker : Functional programming Brna : Prolog Programming ----------------------------------------------------------------------------------------------------------------- Del : Paradigm allmänt. 1. a) Kan man programmera icke-objekt-orienterat i Java, dvs som i ett klassikt imperativt språk? 1) Nej, går ej att skriva program som är i stort ekvivalenta med t ex Pascal-program. X) Ja, om klasserna enbart har variabler och funktioner deklarerade utan static. 2) Ja, i stort sett om funktioner är deklarerade som static. b) Om man programmerar objekt-orienterat i Java 1) har aldrig subklasser egna olika implementaioner av metoder definierade i en superklass. X) har ibland subklasser egna olika implementaioner av metoder definierade i en superklass. 2) har alltid subklasser egna olika implementaioner av metoder definierade i en superklass. c) Vid ett anrop x.f(..) i Java kan 1) x vara en variabel som innehåller en primitiv typ. X) olika metoder f anropas vid körningen, beroende på vilket sots objekt x refererar. 2) f(..) ej vare en metod med returtypen void. d) Vid anrop av klassmetoder X.f(..) i Java 1) måste X vara namnet på en objektreferens. X) kan X vara namnet på en klass. 2) klassmetoder kan ej anropas med denna syntax. e) Vid ett anrop av X.f(..) i ett icke-objektinriktat språk 1) måste X vara namnet på en objektreferens. X) kan X vara namnet på något i språket som används för modularisering (t ex funktionpaket). 2) Sådana uttryck finns inte i något icke-objektinriktat språk. f) I OO-design bör man enligt mångas åsikt i början av programutvecklingen fråga sig 1) MED VAD, dvs vilka sorts föremål i användarens värld skall jag modellera? X) VAD, dvs vilka funktioner vill användaren att programmet ska ha? 2) HUR, dvs hur skriver jag funktionerna som användaren vill att programmet skall ha? g) Vilka av följande begrepp brukar förknippas med moderna (icke-oo) imperativ språk? "loopar" (dvs snurror, slingor), arv, pekare, rekursion, dynamisk bindnig, unifiering. h) Gruppera i paradigmen imperativa, objektorienterade, funktionella och logiska: Haskell, C, Prolog, C++, Eiffel, Java, Pascal, Basic, Fortran, assemler, Smalltalk, Simula. (10p).

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar. 2. Skriv i i Haskell en funktion swaplist som skiftar komponeterna i alla par i en lista. De par där båda komponeterna är lika skall ej finnas med i resultatlistan. Exempel : Main> swaplist [(5,4),(15,14),(2,2),(14,14),(35,34)] [(4,5),(14,15),(34,35)] a) Skriv en lösning som vare sig använder högre ordningens funktioner, ackumulering i parameter, eller listomfattning. b) Skriv en lösning som använder ackumulering i parameter. c) Skriv i i Haskell en funktion swap som skiftar komponeterna i ett par. d) Skriv i i Haskell en funktion pneq som kontrollerar att komponeterna i ett par är olika. e) Skriv en lösning för swaplist som använder map, filter, swap och pneq. f) Skriv en lösning för swaplist som använder listomfattning. g) Skriv en lösning för swaplist som använder map, filter och lamda-uttryck (anonyma funktioner) i stället för swap och pneq. (14p) 3. Implementera i Haskell en DT (datatyp) Square för schackrutor i en modul Square. Datatypen skall ha de funktioner som framgår av signaturdiagrammet nedan. Bool diag1, diag2 Square show String == /= betweensquare diag1 fromsquare tosquare returnerar om tosquare är snett ett steg uppåt eller nedåt, vänster eller höger, från fromsquare. Funktionen diag2 returnerar analogt för två steg. Funktionen betweensquare returnerar mellanliggande ruta om diag2 fromsquare tosquare är True, annars error med lämpligt felmedellande. fromsquare betweensquare tosquare diag2 fromsquare tosquare är true Funktionerna kan användas för dragen i ett damliknade spel, diag1 när man går till tomma rutor, diag2 när man "hoppar" över en enda motståndarpjäs. (12p)

4. Implementera i Haskel en DT (datatyp i en modul) Piece för att representera pjäserna i ett damliknade spel. Det finns bara en sorts pjäs, fast en uppsättning vita och en uppsättning svarta. Modulen implementerar två datatyper: Colour som indikerar om en pjäs är vit (WhiteC) eller svart (BlackC). Piece som är en pjäs/tom ruta. T ex är Pi WhiteC en vit pjäs, NoPiece är en tom ruta. Datatypen skall också ha funktionen othercolour som framgår av signaturdiagrammet: othercolour WhiteC blir BlackC, othercolour BlackC blir WhiteC. (10p) othercolour Colour WhiteC BlackC Pi Piece NoPiece 5. Implementera i Haskel en DT (datatyp i en modul) Board för att representera damspel. Modulen implementerar en datatyp Board. Definiera typen som data Board = Board [(Square, Piece)] deriving Show Skulle man kunna använda newtype istället för data? Konsekvenser? Skulle man kunna använda type istället för data? Konsekvenser? Ett värde med typen Board innehåller en lista med 64 element. Varje element är ett par. Paren består av en ruta (Square) och schackpjäsen (Piece) på den rutan. Tomma rutor har "pjäsen" NoPiece. Datatypen skall också ha ytterligare två funktioner, som framgår av signaturdiagrammet: Piece (,) [] Board Board show String Square 2 3 2 4 Bool 1 pieceat legalmove Piece 1 Funktionen pieceat returnerar pjäsen på en viss ruta i ett damspel. Funktionen legalmove returnerar om en ("riktig") pjäsen på en viss ruta i ett damspel får flytta till en annan ruta. Det är tillåtet att flytta diagonalt ett steg till en tom ruta, och att flytta diagonalt tvårutor till en tom ruta om mellanliggande ruta innehåller en motståndarpjäs. (14p)

Del : Logikprogrammering. 6. Skriv ett program i Prolog för select(x,harxs,ettmindrexs) med betydelsen att listan EttMindreXs är resultat av att en förekomst av X har tagits bort från HarXs. (8p) 7. Skriv i Prolog ett generate-and-test-program som löser följande problem: I en kappsegling deltar 9 båtar. Volo placerade sig mellan Maybee och Bonnie. Maybee var just före Sylvia. Spray var första båt efter Bigfoot. Dristigheten placerade sig mellan Patricia och Necesse. Spray kom precis innan Necesse. Bigfoot kom precis mitt i resultatlistan Hur ser resultatlistan ut? (12p) Tips: Man kan ordna båtarna i resultatordning. Med "A mellan B och C" menas att båtarna har följden BAC eller CAB. 8. Skriv i Prolog ett program som löser följande problem: Vilka färdvägar (rutter) finns det mellan två orter. De orter som är aktuella finns i nedanstående avståndstabell. För full poäng ska man även få reda på den totala avståndet för rutten och vilka mellanliggande orter som passeras. Vidare skall för full poäng en förbindelse mellan två orter bara användas en gång. (12p) dist([d(stockholm, orebro, 197), % Färdigt faktum i Prolog, får användas d(stockholm, jonkoping, 335), % i lösningen norrtalje d(orebro, goteborg, 283), orebro d(jonkoping, goteborg, 149), 283 197 75 d(orebro,jonkoping, 200), 200 stockholm d(stockholm, norrtalje, 75)]). goteborg 149 335 jonkoping Exempel på körningar:?- route(goteborg, stockholm, D, Vs). D = 480, Vs = [orebro]? ; D = 484, Vs = [jonkoping]? ; no Tips och kommentarer: För full poäng skall man kunna använda avståndstabellen "åt båda hållen". Vidare är det bra om man kan undvika att få lösningar som?- route(goteborg, stockholm, D, Vs). D = 818, Vs = [orebro,jonkoping]? dvs om det i tabellen finns en direkt förbindelse mellan två orter nöjer sig programmet med detta och söker ej omvägar. Ett sätt att bara använda en förbindelse mellan två orter en gång är att "nästa gång använda en avståndstabell med förbindelsen bortagen".

9. a) Om Prolog misslyckas med att unifiera argumenten i ett delmål f(..) med huvudet (konklusionen) i den första av flera klausuler som definierar predikatet f så 1) svarar Prolog yes. X) svarar Prolog no. 2) försöker Prolog unifiera argumenten med huvudet i den andra klausulen för predikatet f. b) Om ett Haskell-system, t ex hugs, misslyckas med att passa ("matcha") argumenten i ett anrop f.. med vänsterledet i den första av flera ekvationer som definierar funktionen f så 1) svarar hugs med Program error. X) returneras False. 2) försöker hugs "matcha" argumenten med vänsterledet i den andra ekvationen för funktionen f. c) Om Prolog misslyckas med att satisfiera ett delmål g i en konjunktion av delmål.., h(..), g(..), f(x) så 1) försöker Prolog på nytt att få delmål h att lyckas. X) svarar Prolog no. 2) svarar Prolog yes. d) Om ett Haskell-system, t ex hugs, vid en körning får resultatet False vid beräkningen av funktionanropet g(x)i detta uttryck med funktionanrop h(x) && g(x) && f(x) så 1) anropas h(x) på nytt. X) blir hela uttrycket True om uttrycket f(x), som beräknas, blir True. 2) blir hela uttrycket False 8p)

Uppmaning: Svara gärna på kursenkäten, som du kan komma åt från kursidan! Förfrågan: Kan du tänka dig att vara labbassistent nästa år under läsperiod 1 i kursen programmeringsparadigm i D2? Kryssa gärna i ett eller båda alternativen. (Naturligtvis ej bindande) O I Haskelldelen av kursen O I Prologdelen av kursen Hur kan jag kontakta dig (tex e-pos, tel ): Om du kryssat, bifoga denna sida med svaren på din tentamen!

Förslag till svar tenta programmeringsparadigm 2003 okt 23. < 50 U Gjort steg 9 i shacket <65 3 <80 4 <100 5 Ej steg 9 <75 3 <90 4 <100 5 Del paradigmer allmänt. 2 X X X X 1 loopar, pekare, rekursion OO : C++ Eiffel Java Smalltalk Simula Funktionellt : Haskell Logik : Prolog Imperativa: Övriga Del funktionell programmering. swaplist :: Eq a => [(a, a)] -> [(a, a)] -- 2 swaplist [] = [] -- a swaplist ((a, b) : abps) a == b = swaplist abps otherwise = (b, a):swaplist abps swaplist list = sl list [] -- b where sl :: Eq a => [(a, a)] -> [(a, a)] -> [(a, a)] sl [] acc = acc sl ((a, b) : abps) acc a == b = sl abps acc otherwise = sl abps (acc ++ [(b, a)]) swap :: (a, b) -> (b, a) -- c swap (a, b) = (b, a) pneq :: Eq a => (a, a) -> Bool -- d pneq (a,b) = a /= b swaplist :: Eq a => [(a, a)] -> [(a, a)] -- e swaplist list = map swap (filter pneq) list) swaplist list = [ (b, a) (a,b) <-list, pneq (a,b)] -- f swaplist list = map (\(a, b) -> (b, a)) (filter (\(a, b) -> a /= b) list) module Square where -- 3 data Square = Sq Int Int deriving (Show, Eq) --fixar show (==) (/=) Saknas - 2p -- g diag1, diag2 :: Square -> Square ->Bool -- predicates for geometrical relations diag1 (Sq i1 j1) (Sq i2 j2) = (abs (i1-i2) == 1 ) && (abs (j1-j2) == 1) diag2 (Sq i1 j1) (Sq i2 j2) = (abs (i1-i2) == 1 ) && (abs (j1-j2) == 1) betweensquare (Sq i1 j1) (Sq i2 j2) diag2 (Sq i1 j1) (Sq i2 j2) = Sq ((i1 + i2) div 2) ((j1 + j2) div 2) otherwise = error "wrong squares in betweensquare" module Piece where -- 4 data Colour = WhiteC BlackC deriving (Show, Eq) data Piece = Pi Colour NoPiece deriving (Show, Eq) othercolour :: Colour -> Colour othercolour WhiteC = BlackC othercolour BlackC = WhiteC

module Board (Board(..) where -- 5 import Piece import Square newtype Board = Board [(Square, Piece)] -- newtype ok pga en konstr. snabbare deriving Show -- type Board = [(Square, Piece)] skulle gå, ändringar krävs, -- ingen ny typ. Dock fortfarande ADT med rätt export -- legalmove ; checks if move in draughts (checkers) is ok. om Piece samnas - 1p legalmove :: Piece -> Square {-from -} -> Square {-to -} -> Board -> Bool legalmove (Pi colour) fromsquare tosquare board = ((diag1 fromsquare tosquare ) && (pieceat tosquare board == NoPiece )) ((diag2 fromsquare tosquare ) && (pieceat tosquare board == NoPiece) && (pieceat (betweensquare fromsquare tosquare) board == Pi (othercolour colour) )) legalmove NoPiece _ = False -- saknas - 1p pieceat :: Square -> Board ->Piece -- Glömma Board nedan / i andra lösn, - 2p pieceat sq (Board ch) = onlyone [icm (isq, icm) <- ch, isq == sq] onlyone :: [Piece] -> Piece onlyone (cm:[]) = cm onlyone _ = error "error in onlyone, pieceat" Del logik programmering. select(x, [X Xs], Xs). % 6 select(x, [Y Ys], [Y Zs]) :- select(x, Ys, Zs). % Ls is a result list of 9 boats in a race % 7 race(ls) :- Ls = [_, _,_,_, bigfoot, spray, _, _, _], follows(maybee, sylvia, Ls), follows(spray, necesse, Ls), between(necesse, dristigheten, patricia, Ls), between(maybee, volo, bonnie, Ls). follows(x,y,[x,y _]). follows(x,y,[_ Zs]):- follows(x,y,zs). between(x,y,z,[x, Y, Z _]). between(x,y,z,[z, Y, X _]). between(x,y,z, [_ Us]) :- between(x,y,z, Us). /* Körning:?- race(rs). Rs = [bonnie,volo,maybee,sylvia,bigfoot,spray,necesse,dristigheten,patricia]? ; no */ sel(d(a,b,d), Ds, Ds1) :- select(d(a,b,d), Ds, Ds1). %8 sel(d(a,b,d), Ds, Ds1) :- select(d(b,a,d), Ds, Ds1). % Rättad sist % De som redan distance(a, B, D, Ds, []) :- sel(d(a,b,d), Ds, _ ),!. % har en säker 5 distance(a, B, D, Ds, [V Vs]) :- % har jag sel(d(a,v,d1), Ds, Ds1 ), % poängsatt distance(v, B, D2, Ds1, Vs), D is D1+D2. % ungefärligt route(a, B, D, Vs) :- dist(ds), distance(a, B, D, Ds, Vs). 2 2 1 2 %9