LUNDS TEKNISKA HÖGSKOLA 1(4) Institutionen för datavetenskap Tentamen, EDAA20/EDA501 Programmering 2011 10 19, 8.00 13.00 Anvisningar: Denna tentamen består av fem uppgifter. Preliminärt ger uppgifterna 11 + 8 + 8 + 2 + 11 = 40 poäng. För godkänt betyg krävs 20 poäng. Tillåtet hjälpmedel: Java-snabbreferens. Lösningsförslag kommer att finnas på kursens hemsida senast dagen efter tentamen. När rättningen är klar meddelas detta på kursens hemsida. Tentamensvillkor för EDA501: 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. 1. Klassen Article (se specifikation nedan) beskriver en tidskriftsartikel. Klassen är tänkt att användas i ett program där man kan söka efter artiklar. Varje artikel har ett eller flera nyckelord som ger en uppfattning om vad artikeln handlar om. Exempel: Artikeln När lämmeltåget spårar ur från tidskriften Forskning och framsteg från år 2011 skulle kunna ha nyckelorden lämmel, lämmeltåg, populationscykel och fjäll. Vid sökning efter artiklar anger man några nyckelord och får en lista över de artiklar som innehåller nyckelorden. Din uppgift är att implementera klassen Article. Ledning: Nyckelorden bör lagras i en lista. Använd klassen ArrayList för detta. Om du vill får du gärna använda metoden contains för att söka i denna lista (se Java snabbreferens). Article /** Skapar en artikel med titeln title, författaren author, tidskriften journal och publiceringsåret year. */ Article(String title, String author, String journal, int year); /** Returnerar titeln. */ String gettitle(); /** Lägger till nyckelordet word till artikeln om det inte redan finns. */ void addkeyword(string word); /** Returnerar true om alla orden i listan words ingår bland artikelns nyckelord, annars false. */ boolean allkeywordsmatch(arraylist<string> words); /** Returnerar en sträng som innehåller titel, författare, tidskrift och publiceringsår med blanktecken emellan. */ String tostring();
2(4) 2. I den här uppgiften ska du implementera klassen ArticleSearcher som innehåller en metod för att söka efter artiklar: ArticleSearcher /** Skapar ett objekt som kan användas för att söka efter artiklar i registret articles. */ ArticleSearcher(ArticleRegister articles); /** Returnerar en lista med alla artiklar för vilka det gäller att alla orden i listan words ingår bland artikelns nyckelord. */ ArrayList<Article> findmatchingarticles(arraylist<string> words); Artiklarna hämtas från ett objekt av typen ArticleRegister. Klassen ArticleRegister är färdigskriven (du ska alltså inte implementera den). Klassen ArticleRegister fungerar på motsvarande sätt som t.ex. klassen Scanner med metoder hasnext och next som används för att ta reda på om det finns fler artiklar att hämta respektive för att hämta nästa artikel. För att man ska kunna starta hämtningen från början finns det även en metod reset. ArticleRegister /** Skapar ett objekt som håller reda på artiklar. Information om artiklarna läses från filen filename. */ ArticleRegister(String filename); /** Returnerar true om det finns fler artiklar att hämta, annars false. */ boolean hasnext(); /** Hämtar nästa artikel. */ Article next(); /** Återställer objektet, d.v.s. gör så att man vid nästa anrop av next börjar om och hämtar den första artikeln. */ void reset(); 3. Skriv ett huvudprogram som låter en användare skriva in ett valfritt antal sökord och som därefter skriver ut de artiklar för vilka det gäller att alla de inlästa orden ingår bland artikelns nyckelord. Filen med artiklarna har namnet artikeldata.txt. Se till att att ditt program skriver ut ordentliga hjälptexter så att användaren vet vad som ska skrivas på tangentbordet.
3(4) 4. Betrakta följande klasser: public class Person { private String name; public Person(String name) { this.name = name; public void setname(string name) { this.name = name; public String tostring() { return name; public class PersonHandler { public static void changename1(person p, String s) { p = new Person(s); public static void changename2(person p, String s) { p.setname(s); public class Main { public static void main(string[] args) { Person p1 = new Person("Lisa"); PersonHandler.changeName1(p1, "Mona"); System.out.println(p1); Person p2 = new Person("Bo"); PersonHandler.changeName2(p2, "Kalle"); System.out.println(p2); Vad skrivs ut när man kör programmet Main? Förklara vad som händer.
4(4) 5. En transportfirma ska lasta varor i en container. Varorna är packade i kartonger med standardmått: alla kartonger är lika breda och djupa, men de kan ha olika höjd. Containern är indelad i ett antal fack som är lika breda och djupa som kartongerna. En container med fem fack kan se ut så här när den är färdigpackad (de grå rutorna är kartongerna, siffrorna under containern är fackens nummer, siffrorna till vänster är höjden): Här har man packat 12 kartonger (1 med höjden 5, 2 med höjden 4, 5 med höjden 3, 3 med höjden 2 och 1 med höjden 1), och den totala höjden har blivit 8. Man vill att den totala höjden ska bli så liten som möjligt, och man packar därför kartongerna i storleksordning, med de största först, och lägger varje kartong i det fack som har mest plats. Kartongerna, facken i containern och containern beskrivs av följande klasser (bara de operationer som är intressanta i denna uppgift har tagits med): Box /** Tar reda på kartongens höjd. */ int getheight(); // Används inuti Bin Bin /** Skapar ett tomt fack. */ Bin(); /** Tar reda på kartongernas totala höjd i facket. */ int getheight(); /** Lägger kartongen b överst i facket. */ void put(box b); Container /** Skapar en container med nbrbins fack. */ Container(int nbrbins); /** Packar containern med kartongerna i vektorn boxes. Kartongerna är sorterade efter avtagande höjd. */ void pack(box[] boxes); Implementera klassen Container. Använd den beskrivna metoden för att packa kartongerna. Du ska naturligtvis utnyttja klasserna Box och Bin, som är färdigskrivna.
LUNDS TEKNISKA HÖGSKOLA 1(3) Institutionen för datavetenskap Lösningsförslag till tentamen i EDAA20/EDA501 2011 10 19 1. public class Article { private String title; private String author; private String journal; private int year; private ArrayList<String> keywords; /** Skapar en artikel med titeln title, författaren author, tidskriften journal och publiceringsåret year. */ public Article(String title, String author, String journal, int year) { this.title = title; this.author = author; this.journal = journal; this.year = year; keywords = new ArrayList<String>(); /** Returnerar titeln. */ public String gettitle() { return title; /** Lägger till nyckelordet word till artikeln om det inte redan finns. */ public void addkeyword(string word) { if (!keywords.contains(word)) { keywords.add(word); /** Returnerar true om alla orden i listan words ingår bland artikelns nyckelord, annars false. */ public boolean allkeywordsmatch(arraylist<string> words) { for (int i = 0; i < words.size(); i++) { if (!keywords.contains(words.get(i))) { return false; return true; /** Returnerar en sträng som innehåller titel, författare, tidskrift och publiceringsår med blanktecken emellan. */ public String tostring() { return title + " " + author + " " + journal + " " + year;
2(3) 2. public class ArticleSearcher { private ArticleRegister articles; /** Skapar ett objekt som kan användas för att söka efter artiklar i registret articles. */ public ArticleSearcher(ArticleRegister articles) { this.articles = articles; /** Returnerar en lista med alla artiklar för vilka det gäller att alla orden i listan words ingår bland artikelns nyckelord. */ public ArrayList<Article> findmatchingarticles(arraylist<string> words) { ArrayList<Article> list = new ArrayList<Article>(); articles.reset(); while (articles.hasnext()) { Article a = articles.next(); if (a.allkeywordsmatch(words)) { list.add(a); return list; 3. public class ArticleSearchMain { public static void main(string[] args) { ArticleRegister reg = new ArticleRegister("artikeldata.txt"); ArticleSearcher search = new ArticleSearcher(reg); ArrayList<String> wordlist = new ArrayList<String>(); Scanner scan = new Scanner(System.in); System.out.println("Skriv ett antal nyckelord. Avsluta med!"); String word = scan.next(); while (! word.equals("!")) { wordlist.add(word); word = scan.next(); System.out.println("Följande artiklar innehåller nyckelorden:"); ArrayList<Article> list = search.findmatchingarticles(wordlist); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); Det finns flera olika sätt att lösa problemet med hur användaren avslutar inläsningen av ord. I lösningen ovan skriver användaren in ett utropstecken sist efter orden för att markera slut på orden. Man kan också be användaren att först skriva in antal ord och därefter orden. I detta fall kan en for-sats användas för inläsningen. Ytterligare en variant är att använda hasnext.
3(3) 4. Utskriften från programmet ser ut så här: Lisa Kalle Förklaring till att Lisa skrivs ut (och inte Mona ): När referensen p1 skickas med som parameter till metoden changename1, kopieras den till p. p refererar alltså först till samma objekt som p1 (Lisa). Inuti metoden får sedan referensen p ett nytt värde. Den refererar nu till ett annat Person-objekt. Men p1 ändras inte. Förklaring till att Kalle skrivs ut: Som ovan, p2 kopieras till p. p refererar alltså till samma objekt som p2 (Bo). I metoden anropas sedan metoden changename2 för den person som p refererar till. Det resulterar i att denna person får nytt namn, Kalle. Därför kommer Kalle att skrivas ut. 5. public class Container { private Bin[] bins; /** Skapar en container med nbrbins fack */ public Container(int nbrbins) { bins = new Bin[nbrBins]; for (int i = 0; i < bins.length; i++) { bins[i] = new Bin(); /** Packar containern med kartongerna i vektorn boxes. Kartongerna är sorterade efter avtagande höjd. */ public void pack(box[] boxes) { for (int i = 0; i < boxes.length; i++) { int index = indexofsmallestbin(); bins[index].put(boxes[i]); /* Tar reda på numret på facket med minst höjd. */ private int indexofsmallestbin() { int min = Integer.MAX_VALUE; int minindex = -1; for (int i = 0; i < bins.length; i++) { int height = bins[i].getheight(); if (height < min) { min = height; minindex = i; return minindex;