Tentamen EDAA45 Programmering, grundkurs

Relevanta dokument
Tentamen EDAA45 Programmering, grundkurs

Tentamen, EDAA10 Programmering i Java

Tentamen i Programmering

Bedömningsmall för kontrollskrivning EDAA45 Programmering, grundkurs

Tentamen, EDAA20/EDA501 Programmering

Lösning till tentamen EDAA45 Programmering, grundkurs

Tentamen Programmeringsteknik för BME, C, D, E, F, I, N & Pi

Tentamen EDAA45 Programmering, grundkurs

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Tentamen EDA501/EDAA20 M L TM W K V

Tentamen EDAA45 Programmering, grundkurs

Tentamen, EDAA10 Programmering i Java

Tentamen, EDA501 Programmering M L TM W K V

Tentamen, EDAA20/EDA501 Programmering

Tentamen EDAA45 Programmering, grundkurs

Tentamen, EDAA20/EDA501 Programmering

Tentamen, EDA017, Programmeringsteknik för C, E, I och Pi

Tentamen, EDAA20/EDA501 Programmering

Lösning till tentamen EDAA45 Programmering, grundkurs

Tentamen EDAA45 Programmering, grundkurs

Tentamen, EDAA20/EDA501 Programmering

DAT043 Objektorienterad Programmering

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Tentamen, EDA501 Programmering M L TM W K V

Tentamen EDAA45 Programmering, grundkurs

TENTAMEN OOP

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

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

Tentamen, EDAA10 Programmering i Java

Lösningsförslag tentamen FYTA11 Java

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen OOP

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Föreläsning 10 OM DELMÅLSKONTROLLEN ; VARIABLERS SYNLIGHET STRING OCH STRINGBUILDER

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen i Grundläggande programmering STS, åk 1 fredag

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

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Föreläsning 1 & 2 INTRODUKTION

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

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

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Bedömning av kontrollskrivning, EDA016 Programmeringsteknik

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

TENTAMEN OOP

Malmö högskola 2007/2008 Teknik och samhälle

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

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Laboration A Objektsamlingar

OOP Tentamen

Tentamen i Grundläggande programmering STS, åk 1 fredag

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 för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tentamen i Objektorienterad programmering

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

OOP Tentamen

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Malmö högskola 2008/2009 CTS

Programmering A. Johan Eliasson

Sammanfattning och repetition utgående från typiska tentamensuppgifter

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

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

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

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

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

Malmö högskola 2007/2008 Teknik och samhälle

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Tentamen, Programmeringsteknik för BME, F och N

Del A (obligatorisk för alla)

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

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 för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-15, TDA540. Dag: , Tid:

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

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

Tentamen. Lösningsförslag

OOP Omtenta

Tentamen i EDA011 Programmeringsteknik för F, E, I, π och N

Föreläsning 8: Exempel och problemlösning

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

Tentamen, EDAA20/EDA501 Programmering

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

Föreläsning REPETITION & EXTENTA

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TENTAMEN OOP

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

Transkript:

LUNDS TEKNISKA HÖGSKOLA Institutionen för datavetenskap Tentamen EDAA45 Programmering, grundkurs 2017-01-09, 08:00-13:00 Instruktioner Skriv din anonymkod + personlig identifierare här: Tillåtet hjälpmedel: Snabbreferens för Scala & Java. Del A innehåller uppgifter med korta svar som du anger direkt i detta häfte, vilket ska lämnas in tillsammans med omslaget och svaren på del B. Del B innehåller uppgifter med svar i form av programkod som du ska skriva på separat papper. Skriv bara på ena sidan av varje inlämnat blad. Skriv din anonymkod + personlig identifierare överst på varje inlämnat separat papper. Det ska tydligt framgå vilken (del)uppgift du löser. Preliminär poängfördelning Maximalt ges 100p, varav del A omfattar 20p och del B omfattar 80p. För godkänt krävs 50p. Om du på del A erhåller färre än 10p, kan din tentamen komma att underkännas utan att del B bedöms. Poäng och delpoäng som anges ovan och i uppgifterna är preliminära och kan komma att justeras när den slutliga bedömningen fastställs. Upplysningar För att vara tentamensberättigad ska du vara godkänd på alla laborationer och projekt, samt ha genomfört diagnostisk kontrollskrivning. Om du tenterar utan att vara tentamensberättigad annulleras din skrivning. För att undvika att någon skrivning annulleras av misstag kommer alla som, enligt institutionens noteringar, tenterat utan att vara tentamensberättigade att kontaktas via epost. Felaktigheter i institutionens noteringar kan därefter påtalas fram till nästa tentamenstillfälle då resterande skrivningar annulleras. Lösningar läggs ut på kursens hemsida senast dagen efter tentamen. Resultatet läggs in i Ladok när rättningen är klar. 1

