UNIVERSITETET I OSLO

Like dokumenter
UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

UNIVERSITETET I OSLO

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

UNIVERSITETET I OSLO

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

INF Uke 10. Ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Det matematisk-naturvitenskapelige fakultet

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i INF1000 våren 2006

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

UNIVERSITETET I OSLO

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Oblig4 - forklaringer. Arne og Ole Christian

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

UNIVERSITETET I OSLO

PRØVEEKSAMEN (rettet versjon 27/11)

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

UNIVERSITETET I OSLO

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

TDT4100 Objektorientert programmering

Gjennomgang av en tenkt eksamensoppgave

Gjennomgang av en tenkt eksamensoppgave

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

b) 10 2 = 20 c) 5 1 = 5.

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Blokker og metoder INF1000 (Uke 6) Metoder

UNIVERSITETET I OSLO

Forelesning inf Java 5

UNIVERSITETET I OSLO

Forelesning inf Java 5

INF1000 Prøveeksamen Oppgave 7 og 9

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

UNIVERSITETET I OSLO

Oppgave 1 - Kortsvarsoppgave. INF1000 eksamen V05. Oppgave 1 (c) Oppgave 1 (b) Svar: a = 9, b=10

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

INF1000: noen avsluttende ord

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

INF1000 : Forelesning 4

Løsningsforslag, inf101, våren 2001

Repetisjon. INF gruppe 13

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Inf 1000 høst 2005 Løsningsforslag ordinær eksamen

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Eksamen høsten 2003 Den store bøygen i INF1000 er de obligatoriske oppgavene.

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Transkript:

FASIT/LØSNINGSFORSLAG (kommentarene er for læringsformål og avspeiler ikke nødvendigvis hva som ble vektlagt ved sensuren denne gang). Forslaget er laget av Ole Christian Lingjærde. UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i : INF1000 Grunnkurs i objektorientert programmering Eksamensdag : Torsdag 2. desember 2004 Tid for eksamen : 09.00 12.00 Oppgavesettet er på : 10 sider Vedlegg : Ingen Tillatte hjelpemidler : Alle trykte og skrevne (Trykkfeil som ble oppdaget etter eksamen er korrigert nedenfor. Ved sensuren ble det tatt hensyn til slike forhold). Les gjennom hele oppgaven før du begynner å løse oppgaven. Kontroller at oppgavesettet er komplett før du begynner å besvare det. 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. Dine svar skal skrives på disse oppgavearkene, og ikke på separate ark. Dette gjelder både spørsmål med avkrysningssvar og spørsmål hvor du bes om å skrive programkode. I de oppgavene hvor det skal skrives programkode, anbefales det at du først skriver en kladd på eget ark før du fører svaret inn i disse oppgavearkene på avsatt plass. Noen av spørsmålene er flervalgsoppgaver. På disse oppgavene får du poeng etter hvor mange korrekte svar du gir. Du får ikke poeng hvis du lar være å besvare et spørsmål, eller dersom du krysser av begge svaralternativer. Hvis du har satt et kryss i en avkrysningsboks og etterpå finner ut at du ikke ønsket å krysse av der, kan du skrive "FEIL" like til venstre for den aktuelle avkrysningsboksen. Husk å skrive såpass hardt at besvarelsen blir mulig å lese på alle gjennomslagsarkene, men ikke legg andre deler av eksamensoppgaven under når du skriver. Med unntak av oppgave 7 behøver du ikke skrive kommentarer til programkoden. Oppgave 1 Hvor mange doubleverdier er det plass til i hver av disse arrayene? a) double[][] tabella = new double[9][9];... 81 b) double[][] tabellb = new double[10][2];... 20 c) double[][] tabellc = new double[5][1];... 5

