UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Prøveeksamen i : INF1000 Grunnkurs i objektorientert programmering Eksamensdag : Onsdag 21. November 2012 Tid for prøveeksamen : 12-16 Oppgavesettet er på: 5 sider Vedlegg : Ingen Tillatte hjelpemidler : Alle trykte og skrevne Les nøye gjennom hver oppgave før du løser den. For hver oppgave er angitt det maksimale antall poeng du kan få hvis du svarer helt riktig. Dersom du savner opplysninger i oppgaven, kan du selv legge dine egne forutsetninger til grunn og gjøre rimelige antagelser, så lenge de ikke bryter med oppgavens "ånd". Gjør i så fall rede for forutsetningene og antagelsene du gjør. Det er naturligvis fullt mulig å bruke en PC når du løser denne oppgaven. Vi vil imidlertid fraråde deg dette, ettersom poenget med prøveeksamen er å trene til den virkelige eksamen og skape en situasjon som ligger så tett opp til den virkelige eksamen som mulig. Oppgave 1 (10 poeng) Er disse programlinjene lovlige i Java? JA NEI double x = (int) (2+null); String s = 3.141 + 5 ; String s = 3.141 + 2.718; double i = 0++; String[] t = { a, b, c ; double z = (double) 3.14 ; while (3 < 10) {System.out.println( 3<10 ) String s = 10 + 20 + 30 + 40 ; double[][] x = double[4][11]; int i = 0; System.out.print( i =, i); Oppgave 2 (20 poeng) a) Hvor mange ganger blir «X» skrevet ut her: for (int i=498; i<1499; i++) { 1
b) Hvor mange ganger blir «X» skrevet ut her: int i = 0; int j = 100; while (i < j++) { i = i + 2; c) Hva mange ganger blir «X» skrevet ut her? for (int i=0; i<10; i++) { for (int j=0; j<10; j++) { for (int k=0; k<10; k++) { if (i == k) { System.out.print("X"); d) Hvor mange ganger blir «X» skrevet ut her: int[] k = {2,3,5,7,11,13; for (int i=0; i<5; i++) { for (int j=k[i]; j<k[i+1]; j++) { Oppgave 3 (5 poeng) Anta at følgende metode er definert (arrayene x og y antas å ha samme lengde): int konv (int[] x, int[] y) { int z = 0; for (int i=0; i<z.length; i++) { z += x[i] * y[y.length-i-1]; return z; og at følgende programsetninger utføres (anta at de er plassert slik at metoden over er synlig): int[] x = {1,2,3; int[] y = {4,5,6; System.out.println("Verdi: " + konv(x,y)); Hva skrives ut i siste linje ovenfor? 2
Oppgave 4 (15 poeng) Skriv ferdig metoden String expand(string s, int[] k) {... som har som argument en tekststreng s og en heltallsarray k som skal ha samme lengde som antall tegn i s. Metoden skal returnere en tekststreng med samme tegn som i s (og i samme rekkefølge), men hvor hvert tegn forekommer like mange ganger som angitt i arrayen k. Eksempel på bruk: int[] k = {2,3,1,5; String txt = expand( ABCD, k); System.out.println(txt); Det som skrives ut overfor er da AABBBCDDDDD. Du kan anta at arrayen k har riktig lengde og trenger ikke å håndtere feilsituasjoner. Oppgave 5 (20 poeng) Firmaet Lur & Drei har spesialisert seg på å selge såkalte helsepiller og har samlet inn data over et helt år som viser hvor mange piller de solgte hver av dagene i året. Disse dataene ligger i en array int[][] antallpiller = new int[12][31]; Hver rad svarer til en måned (jan, feb,..., des) og hver kolonne svarer til en dag (1, 2, 3,..., 31). Dermed er f.eks. antallpiller[0][0] antall piller som ble solgt 1. januar, mens antallpiller[11][30] er antall piller som ble solgt 31. desember. De datoene som ikke finnes (f.eks. 30. februar) inneholder verdien -1. For enkelhets skyld kan du tenke deg at det også er deklarert en array String[] maaned = {"Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"; Begge arrayene ovenfor er deklarert som objektvariabler i toppen av klassen som vi tenker oss skal brukes til å implementere systemet, og du kan fritt referere til dem når du programmerer nedenfor. Din oppgave er å skrive en metode som kan kalles slik: skrivoversikt(); og som skriver ut på skjermen en passe overskrift, og deretter en linje pr måned som angir hvor mange piller det ble solgt den måneden og gjennomsnittlig antall piller solgt pr dag den måneden (avrundet til nærmeste heltall). Til slutt skal metoden skrive ut hvilken måned det ble solgt flest piller (eller en av dem, hvis det er flere). Utskriften kan se omtrent slik ut: Salgsstatistikk for Lur & Drei --------------------------------------- Januar : 5323 piller (gjennomsnitt: 172 piller pr dag) Februar : 2533 piller... Desember: 6233 piller Det ble solgt flest piller i juli (8363 piller). 3
Oppgave 6 (20 poeng) Brutopia er en stat som ledes av en troika (= gruppe på tre). Lederne er alltid innbyggere i landet. Brutopia har ialt 7 delstater, og hver av disse er igjen delt opp i et antall fylker (antallet fylker varierer fra 1 for den minste delstaten til 5 for den største). Hver delstat ledes av en regjering som består av 5-15 innbyggere fra delstaten. Hvert fylke har en fylkesstyre som består av 4 innbyggere i fylket. Hvert fylke har en befolkning på inntil 500.000 innbyggere. Hver av delstatene i Brutopia kan danne handelsallianser med så mange andre delstater i Brutopia som de ønsker. Tegn et UML-klassediagram med de følgende (Java-) klassene som kan brukes til å lage en UMLmodell av Brutopia: Troika, Stat, Delstat, Fylke, Delstatsregjering, Fylkesstyre, Innbygger og Handelsallianse. Gi navn på relasjonene mellom disse klassene slik det er beskrevet ovenfor og plassér antall på begge sider av hvert forhold. Gjør egne forutsetninger ved behov, men forklar isåfall disse. Oppgave 7 (60 poeng) Forelesereren i et begynnerkurs i programmering med Java har sett seg lei på at noen studenter kopierer andres besvarelser når de skal levere obligatorisk oppgave. For å foreta en første screening av alle oppgavene bestemmer hun seg for å få laget et program som sammenlikner hver oppgave med alle øvrige og regner ut en "avstand" mellom hvert par av oppgaver. Hvis avstanden er under en fastsatt grense, skal programmet rapportere dette, slik at foreleseren kan sjekke manuelt hvor like oppgavene egentlig er. Det er nå din oppgave å lage dette fullstendige programmet for foreleseren. Programmet skal først lese filen "Oppgaver.txt" som inneholder en rekke filnavn (atskilt av linjeskift). For eksempel kunne filen ha følgende innhold: Oblig2-per.java Oblig2-joanna.java Oblig2-vilde.java Deretter skal filen sammenlikne hver av filene med alle de øvrige. Med eksemplet overfor får vi ialt tre sammenlikner (den første mot de to neste, og den andre mot den siste) siden rekkefølgen ikke skal spille noen rolle. Sammenlikningen av to filer skal være basert på antall forekomster av spesielle tekststrenger i tekstene. Disse tekststrengene ligger i filen "Nokkelord.txt" (atskilt av blanke og/eller linjeskift). For eksempel kunne filen ha følgende innhold: int double String { ( new class Her er det ialt syv tekststrenger (eller nøkkelord) som skal benyttes ved sammenlikningen, men antallet kan variere. Selve sammenlikningen skal bestå i å ta (for hvert nøkkelord) differansen mellom antall forekomster i den ene filen og antall forekomster i den andre filen, og så summere opp absoluttverdiene av disse differansene over alle nøkkelord. Hvis dette resulterer i verdien 0 betyr det at hvert nøkkelord forekommer nøyaktig like mange ganger i de to filene som sammenliknes. Hvis verdien er større en 0, avviker de to filene fra hverandre i antall forekomster av minst ett nøkkelord. 4
Konkret: Programmet du skal skrive, bør begynne med å lese filen med alle nøkkelordene og legge disse inn i et String-array eller en HashMap slik at du senere kan slå opp et vilkårlig ord og finne ut om det er identisk med ett av nøkkelordene. Deretter leser du inn alle filene som skal sammenliknes, og under innlesingen av en fil teller programmet opp hvor mange ganger hvert av nøkkelordene forekommer. Du skal anta at alle forekomster av nøkkelord er atskilt med blanke og/eller linjeskift fra omkringliggende tekst i filen. For å ta vare på den innleste informasjonen skal du benytte følgende klasse: class Oppgave { String filnavn; // Navnet på filen som oppgaven lå i int[] antall; // Antall forekomster av hver nøkkelord Oppgave (int k) { antall = new int[k]; <her kan du legge inn mer> Du lager ett objekt av denne klassen for hver fil som skal leses, og fyller inn i antall-arrayen etterhvert som programmet treffer på nøkkelord i teksten som leses. Pekere til alle objektene kan du lagre i en Oppgave-array (som du kan anta er maksimalt 100 lang). Etter at alle filene er lest (og informasjon er fylt inn i Oppgave-objekter), skal du foreta den parvise sammenlikningen av filer. Det gjør du greiest med en dobbelt (nestet) løkke, og selve sammenlikningen gjøres greiest ved at du deklarerer en objektmetode i klassen Oppgave som foretar sammenlikningen: int finnavstand (Oppgave opg) { <regn ut avstanden til oppgaven opg> Etterhvert som sammenlikningene gjøres, skrives avstandene mellom oppgavene ut med en passende fortekst som sier hvilke oppgaver som sammenliknes. Marker med * alle par som har avstand < 10. Oppgave 8 (20 poeng) Brutopia har innført akkurat samme Lov om behandling av personopplysninger som i Norge, og du skal bruke denne loven til å vurdere følgende situasjon. På et bibliotek i Brutopia vil de lage et lite informasjonssystem om sine lånetagere, hvor de i tillegg til navn og adresse, vil lagre følgende opplysninger: Låntagernes alder, telefonnummer og epost-adresse. Hvilke bøker og videoer de har lånt de siste fem årene. En tilhørende klassifikasjon av de bøkene og videoene som er lånt, med kommentarer om hvilken type mennesker som pleier å låne disse bøkene. Biblioteket har dårlig råd og håper å selge disse opplysningene til ulike firmaer som driver direktereklame via epost. Ved at de ulike låntagerne kan klassifiseres etter hvilke bøker de leser, håper biblioteket å tjene relativt godt på dette opplegget. Drøft om dette er greie opplysninger som biblioteket har rett til å samle inn eller om han må søke Datatilsynet i Brutopia om lov til dette. Begrunn svaret med å vise til konkrete paragrafer som du mener er relevante for dette registeret og de opplysningene biblioteket ønsker å samle inn, og hvorfor de ulike paragrafene du nevner er relevante. 5