Universitetet i Bergen Matematisk naturvitskapleg fakultet Institutt for informatikk Side 1 av 7 Nynorsk Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Fredag 10. desember 2004 Tid: 9.00 14.00 Tillatne hjelpemiddel: Alle trykte og skrivne hjelpemiddel er tillatne. Generelt gjeld at programkode må vera formatert slik at han er leseleg og enkel å forstå. Set inn kommentarar der det er naudsynt. Oppgåve 1 (5 %) Kva for verdiar blir følgjande Java-uttrykk evaluerte til? Svara skal ikkje grunngjevast. a) 7 / 4 b) 7 % 4 c) 1.0 + 7.0 / 4 d) 2 + 2 >= 4 e) (2 < 3 4 < 3) &&!(2 + 2 >= 4)
INF100 Grunnkurs i programmering Side 2 av 7 Oppgåve 2 (15 %) Kvar deloppgåve inneheld eit køyrbart Java-program som skriv ut noko på skjermen. Finn ut kva kvart program skriv ut. Svara skal ikkje grunngjevast. a) (3%) Kva for eit tal skriv programmet Oppg2a ut? public class Oppg2a { int n = 13; int m = 7; n -= m; System.out.println(n*m); b) (3%) Kva skriv programmet Oppg2b ut? public class Oppg2b { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (i == j i+j == 4) System.out.print("X"); else System.out.print("."); System.out.println(); c) (3%) Kva for eit tal skriv programmet Oppg2c ut? public class Oppg2c { int[] t = {2, 3, 5, 7, 11, 13; for (int i = 1; i < t.length; i++) t[i] = t[i-1]; System.out.println(t[5]);
INF100 Grunnkurs i programmering Side 3 av 7 d) (3%) Kva for tal skriv programmet Oppg2d ut? public class Oppg2d { int a = 2; int b = 3; System.out.println(fun(1,1)); System.out.println(fun(a,b)); System.out.println(fun(b,a)); static int fun(int a, int b) { a *= 2; b *= 3; return a+b; e) (3%) Kva for tal skriv programmet Oppg2e ut? class Sample { int n; double s; public void add(double t) { s += t; n++; public double avg() { return s/n; public class Oppg2e { Sample s = new Sample(); s.add(2.0); s.add(3.0); System.out.println(s.avg()); Sample t = s; t.add(4.0); System.out.println(t.avg()); System.out.println(s.avg());
INF100 Grunnkurs i programmering Side 4 av 7 Oppgåve 3 (15 %) Lag eit program som les inn ein sekvens av ord frå terminalen, eitt om gongen. For kvart ord sjekkar programmet om det same ordet er lese inn før. I så fall skriv programmet ut ei melding med kor mange gonger ordet er lese inn tidlegare. Programmet held fram med å lesa inn ord inntil 7 ulike ord er lese inn. For innlesing av ord kan du bruka metoden Terminal.lesString(), som let brukaren tasta inn ein streng og returnerer ein referanse til denne strengen. Eit døme på programdialog kan vera følgjande (inntastingar frå brukaren er understreka): Skriv inn ord inntil du har skrive 7 ulike. Tast inn eit ord: java Nytt ord nummer 1. Tast inn eit ord: eksamen Nytt ord nummer 2. Tast inn eit ord: java Skrive 1 gong tidlegare! Tast inn eit ord: jul Nytt ord nummer 3. Tast inn eit ord: java Skrive 2 gongar tidlegare! Tast inn eit ord: tull Nytt ord nummer 4. Tast inn eit ord: tøys Nytt ord nummer 5. Tast inn eit ord: eksamen Skrive 1 gong tidlegare! Tast inn eit ord: snart Nytt ord nummer 6. Tast inn eit ord: ferie Nytt ord nummer 7. Då har eg 7 ord. Takk!
INF100 Grunnkurs i programmering Side 5 av 7 Oppgåve 4 (65 %) Vi tenkjer oss at vi skal utvikla eit program for å halda oversyn over tabellen i ein fotballserie. Tabellen viser korleis laga ligg an i høve til kvarandre etter kvart som kampane vert spelte. Eit døme (utdrag) er vist i tabell 1. kampar mål poeng Rosenborg 26 52 34 48 Vålerenga 26 40 22 48 Brann 26 46 40 40 Tromsø 26 38 32 40 Tabell 1: Utdrag frå serietabell Første kolonne inneheld namnet til laget, andre kolonne talet på spelte kampar. Deretter vert det vist kor mange mål laget har scora til saman (som vi for å gjera det enkelt kallar forlengsmål) og kor mange det har sluppe inn (baklengsmål). Den siste kolonna er talet på poeng. For kvar kamp vert det gitt 3 poeng for siger, 1 poeng for uavgjort og 0 poeng for tap. I denne oppgåva skal vi laga to viktige klassar i dette programmet. Det kan vera lurt å lesa gjennom heile oppgåva før du byrjar. Dei fleste deloppgåvene går ut på å skriva ein metode. Vi brukar notasjonen metode() for metodar, òg når dei har parametrar. Hugs at metodane kan skrivast uavhengig av kvarandre, sjølv om dei gjer bruk av andre metodar. Vi skal først laga ein klasse Lag som representerer resultata for eit einskilt lag. Opplysningane vi treng å lagra, svarar til ein rad i tabellen. a) (3%) Definer høvelege feltvariablar for klassen. b) (3%) Lag ein konstruktør som opprettar eit nytt lag, med namnet som parameter. Ingen kampar er spelte når laget vert oppretta. c) (3%) Lag metodar hentnamn(), henttaletpåforlengsmål() og hentpoeng() for å returnera dei tilsvarande verdiane. d) (2%) Lag ein metode hentmålskilnad() som returnerer differansen mellom talet på forlengsmål og talet på baklengsmål (kan vera negativ).
INF100 Grunnkurs i programmering Side 6 av 7 e) (5%) Lag ein metode registrerkamp() som oppdaterer opplysningane med resultatet av ein ny kamp. Kampresultatet vert gitt som to parametrar: talet på forlengsmål og talet på baklengsmål i denne kampen. f) (3%) Lag ein metode skrivut() som skriv ut ein rad i tabellen, på forma vist i tabell 1. Bruk tabulator ("\t") for å skilja kolonnane. g) (7%) Lag ein metode compareto() som samanliknar resultatet for det aktuelle laget med eit anna lag, gitt som parameter. Returverdien er eit heiltal som viser kven som ligg best an i tabellen. Først vert poenga samanlikna. Dersom det aktuelle laget (this) har flest poeng, vert eit positivt tal returert. Dersom det andre laget har flest, vert eit negativt tal returnert. Dersom poengtalet er likt, vert målskilnaden samanlikna på same viset. Dersom målskilnaden òg er lik, tel talet på forlengsmål. Er alt dette likt, returnerar metoden 0. Vi skal nå laga ein klasse Serie som representerer ein heil tabell som vist i tabell 1. I klassen skal dette implementerast som ein tabell av Lag-objekt. Dessutan skal heile serien ha eit namn, t.d. Eliteserien. h) (3%) Definer høvelege feltvariablar for klassen. i) (5%) Lag ein konstruktør med to parametrar: ein streng som inneheld namnet på serien, og ein tabell av strenger som inneheld namna på laga. For kvart namn i denne tabellen vert eit nytt lag-objekt oppretta og lagt inn i serien. j) (5%) Lag ein metode finnlag() som finn eit lag i serien. Metoden tek namnet på laget (ein streng) som parameter. Dersom det finst eit lag i serien med dette namnet, vert ein referanse til dette Lag-objektet returnert. Dersom det ikke finst noko slikt lag, vert nullreferansen returnert. k) (5%) Lag ein metode registrerkamp() som oppdaterer tabellen med resultatet av ein kamp. Metoden tek fire parametrar: namn og talet på mål for kvart lag. Døme på metodekall: s.registrerkamp("tromsø","viking",2,1) (der s er ein referanse til eit Serieobjekt). Dersom begge laga finst i tabellen, vert informasjonen i kvart av objekta oppdatert, og metoden returnerer true. Dersom ikkje begge laga finst, vert ingenting endra, og metoden returerer false. l) (7%) Lag ein metode lesresultatfil() som les ei tekstfil med kampresultat og registrerer dei i tabellen. Metoden tek filnamnet som parameter. Filen inneheld eit ukjent tal på kampar og er på følgjande format: Tromsø-Viking 2-1 Brann-Rosenborg 0-4 Vålerenga-Sogndal 5-0
INF100 Grunnkurs i programmering Side 7 av 7 Berre kampar der begge laga er med i den aktuelle serien, vert registrerte. Eventuelle andre resultat hoppar metoden over. Metoden returnerer talet på kamper som vart registrerte. m) (3%) Vi treng òg ein metode for å sortera tabellen. Koden under brukar algoritmen boblesortering til dette. Skriv ned vilkåret som manglar i valsetninga (1). Tabellen skal sorterast med det beste resultatet først, slik som i tabell 1, basert på kriteria i punkt g. public void sortertabell() { for (int siste=tabell.length-1; siste>0; siste--) { for (int dette=0; dette<siste; dette++) { if ( /* set inn vilkår her */ ) { // (1) Lag temp = tabell[dette]; tabell[dette] = tabell[dette+1]; tabell[dette+1] = temp; n) (4%) Lag ein metode skrivtabell() som skriv ut heile tabellen, sortert som over. Bruk namnet på serien som overskrift. o) (7%) Når serien er spelt ferdig, vil dei beste laga rykkja opp i ein høgare divisjon (dersom det finst), og dei dårlegaste vil rykkje ned. Lag ein metode oppned() som gjer ei slik utveksling av to lag mellom to divisjonar (to Serie-objekt). Metoden tek tre parametrar: Serie over, int nrfratoppen, int nrfrabotnen. Det aktuelle objektet (this) er den nedste divisjonen, og over er den øvste. Når metoden vert kalla, vil lag nummer nrfratoppen i den aktuelle serien, rekna frå toppen av tabellen (når han er sortert) byta plass med lag nr nrfrabotnen, rekna frå botnen i serien over. Til dømes vil kallet div2a.oppned(div1,1,1) byta vinnaren i div2a med taparen i serien div1,og kallet div2b.oppned(div1,1,2) vil byta vinnaren i serien div2b med det nest dårlegaste laget i div1. Lykke til! Eivind Coward Karl Holmås