LUNDS TEKNISKA HÖGSKOLA Institutionen för datavetenskap Tentamen, EDAA20/EDA501 Programmering 2016 01 13, 08:00 13:00 Anvisningar: Denna tentamen består av tre uppgifter. Preliminärt ger uppgifterna 6 + 18 + 16 = 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
2(5) Bakgrund och indata En kursansvarig lärare i programmering har gjort en enkät bland sina studenter om deras förkunskaper. Du ska skriva kod som hjälper läraren att analysera enkäten. De uppgifter du ska göra finns på sista sidan i tentamen men läs igenom alla beskrivningar och exempel i hela tentamen och se till att du verkligen förstår hur alla klasser hänger ihop innan du börjar lösa uppgifterna! Läraren har genomfört enkäten med hjälp av en molntjänst. Följande frågor har ställts: 1. Vilken är din STIL-identitet? 2. Vilket är ditt förnamn? 3. Vilket är ditt efternamn? 4. Vilket program går du? 5. 6. Om Ja, vilket programspråk har du använt mest? Från molntjänsten levereras en textfil vid namn data.csv med nedan innehåll. eko13rsv,robin,svensson,w,nej dat15kbo,kim,bengtsson,d,ja,python dat15evl,edvard,persson,d,nej eko13nin,nils,nilsson,w,nej dat14nni,nils,nilsson,d,ja,java dat15was,walter,skogsbäck,d,ja,python dat15svs,sverker,smith,d,nej dat15ame,angela,merkel,d,ja,c++ eko13aki,anna,kindberg,w,ja,java dat15stl,stefan,löfven,d,ja,java dat15ggr,gusten,grodslukare,d,ja,java dat15odc,oddput,clementin,d,nej dat15vio,viktor,oval,d,nej dat15stt,stina,triangelsson,d,ja,cobol Varje rad motsvarar ett enkätsvar från en person. Raderna består av svarskolumner separerade av ett komma. De personer som svarat Nej på näst sista frågan har ett färre antal kolumner. Textfilen är indata till lärarens program. Huvudprogram och utdata Läraren vill få reda på antal och procentfördelning gällande programtillhörighet, förkunskaper och programspråk för alla program. Läraren vill även för varje program få en separat lista med de som svarat och även se hur det skiljer sig i förkunskaper mellan programmen. För att åstadkomma detta har läraren skrivit ett program, som använder följande klasser: Klassen StudentSurvey har hand om det som är specifikt för just denna enkät. Klassen Survey är en generell enkätklass med metoder för registrering och utskrift. Klassen Table kan lagra och filtrera enkätsvar i tabellform. En tabell består av rader, där varje rad motsvarar ett enkätsvar som i textfilen ovan. Klassen Row lagrar en rad med texter. En rad kan bestå av flera strängar. Varje enskild sträng motsvarar ett svar på en delfråga i exemplet ovan. Kommatecknet som separerar svaren i textfilen ovan lagras ej.
3(5) Lärarens huvudprogram ser ut som följer. public static void main(string[] args) { ArrayList<String> lines = readlinesfromfile("data.csv"); Table input = new Table(lines, ","); StudentSurvey survey = new StudentSurvey(input); StudentSurvey surveyd = new StudentSurvey(input.filter(StudentSurvey.PROGRAM, "D")); StudentSurvey surveyw = new StudentSurvey(input.filter(StudentSurvey.PROGRAM, "W")); StudentSurvey surveyyes = new StudentSurvey(input.filter(StudentSurvey.PROGRAMMED, "Ja")); System.out.println("*** ALLA ***"); survey.printprogramstatistics(); survey.printprogrammedstatistics(); surveyyes.printlanguagestatistics(); System.out.println("\n*** W-programmet ***"); surveyw.printparticipants(); surveyw.printprogrammedstatistics(); System.out.println("\n*** D-programmet ***"); surveyd.printparticipants(); surveyd.printprogrammedstatistics(); Metoden public static ArrayList<String> readlinesfromfile(string filename), är redan implementerad av läraren och tar hand om inläsningen av textraderna från fil. När huvudprogrammet ovan körs ska det ge följande utskrift (kolumnerna nedan ska egentligen skrivas efter varandra, men texten är här uppdelad för att inte slösa med papper): *** ALLA *** Vilket program går du? W 3 21% D 11 78% Ja 8 57% Nej 6 42% Vilket programspråk har du använt mest? Java 4 50% C++ 1 12% OTHER 3 37% *** W-programmet *** STIL ID Namn eko13rsv Svensson, Robin eko13nin Nilsson, Nils eko13aki Kindberg, Anna Ja 1 33% Nej 2 66% *** D-programmet *** STIL ID Namn dat15kbo Bengtsson, Kim dat15evl Persson, Edvard dat14nni Nilsson, Nils dat15was Skogsbäck, Walter dat15svs Smith, Sverker dat15ame Merkel, Angela dat15stl Löfven, Stefan dat15ggr Grodslukare, Gusten dat15odc Clementin, Oddput dat15vio Oval, Viktor dat15stt Triangelsson, Stina Ja 7 63% Nej 4 36% Klassen StudentSurvey och specifikationer av Survey, Row och Table Läraren har också skapat specifikationer av klasserna Survey, Row och Table. Klassen Survey använder klassen Table som i sin tur använder klassen Row. Genom arv kan Survey utökas med specifika enkätmetoder och data. Läraren har, speciellt för denna förkunskapsenkät, implementerat klassen StudentSurvey. Du ska implementera klasserna Survey, Row och Table (se uppgifterna på sista sidan i tentamen).
4(5) public class StudentSurvey extends Survey { public static final int STIL = 0; public static final int NAME1 = 1; public static final int NAME2 = 2; public static final int PROGRAM = 3; public static final int PROGRAMMED = 4; public static final int LANGUAGE = 5; public StudentSurvey(Table data) { super(data); public void printparticipants() { System.out.println("\nSTIL ID Namn"); for (int row = 0; row < data.getnumberofrows(); row++) { System.out.println(data.get(row, STIL) + " " + data.get(row, NAME2) + ", " + data.get(row, NAME1)); public void printprogramstatistics() { System.out.println("\nVilket program går du?"); String[] param = {"W","D"; printregistration(program, param); public void printprogrammedstatistics() { System.out.println("\n"); String[] param = {"Ja","Nej"; printregistration(programmed, param); public void printlanguagestatistics() { System.out.println("\nVilket programspråk har du använt mest?"); String[] param = {"Java","C++"; printregistration(language, param); /** Skapar en ny enkät utifrån tabellen data. */ Survey(Table data); /** Registrerar förekomst av värdena values i kolumnen col. * Returnerar en heltalsvektor där sista elementet innehåller antalet * övriga värden som inte förekommer i values. */ int[] register(int col, String[] values); /** Skriver ut statistik över förekomsten av värdena i values i kolumnen col. * För varje värde i values och för övriga värden skrivs en rad med värdet, * frekvensen och procentandelen. Se utskriftsexempel på sid. 3. */ void printregistration(int col, String[] values); /** Skapar en rad med strängar från s. Radens strängar skapas genom att s * delas upp baserat på separatorn delimiter. Separatorn lagras ej. */ Row(String s, String delimiter); /** Returnerar strängen på plats col, räknat från 0 till size()-1. * Om col indexerar utanför gränserna returneras en tom sträng. */ String get(int col); /** Returnerar antalet strängar som denna rad innehåller. */ int size();
5(5) /** Skapar en tom tabell. */ Table(); /** Skapar en tabell med data utifrån rader i lines. Värdena på varje rad * avgränsas med separatorn delimiter */ Table(ArrayList<String> lines, String delimiter); /** Returnerar maxbredden (det maximala antalet kolumner bland alla rader). */ int getmaxwidth(); /** Returnerar antalet rader i tabellen. */ int getnumberofrows(); /** Returnerar strängen på rad row och kolumn col räknat från 0. * Om row eller col indexerar utanför gränserna returneras en tom sträng. */ String get(int row, int col); /** Lägger till raden r sist i tabellen. */ void append(row r); /** Sätter in raden r på plats pos i tabellen (efterföljande rader flyttas). */ void insert(int pos, Row r); /** Returnerar en ny tabell som enbart innehåller de rader som har värdet value * i kolumnen col. */ Table filter(int col, String value); Uppgift 1. Implementera klassen Row. Använd metoden split som finns i klassen String (se snabbreferensen). Vid anrop av split(",") på strängen "hej,på,dej" skapas denna strängvektor: 0 1 2 hej på dej Uppgift 2. Implementera klassen Table. Du ska använda en ArrayList för att lagra tabellens rader. Uppgift 3. Implementera klassen Survey. Metoden printregistration ska använda metoden register. Antag att man anropar register med följande argument för att registrera värdena i sjätte kolumnen i tabellen i surveyyes på sidan 3: String[] param = {"Java","C++"; register(5, param); Då tolkas innehållet i följande returvektor enligt nedan: 0 1 2 4 1 3 På plats 0 registrerades 4 förekomster av Java, på plats 1 registrerades 1 förekomst av C++, och på plats 2 registrerades 3 förekomster av övriga värden. Totalt registrerades 8 värden. Vid utskrift i printregistration ska du förutsätta att kolumntexterna är tillräckligt korta för att det ska räcka med att separera dessa med ett tabulatortecken \t för automatisk kolumnutjämning. Procentandelar ska anges som heltal utan avrundning. Exempel: Om du någonstans inne i en loop går igenom några tidigare deklarerade vektorer, i detta exempel kallade values och reg, och du tidigare har beräknat percentage, kan statistikutskriften för en rad göras så här: System.out.println(values[i] + "\t" + reg[i] + "\t" + percentage + "%");