2 Oppgave 2 Er disse programsetningene lovlige i Java? JA NEI int[] a = null; int x = new int[50]; int[] x = int[50]; int[] verdier = new verdier[50]; int[] verdier = new int; double[] x = new int[5]; String[] s = {"januar", "februar", "mars"; double[] x = new double{1.0, 2.0, 3.0, 4.0, 5.0; double[] x, []y; Oppgave 3 Anta at følgende kodelinjer utføres: int a = 33; int b = 65; a = a + b; b = a + b; boolean samme = (a == b); Hva er verdien til variabelen samme rett etterpå?... false Oppgave 4 Skriv ferdig metoden under, som med utgangspunkt i en pris med moms skal beregne og returnere pris uten moms. Momssatsen skal antas å være 24%. double prisutenmoms(double prismedmoms) { double momssats = 0.24; return prismedmoms / (1 + momssats);

Oppgave 5 Anta at følgende array er deklarert i en metode i et program: int[] a = new int[100]; 3 Anta videre at a er fylt opp med ulike verdier, og at verdien 0 forekommer nøyaktig en gang i arrayen. Vil alternativene under alltid gi som resultat at a[k] inneholder verdien 0? JA NEI int k = 0; while (k < a.length && a[k] == 0) { k++; int k = 0; while (k < a.length && a[k]!= 0) { k++; int k = 0; do { k++; while (a[k]!= 0); boolean funnet = false; int k = 0; while (k < a.length &&!funnet) { if (a[k] == 0) { funnet = true; int k = 0; for (int i = 0; i < a.length; i++) { if (a[k] == 0) { k = i; else { k++; Oppgave 6 Anta at følgende setninger utføres: int sum = 9; int verdi = sum++; sum = ++sum + verdi++; verdi += sum * 10; Hva er verdien til variabelen verdi like etter at setningene over er utført?... 210

4 Oppgave 7 Her skal du både skrive javadoc-kommentarer og programkode. a) Skriv ferdig metoden under som skal returnere med gjennomsnittet av verdiene i arrayen data (dvs summen av alle elementene i data delt på antallet slike elementer). Du kan anta at lengden av arrayen er minst 1. b) Skriv en kort javadoc-kommentar til metoden som sier hva den gjør (returnerer av verdi) og hva parameteren er. /** * Returnerer gjennomsnitt (aritmetisk middelverdi) av tallene i parameter-arrayen. * * @param data en array med double-verdier * @return aritmetisk middelverdi av tallene i parameter-arrayen */ double middelverdi(double[] data) { double sum = 0.0; // Vanlig feil: glemme å initialisere denne til 0 for (int i = 0; i < data.length; i++) { sum += data[i]; return sum / data.length; // Vi trenger ikke å sjekke om data.length==0 siden // det skal antas at lengden av arrayen er minst 1. Oppgave 8 Gitt to variabler int i1, i2; som initialiseres til hver sin verdi. Skriv noen programsetninger som samlet sett bytter om innholdet av variablene i1 og i2. Du kan godt deklarere ekstra variable hvis du trenger det. int tmp = i1; i1 = i2; i2 = tmp;

5 Oppgave 9 Skriv ferdig metoden under som skal bytte om på elementene i arrayen x slik at elementene blir liggende i omvendt rekkefølge. Dersom f.eks. verdiene i x i utgangspunktet er sortert i stigende rekkefølge (x[0] <= x[1] <=.. <= x[999]) så skal altså metoden endre rekkefølgen slik at de etterpå er sortert i synkende rekkefølge. Du skal ikke deklarere noen flere arrayer for å løse oppgaven, men du kan gjerne deklarere noen enkle variabler hvis du ønsker det. void reverser (double[] x) { int n = x.length; for (int i = 0; i < n / 2; i++) { double tmp = x[i]; x[i] = x[n 1 i]; x[n 1 i] = tmp; /* Merk 1: det er ikke nødvendig å behandle tilfellene x.length == oddetall og x.length == partall hver for seg (forsøk f.eks. å la x.length == 2 og deretter x.length == 3 i programkoden over, og overbevis deg om at det riktige skjer i begge tilfeller). */ Merk 2: ikke deklarer variable før du trenger dem. I programkoden over deklareres double-variabelen tmp INNE i løkka, ikke før løkka. Dermed eksisterer variabelen tmp kun i den delen av programmet hvor variabelen brukes. Dette gjør gjenbruk lettere, reduserer sjansen for programmeringsfeil og er (i motsetning til hva mange tror) minst like effektivt som å deklarere tmp før løkka. Vil du vite mer om slike ting, se boka Effective Programming in Java, http://java.sun.com/developer/books/effectivejava/

6 Oppgave 10 (Vanskelig) Skriv metoden under som finner og skriver ut på skjerm de to største verdiene i arrayen v. En verdi kan forekomme flere steder i arrayen, men du skal anta at ikke alle verdier i arrayen er like. Hvis f.eks. arrayen inneholder to forekomster av verdien 100, to forekomster av verdien 50, og resten av verdiene er 0, så skal metoden skrive ut at største verdi var 100 og nest største verdi var 50. Du trenger ikke å skrive ut hvor disse verdiene ligger i arrayen. Du kan anta lengden av arrayen er minst 2 og at den bare inneholder ikke-negative heltall. void finntostørste (int[] v) { int største = 0; for (int i=0; i<v.length; i++) { if (v[i] > største) { største = v[i]; System.out.println("Største verdi er " + største); int neststørste = 0; for (int i=0; i<v.length; i++) { if (v[i] > neststørste && v[i] < største) { neststørste = v[i]; System.out.println("Nest største verdi er " + neststørste"); /* Merk: det er fullt mulig å finne både største og nest største verdi i en enkelt løkke, men det krever litt mer omtanke. De fleste som forsøkte seg på dette på eksamen endte opp med å gjøre feil. De som fikk det til, fikk samme uttelling som de som valgte løsningen ovenfor. Oppgave: forklar hvorfor forslaget nedenfor IKKE alltid gir riktig løsning (ser du hvordan en ekstra setning får den til å virke?): */ int største = 0, neststørste = 0; for (int i=0; i<v.length; i++) { if (v[i] >= største) { største = v[i]; else if (v[i] > neststørste) { neststørste = v[i];

7 Oppgave 11 I programmet nedenfor skal du lage en konstruktør til klassen Sirkel som har sirkelens radius som parameter. Du skal også lage en objektmetode i klassen Sirkel som regner ut arealet og returnerer denne verdien (du kan bruke formelen: areal = 3.14*radius*radius). Du skal også skrive programkode i main som oppretter to sirkler, en med radius 10.4 og en med radius 244.99. Fra main skal du så kalle på arealberegningsmetoden i hvert av de to objektene og skrive ut en linje for hver sirkel med radius og areal. class Sirkel { double radius; // skriv konstruktør her Sirkel (double radius) { this.radius = radius; // skriv objektmetode her som beregner og returnerer arealet double finnareal() { return 3.14 * radius * radius; // Vanlig feil: ha med radius som parameter i metoden over. Sirkelens radius // er tilgjengelig som en objektvariabel, og det er denne som skal benyttes. // end class Sirkel class SirkelTest { public static void main ( String [] args) { // skriv kode her som lager to Sirkel-objekter og // skriver ut deres radius og areal som gitt ovenfor // Først lager vi to sirkel-objekter med radier som oppgitt i oppgaven. Merk at sirkel- // radiusen skal gis som argument når man oppretter objektet, og ikke settes inn // etterpå med s1.radius =... Glemmer man å gi sirkel-radiusen som argument // får man kompileringsfeil. double radius1 = 10.4; double radius2 = 244.99; Sirkel s1 = new Sirkel (radius1); Sirkel s2 = new Sirkel (radius2); // Så finner vi arealet til sirklene. Nå skal vi ikke oppgi sirklenes radier, // siden disse allerede ligger inni Sirkel-objektene. double areal1 = s1.finnareal(); double areal2 = s2.finnareal(); // Til slutt skriver vi ut radius og areal for hver av sirklene. System.out.println("Sirkel 1 har radius " + radius1 + " og areal " + areal1); System.out.println("Sirkel 2 har radius " + radius2 + " og areal " + areal2); // end main // end class SirkelTest

8 Oppgave 12 På en barneskole finnes det 7 klassetrinn som hver igjen består av en eller flere grupper. Hver gruppe består så av fra 10 til 20 elever. Tegn et UML-klassediagram med de 4 (Java-)klassene som kan brukes til å representere dette problemet. Gi navn på disse klassene og plasser antall på forholdet mellom disse klassene. har består av Barneskole Klassetrinn består av Gruppe Elev 1 7 1 1..* 1 10..20 Oppgave 13 Anta at følgende program utføres: class Tre { Tre venstre, høyre; static int ant = 0; Tre (int x) { ant++; if (x > 10 ) venstre = new Tre(x-10); if (x > 20 ) høyre = new Tre(x-20); public static void main(string[] args) { ant = 0; Tre t1 = new Tre(11); System.out.println( 1) + ant); ant = 0; Tre t2 = new Tre(21); System.out.println( 2) + ant); ant = 0; Tre t3 = new Tre(31); System.out.println( 3) + ant); Tegn først opp for deg selv og finn ut hvor mange Tre-objekter vi får laget av de ulike setningene i main. Svar så på spørsmålet: hva skriver programmet ut på skjermen? 1) 2 2) 4 3) 7...

9 Oppgave 14 Anta at du har en tekstfil Bok.txt som f.eks. inneholder teksten i en roman. Lag et komplett, kompilerbart program som leser filen ord for ord og som teller opp antall forekomster av hvert enkelt ord i filen. Programmet ditt skal deretter opprette en ny fil Ordforekomster.txt og skrive resultatet av analysen til denne filen. Følgende opplysninger om Bok.txt skal skrives til denne filen: (a) antall ord totalt; (b) antall ulike ord; og (c) en liste over alle ord som forekommer minst 6 ganger. Hver linje av denne listen skal inneholde ett ord og antall forekomster av dette ordet, atskilt av blanke tegn. Du kan anta at filen Bok.txt kun inneholder bokstaver og blanke tegn, dvs spesialtegn som komma, punktum, kolon, osv, forekommer ikke i teksten. Du kan også anta at alle ord i teksten er skrevet med små bokstaver, slik at du slipper problemer med stor forbokstav i begynnelsen av en setning, osv. Hint: bruk en HashMap til å holde rede på ordene du leser i Bok.txt og antall forekomster av dem. Tenk deg nøye om hva du skal legge inn i HashMap'en. Husk at både nøkkelen og verdien du legger inn i en HashMap må være (pekere til) objekter. Du vil kanskje ønske å definere en klasse Ord hvor hvert objekt lagrer et ord og antall forekomster av ordet. import easyio.*; import java.util.*; // For å få tilgang til klassene In og Out // For å få tilgang til klassen HashMap class BokMain { public static void main (String[] args) { BokAnalyse ba = new BokAnalyse(); ba.lesfrafil("bok.txt"); ba.skrivtilfil("ordforekomster.txt"); class BokAnalyse { private HashMap alleord = new HashMap(); private int antallordtotalt = 0; public void lesfrafil (String filnavn) { // Se neste side public void skrivtilfil (String filnavn) { // Se neste side class Forekomster { private int antall = 1; public void nyforekomst() { antall++; public int fåantall() { return antall; (fortsetter på neste side)

10 void lesfrafil (String fnavn) { In innfil = new In(fnavn); while (!innfil.lastitem()) { String ord = innfil.inword(); antallordtotalt++; // Deklarer variabelen ord inni løkka, ikke før if (alleord.containskey(ord)) { Forekomster fo = (Forekomster) alleord.get(ord); fo.nyforekomst(); else { Forekomster fo = new Forekomster(); alleord.put(ord, fo); public void skrivtilfil (String filnavn) { Out utfil = new Out(filnavn); utfil.outln("antall ord totalt: " + antallordtotalt); utfil.outln("antall ulike ord: " + alleord.size()); Iterator it = alleord.keyset().iterator(); while (it.hasnext()) { String ord = (String) it.next(); Forekomster fo = (Forekomster) alleord.get(ord); int antall = fo.fåantall(); if (antall > 5) { utfil.outln(ord + "\t" + antall); utfil.close();