2(8) Del A. Evaluera uttryck. Totalt 20p. Du ska fylla i tabellen på nästa sida enligt följande: Antag att du skriver in nedan kod i Scala REPL rad för rad. För varje variabel med namn u1... u10, ange statisk typ (alltså den typ kompilatorn härleder), samt det värde variabeln får efter initialisering, eller sätt i stället kryss i rätt kolumn om det blir ett kompileringsfel respektive exekveringsfel. Vid frånvaro av fel, svara på samma sätt som Scala REPL skriver ut typ respektive värde, enligt exempel u0 i tabellen. Det förekommer varken kompilerings- eller exekveringsfel på raderna till och med deklarationen av u0 nedan, medan efterföljande rader kan innehålla fel. 1 val creatures = Vector("Jultomten", "Storsjöodjuret", "Tandfen", "Skogsrået") 2 3 abstract class SnowStatus(val min: Int, val max: Int = 0) 4 case object BareGround extends SnowStatus(0) 5 case object Spots extends SnowStatus(0,1) 6 case object Thin extends SnowStatus(2,9) 7 case object Thick extends SnowStatus(10, Int.MaxValue) 8 9 val snowdec24 = Map[String, Map[Int, SnowStatus]]( 10 "Lund" -> 11 Map(2008 -> BareGround, 2009 -> Thin, 2010 -> Thick, 2011 -> BareGround), 12 "Haparanda" -> 13 Map(2008 -> Thin, 2009 -> Thick, 2010 -> Thick, 2011 -> Thick) 14 ) 15 16 def test(a: Boolean): String = if (!a) a.tostring.reverse else a.tostring 17 18 val u0 = 40 + 2.0 19 20 val u1 = creatures(0) 21 val u2 = creatures.sortby(_.length).head 22 val u3 = creatures.filter(_ contains "gurka").headoption 23 val u4 = (for (i <- creatures.indices) yield creatures(i + 1)).apply(0) 24 val u5 = u0.toint match { 25 case i if i <= BareGround.max => BareGround.min 26 case i if i <= Spots.max => Spots.min 27 case i if i <= Thin.max => Thin.min 28 case _ => Thick.min 29 } 30 val u6 = (new SnowStatus(42, 100)).min 31 val u7 = snowdec24("lund")(2010).min!= 0 32 val u8 = snowdec24("haparanda")(2013).max 33 val u9 = scala.util.try{ creatures(42).length }.getorelse(42) 34 val u10 = test("true")

3(8) Vid kompileringsfel sätt kryss. Vid exekveringsfel sätt kryss. Ange statisk typ som kompilatorn härleder om ej kompileringsfel eller exekveringsfel. Ange dynamiskt värde som tilldelas vid exekvering om ej kompileringsfel eller exekveringsfel. u0 Double 42.0 u1 u2 u3 u4 u5 u6 u7 u8 u9 u10

