LUNDS TEKNISKA HÖGSKOLA Institutionen för datavetenskap Tentamen Programmeringsteknik för BME, C, D, E, F, I, N & Pi EDA011 / EDA016 / EDA017 2016 01 13, 08:00 13:00 Anvisningar: Preliminärt ger uppgifterna 6 + 23 + 16 = 45 poäng. För godkänt betyg krävs 22,5 poäng. Tillåtet hjälpmedel: snabbreferens för Java. Läs igenom hela tentamen och skapa dig en förståelse för hur alla klasser hänger ihop innan du sätter igång. De uppgifter du ska göra finns på sista sidan i tentamen. Tveka inte att fråga om något är oklart. 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. 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. Läraren har genomfört enkäten med hjälp av en molntjänst. Följande frågor har ställts: (1) Vad är din STIL-identitet? (2) Vad är ditt förnamn? (3) Vad ä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 följande 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. 1
2(5) 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, efternamnssorterad 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, sortera 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. 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, ","); Table sorted = input.sort(studentsurvey.name2); StudentSurvey survey = new StudentSurvey(sorted); StudentSurvey surveyd = new StudentSurvey(sorted.filter(StudentSurvey.PROGRAM, "D")); StudentSurvey surveyw = new StudentSurvey(sorted.filter(StudentSurvey.PROGRAM, "W")); StudentSurvey surveyyes = new StudentSurvey(sorted.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 eko13aki Kindberg, Anna eko13nin Nilsson, Nils eko13rsv Svensson, Robin Ja 1 33% Nej 2 66% *** D-programmet *** STIL ID Namn dat15kbo Bengtsson, Kim dat15odc Clementin, Oddput dat15ggr Grodslukare, Gusten dat15stl Löfven, Stefan dat15ame Merkel, Angela dat14nni Nilsson, Nils dat15vio Oval, Viktor dat15evl Persson, Edvard dat15was Skogsbäck, Walter dat15svs Smith, Sverker dat15stt Triangelsson, Stina Ja 7 63% Nej 4 36%
3(5) 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. 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); Survey /** Skapar en ny enkätanalys 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. 2. */ void printregistration(int col, String[] values);
4(5) Row /** 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(); Table /** 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). Om tabellen är tom returneras 0. */ 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); /** Skapar en ny tabell sorterad i bokstavsordning enligt kolumnen col. */ Table sort(int col);
5(5) 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 vektor: 0 1 2 hej på dej Uppgift 2. Implementera klassen Table. Sorteringen görs lämpligen genom insättningssortering till en ny Table med hjälp av metoden insert. Jämför strängars sorteringsordning med metoden compareto i klassen String (se snabbreferensen). Du behöver ej göra någon specialhantering av svenska tecken. 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 2: 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 (närmast lägre) heltal. 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 + "%");