LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Tentamen, EDA011/EDA017 Programmeringsteknik BME C E F I N Pi 2016 06 02, 8.00 13.00 Anvisningar: Preliminärt ger uppgifterna 6 + 17 + 16 + 6 = 45 poäng. För godkänt betyg krävs 22, 5 poäng. Tillåtet hjälpmedel: Java-snabbreferens. Lösningsförslag kommer att finnas på kursens hemsida senast dagen efter tentamen. Resultatet läggs in i Ladok när rättningen är klar och anslås inte på anslagstavlan. Tentamensvillkor: 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.
2(5) 1. Historiker och litteraturvetare använder ibland datorbaserade metoder för att få översiktlig information om stora textmassor. Genom att exempelvis räkna förekomster av ortnamn (och liknande) kan man skapa sig en uppfattning om den geografi som beskrivs i texten. 1 Med en sådan metod kan vi undersöka Selma Lagerlöfs bok Nils Holgerssons underbara resa genom Sverige och räkna förekomster av landskapens namn. På så sätt kan vi förstå något om den bild av Sverige som tecknas i boken. Lagerlöfs bok gavs ut 1906 1907, under den nationalromantiska perioden, då många av 1900-talets föreställningar om den svenska nationen tog form. Inledningsvis behöver vi en klass för att hålla reda på ett ord och antalet gånger det förekommer. Klassen WordCount har följande specifikation: /** Skapar ett objekt som håller reda på förekomster av ordet word. Inledningsvis har ordet 0 (noll) förekomster. */ WordCount(String word); /** Tar reda på vilket ord som räknas. */ String getword(); /** Ökar antalet förekomster med 1. */ void inccount(); /** Tar reda på antalet förekomster. */ int getcount(); /** Returnerar en sträng som beskriver ordet och dess förekomster, på formen "xyzzy: 57" (om ordet "xyzzy" förekommit 57 gånger) */ String tostring(); Uppgift: Implementera klassen WordCount. Exempel: Följande satser WordCount w = new WordCount("Södermanland"); w.inccount(); w.inccount(); System.out.println(w.toString()); ger utskriften Södermanland: 2 1 Ett intressant exempel på en sådan historisk undersökning, större än vad vi har möjlighet att göra här, är: Cameron Blevins, Space, Nation, and the Triumph of Region: A View of the World from Houston : Journal of American History, vol. 101, no. 1, 2014.
3(5) 2. När vi undersöker en text, som Lagerlöfs bok, räknar vi alltså förekomster av platser. Vi behöver vi då klassen LocationTable: /** Skapar en tabell av platser och deras antal. Parametern locations anger vilka ord (platser) som ska räknas. Orden i locations förutsätts vara unika. */ LocationTable(String[] locations); /** Undersöker ordet w. Om ordet förekommer i tabellen ökas ordets antal med 1. */ void inspectword(string w); /** Läser text från en Scanner, ord för ord. Om ett läst ord förekommer i tabellen ökas dess antal med 1. */ void readtext(scanner textscanner); /** Skriver ut de 5 vanligast förekommande platserna, angivna i fallande ordning efter förekomst. För varje plats anges antalet förekomster. Om tabellen innehåller färre än 5 platser så skrivs alla ut. */ void printtop5(); Uppgift: Implementera klassen LocationTable utifrån följande anvisningar: Använd en lista av WordCount-objekt. Du ska inte ha någon vektor som attribut. Texternas ord skiljs av mellanslag eller radmatning. Använd Scanner-metoden next. Du behöver inte ta hänsyn till punkt, komma, citationstecken och liknande. (Dessa tecken antas ha filtrerats bort då boken lästs in från början.) Din lösning ska inte använda någon av Javas standardklasser för sortering, som Arrays.sort eller Collections.sort. Exempel. I följande program skapas ett LocationTable-objekt för de svenska landskapen och Lagerlöfs bok läses in. Information om de fem mest förekommande landskapen skrivs ut. public class HolgerssonLocations { public static void main(string[] args) { String[] locations = { "Blekinge", "Bohuslän", "Dalarna", "Dalsland", "Gotland", "Gästrikland", "Halland", "Hälsingland", "Härjedalen", "Jämtland", "Lappland", "Medelpad", "Norrbotten", "Närke", "Skåne", "Småland", "Södermanland", "Uppland", "Värmland", "Västerbotten", "Västergötland", "Västmanland", "Ångermanland", "Öland", "Östergötland" ; try { LocationTable counter = new LocationTable(locations); // Bokens text finns i 99 textfiler lagerlof1.txt.. lagerlof99.txt for (int i = 1; i <= 99; i++) { Scanner s = new Scanner(new File("lagerlof" + i + ".txt")); counter.readtext(s); counter.printtop5(); catch (FileNotFoundException e) { System.out.println("filerna kunde inte läsas"); Resultat: 2 Skåne: 53 Småland: 38 Lappland: 36 Uppland: 25 Västergötland: 21 2 Gränstrakterna (Skåne, Lappland) nämns alltså relativt ofta. Norge, som lämnat unionen med Sverige året innan (1905), nämns däremot endast en gång. Kanske var det viktigt att visa att Sverige ännu var rätt stort?
4(5) 3. Vi ska nu ta fram information om boken på ett annat sätt. Genom att räkna alla ord, inte bara platser, kan vi skapa oss en uppfattning om bokens innehåll. Vi måste emellertid utesluta vissa vanliga ord, som och, ett och att, för att få ett meningsfullt resultat. Vi behöver alltså återigen en tabell av ord, men nu för att räkna alla ord, utom ett antal undantagsord. Klassen WordTable hanterar en sådan tabell: /** Skapar en ordtabell. Ett antal undantagsord, som inte ska räknas, läses in från scannern exclusions. Dessa undantagsord förutsätts vara unika. */ WordTable(Scanner exclusions); /** Undersöker ordet w. Om ordet är ett undantagsord görs ingenting. Annars: - Om ordet inte finns tidigare läggs det in i tabellen. - Antal förekomster för ordet ökar med 1. */ void inspectword(string w); /** Läser text från en Scanner, ord för ord. Varje ord undersöks enligt reglerna i kommentaren för inspectword. */ void readtext(scanner textscanner); /** Skriver ut de 5 vanligast förekommande orden, angivna i fallande ordning efter förekomst. För varje ord anges antalet förekomster. Om tabellen innehåller färre än 5 ord så skrivs alla ut. */ void printtop5(); Uppgift: Implementera klassen WordTable utifrån följande anvisningar: Om du väljer dina attribut väl så blir ett par av metoderna identiska med motsvarande i uppgift 2. Då behöver du inte visa implementationen av dessa metoder, utan kan istället skriva // se lösning 2 Stora/små bokstäver ska behandlas lika ( pojken och Pojken anses vara samma ord). Följande metod i klassen String returnerar strängen översatt till gemener (små bokstäver): String tolowercase(); Exempel. I följande program skapas ett WordTable-objekt. Ett antal undantagsord ( och, ett, att osv.) läses från en fil. Lagerlöfs bok läses sedan in och de fem mest förekommande orden skrivs ut. public class HolgerssonWords { public static void main(string[] args) { try { Scanner exclusions = new Scanner(new File("undantagsord.txt")); WordTable counter = new WordTable(exclusions); for (int i = 1; i <= 99; i++) { Scanner s = new Scanner(new File("lagerlof" + i + ".txt")); counter.readtext(s); counter.printtop5(); catch (FileNotFoundException e) { System.out.println("filerna kunde inte läsas"); Resultat: 3 pojken: 1019 vildgässen: 298 akka: 287 skogen: 246 hörde: 205 3 Resultatet säger något om boken. Ledargåsen Akka är döpt efter ett lappländskt fjällmassiv, och pojken kommer från Skåne. Kanske skymtar även nationalromantikens fascination för den vilda naturen i orden skogen och vildgässen?
5(5) 4. Som du nog upptäckt är de båda klasser du konstruerat i uppgift 2 och 3 delvis väldigt lika. För att undvika duplicerad kod vill vi införa en ny klass Table, som beskriver det som är gemensamt för LocationTable och WordTable. Vi ska därefter skissa ett sätt att implementera LocationTable och WordTable med hjälp av Table. Uppgiften ska lösas med hjälp av arv. Anvisningar: Metoderna (förutom konstruktorerna) i denna uppgift kommer att vara likadana som metoder i tidigare uppgifter. Det räcker därför att du, för varje metod, hänvisar till en tidigare implementerad metod. Om du exempelvis vill ange att en metod m ska vara likadan som metoden m i uppgift 3 kan du skriva:... public void m(int a) // se lösning 3... Läs igenom båda uppgifterna nedan innan du börjar. För full poäng på uppgift (a) och (b) krävs angiven superklass (i förekommande fall), deklarerade attribut, implementerade konstruktorer, hänvisning till metodernas implementation (enligt exemplet m ovan), samt lämplig användning av public, protected och private. a) Implementera klassen Table. b) Implementera klasserna LocationTable och WordTable, på ett sådant sätt att du återanvänder koden i Table. Detalj från svensk 20-kronorssedel, i bruk 1991 2016. Nils Holgersson åker på den vita tamgåsen. Längst fram flyger ledargåsen Akka.