4(8) Del B. Skriva kod. Totalt 80p. Uppgift B1: Matris, totalt 22p. (get, 10p; update, 12p) Klassen Crossword hanterar en matris med tecken och användas för att konstruera korsord så här: 1 scala> val c = new Crossword(rows = 4, cols = 10) 2 c: Crossword = 3 ************ 4 * * 5 * * 6 * * 7 * * 8 ************ 9 scala> c.update(1,5,"gurka", Horizontal) // andra raden, sjätte kolumnen 10 res0: Boolean = true 11 scala> val u = (c.update(1,4,"tomat", Horizontal), c.update(0,9,"kaka", Vertical)) 12 u: (Boolean, Boolean) = (false,true) 13 scala> println(c) 14 ************ 15 * k* 16 * gurka* 17 * k* 18 * a* 19 ************ Implementera de metoder nedan som har???. Metoden get ska ge en sträng med med * på de positioner som eventuellt hamnar utanför matrisens indexgränser via användning av charat, som tar hand om all indexgränskontroll. Metoden update ska endast göra uppdatering om s passar enligt canfit. 1 sealed trait Direction 2 case object Horizontal extends Direction // vågrät riktning 3 case object Vertical extends Direction // lodrät riktning 4 5 class Crossword(val rows: Int, val cols: Int){ 6 private val xss = Array.fill(rows, cols)(' ') 7 8 def charat(row: Int, col: Int): Char = 9 if (row >=0 && col >= 0 && row < rows && col < cols) xss(row)(col) else '*' 10 11 /** Ger strängen på plats row, col med längd length i riktning dir. */ 12 def get(row: Int, col: Int, length: Int, dir: Direction): String =??? 13 14 def canfit(row: Int, col: Int, s: String, dir: Direction): Boolean = { 15 val current = get(row, col, s.length, dir) 16 current.indices.forall(i => current(i) == ' ' current(i) == s(i)) 17 } 18 19 /** Ändrar strängen på plats row, col i riktning dir till s om den passar. 20 * Returnerar true om updatering gjordes, annars false. */ 21 def update(row: Int, col: Int, s: String, dir: Direction): Boolean =??? 22 23 override def tostring = { 24 def rowstring(r: Int) = (-1 to cols).map(charat(r, _)).mkstring + "\n" 25 (-1 to rows).map(rowstring).mkstring 26 } 27 }

5(8) Uppgift B2: Registrering, totalt 34p. (fromstring, 4p; updated, 4p; statusof, 3p; studentids, 3p; labids, 2p; add, 12p; labstatuscount, 6p) Du ska implementera metoderna med??? i labreg nedan som hanterar registrering av status på laborationer. Användningen av labreg definieras av testprogrammet på nästa sida. Använd inbyggd sortering. 1 object labreg { 2 type LabId = String 3 type StudentId = String 4 5 sealed trait Status 6 case object Approved extends Status // godkänd 7 case object Residual extends Status // kompletteras 8 case object Postponed extends Status // uppskov 9 case object Missing extends Status // saknad eller okänd status 10 11 object Status { 12 val values = Vector[Status](Approved, Residual, Postponed, Missing) 13 14 /** Om s är "godkänd","kompletteras","uppskov" returneras motsvarande status: 15 * Approved, Residual, Postponed. I alla andra fall returneras Missing. */ 16 def fromstring(s: String): Status =??? 17 } 18 19 case class Student(id: StudentId, labstatus: Map[LabId, Status]){ 20 /** Returnerar en ny Student med uppdaterad labstatus */ 21 def updated(lab: LabId, status: Status): Student =??? 22 23 /** Returnerar status för laboration lab. Ger Missing om status saknas. */ 24 def statusof(lab: LabId): Status =??? 25 } 26 27 class LabReg { 28 import scala.collection.mutable 29 private val reg = mutable.map[studentid, Student]() 30 private val labs = mutable.set[labid]() 31 32 def apply(sid: StudentId): Student = reg(sid) 33 34 /** En sorterad vektor med alla studentidentiteter. */ 35 def studentids: Vector[StudentId] =??? 36 37 /** En sorterad vektor med alla laborationsidentiteter. */ 38 def labids: Vector[LabId] =??? 39 40 /** Uppdaterar status för en viss laboration för en viss student. 41 * Om sid saknas så registreras ny Student med lab -> status.*/ 42 def add(sid: StudentId, lab: LabId, status: Status): Unit =??? 43 44 /** Räknar för en viss laboration totala antalet förekomster av status. */ 45 def labstatuscount(lab: LabId, status: Status): Int =??? 46 } 47 }

6(8) I filen test-labdata.csv nedan finns kommaseparerad laborationsdata där varje rad innehåller en statusuppdatering med studentidentitet (unik per student), laborationsidentitet (unik per lab) och status: ab1234-s,w01-kojo,uppskov cd5678-s,w01-kojo,kompletteras ef9012-s,w01-kojo,??? ab1234-s,w03-blockmole,godkänd ab1234-s,w01-kojo,godkänd cd5678-s,w03-blockmole,kompletteras ef9012-s,w03-blockmole,godkänd gh3425-s,w03-blockmole,uppskov ab1234-s,w04-pirates,godkänd Följande huvudprogram används för att testa singelobjektet labreg: 1 object TestLabReg { 2 import labreg._ 3 4 def printreport(labreg: LabReg): Unit = { 5 val (labs, students) = (labreg.labids, labreg.studentids) 6 println("--- NUMBER OF LABS: " + labs.size) 7 for (lab <- labs) { 8 val row = Status.values.map(s => s + ":" + labreg.labstatuscount(lab, s)) 9 println(row.mkstring(s"$lab: ", " ", "")) 10 } 11 println("--- NUMBER OF STUDENTS: " + students.size) 12 for (stud <- students) { 13 val row = labs.map(lab => lab + ":" + labreg(stud).statusof(lab)) 14 println(row.mkstring(s"$stud: ", " ", "")) 15 } 16 } 17 18 def main(args: Array[String]): Unit = { 19 val labreg = new LabReg 20 val lines = scala.io.source.fromfile(args(0)).getlines 21 lines.foreach{ line => 22 val row = line.split(',').tovector 23 labreg.add(sid = row(0), lab = row(1), status = Status.fromString(row(2))) 24 } 25 printreport(labreg) 26 } 27 } Vid exekvering av TestLabReg med test-labdata.csv som argument ska följande utskrift ges: 1 --- NUMBER OF LABS: 3 2 w01-kojo: Approved:0 Residual:1 Postponed:0 Missing:3 3 w03-blockmole: Approved:0 Residual:1 Postponed:1 Missing:2 4 w04-pirates: Approved:0 Residual:0 Postponed:0 Missing:4 5 --- NUMBER OF STUDENTS: 4 6 ab1234-s: w01-kojo:missing w03-blockmole:missing w04-pirates:missing 7 cd5678-s: w01-kojo:residual w03-blockmole:residual w04-pirates:missing 8 ef9012-s: w01-kojo:missing w03-blockmole:missing w04-pirates:missing 9 gh3425-s: w01-kojo:missing w03-blockmole:postponed w04-pirates:missing

7(8) Uppgift B3. Sortering i Java. 24p Du ska implementera klassen HighScoreList, som hanterar en lista med spelresultat, enligt specifikationen på nästa sida. I Java-programmet HighScoreListTest nedan testas klassen HighScoreList. Klassen GameResult representerar poängresultatet för en spelare vid en viss spelomgång. 1 import java.util.arraylist; 2 3 public class HighScoreListTest { 4 public static void main(string[] args){ 5 HighScoreList hsl = new HighScoreList(); 6 hsl.insert(new GameResult("Sandra", 4242)); 7 hsl.insert(new GameResult("Anna", 4242)); 8 hsl.insert(new GameResult("Björn", 1042)); 9 hsl.insert(new GameResult("Patrik", 2242)); 10 hsl.insert(new GameResult("Roy", 2242)); 11 ArrayList<GameResult> tl = hsl.toplist(10); 12 for (GameResult gr : tl) { 13 System.out.println(gr); 14 } 15 } 16 } Klassen GameResult är implementerad enligt nedan: 1 public class GameResult { 2 private String name; 3 private int score; 4 5 public GameResult(String name, int score){ 6 this.name = name; 7 this.score = score; 8 } 9 10 public String getname(){ 11 return name; 12 } 13 14 public int getscore(){ 15 return score; 16 } 17 18 public String tostring(){ 19 return name + ": " + score; 20 } 21 } Då huvudprogrammet i HighScoreListTest körs ska följande utskrift ges: 1 Anna: 4242 2 Sandra: 4242 3 Patrik: 2242 4 Roy: 2242 5 Björn: 1042

8(8) Implementera klassen HighScoreList i Java enligt nedan specifikation. /** Skapar en tom lista med spelresultat. */ HighScoreList(); class HighScoreList /** Ger true om gr1 ordnas före gr2, annars false. Ordningen sker med avseende på högst poäng i första hand och bokstavsordning på namn i andra hand. */ static boolean isbefore(gameresult gr1, GameResult gr2); /** Sorterar in ett spelresultat gr på rätt plats i listan. */ void insert(gameresult gr); /** Returnerar en sorterad lista med de n stycken bästa spelresultaten. Om listan är kortare än n ges en sorterad lista med alla spelresultat. */ ArrayList<GameResult> toplist(int n); Krav och tips: Du ska implementera valfri sorteringsalgoritm från grunden och alltså inte använda inbyggd sortering. Din sorteringsalgoritm ska använda sig av isbefore. Bokstavsordning av strängar ges av jämförelse med compareto (se snabbreferens för Java). Det är lättast att hålla hela listan sorterad genom att sätta in nya spelresultat på rätt plats i insert, men det går även bra att åstadkomma en korrekt sortering av topplistan på andra sätt.