Løsningsforslag eksamen in105, høsten 2000

Like dokumenter
Løsningsforslag til eksamen i INF1000 våren 2006

Gjennomgang av eksamen H99

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

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; }

Objektorientert design av kode. Refaktorering.

"Nelsons kaffebutikk"

Oppgave 1 (Programtolkning) INF1000 Eksamen V06. Oppgave 1 (Programtolkning) Oppgave 1 (Programtolkning)

UNIVERSITETET I OSLO

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

Gjennomgang av eksamen V99

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

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

INF1010 Sortering. Marit Nybakken 1. mars 2004

Løsningsforslag, inf101, våren 2001

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

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

UNIVERSITETET I OSLO

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

INF Uke 10. Ukesoppgaver oktober 2012

Endret litt som ukeoppgave i INF1010 våren 2004

UNIVERSITETET I OSLO

INF1000 (Uke 14) Resten av eksamen H03 + del av V05

UNIVERSITETET I OSLO

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

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

Repetisjon. INF gruppe 13

IN105-javaNelson-2. array, evt. flere dimensjoner. Institutt for informatikk Jens Kaasbøll sept En funksjon om gangen En klasse om gangen

Løsningsforslag til eksamen i INF1000

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

INF Løsning på seminaropppgaver til uke 8

Løsningsforslag eksamen in105, våren 2000

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Inf1000 (Uke 10) HashMap og ArrayList

Løsningsforslag INF desember 2007

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1000 HashMap. Marit Nybakken 2. november 2003

Obligatorisk oppgave 1 INF1020 h2005

Gjennomgang av en tenkt eksamensoppgave

PRØVEEKSAMEN (rettet versjon 27/11)

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

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I OSLO

Uke 8 - Oppramstyper, HashMap og Innstikksortering, litt javadoc. 17. oktober 2013, Arne Maus Inst. for informatikk, UiO

Gjennomgang av en tenkt eksamensoppgave

INF1000: Forelesning 6. Klasser og objekter del 1

UNIVERSITETET I OSLO

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

Forelesning inf Java 4

INF1010 Binære søketrær ++

UNIVERSITETET I OSLO

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

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

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

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

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

UNIVERSITETET I OSLO

INF1000 : Forelesning 4

Eksamen. Objektorientert Programmering IGR 1372

Algoritmer og datastrukturer Eksamen

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

(MVC - Model, View, Control)

HØGSKOLEN I SØR-TRØNDELAG

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

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

GJØVIK INGENIØRHØGSKOLE

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

Løsningsforslag til eksamen i inf101 H2002. Oppgave 1. a)

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Grunnkurs i programmering Institutt for Informatikk Universitetet i Oslo Are Magnus Bruaset og Anja Bråthen Kristoffersen

INF1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

Oppgave01.java class Bongo { 2 public static void main(string[] args){ 3 int[][][]bongo = new int[2][3][4]; 4 5 // SVAR: 24 6 } 7 } 8

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

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

INF2440 Prøveeksamen, løsningsforslag, 20 mai Arne Maus PSE, Inst. for informatikk

EKSAMEN. Emne: Algoritmer og datastrukturer

Transkript:

Løsningsforslag eksamen in105, høsten 2000 Det tas forbehold om mulige feil i løsningsforslaget. Oppgave 1 I klassen Bok velger vi her å ta med int antallutlån selv om denne ikke trengs før i oppgave 4. Det gis full uttelling her selv om denne mangler. Tilsvarende gjelder for int antalllånte i klassen Laaner. class Bok { static Inn tastatur = new Inn(); String kode, forfatter, tittel; int antallutlån=0; Bok() { System.out.print("Gi bokens kode:"); System.out.print("Gi bokens forfatter:"); forfatter = tastatur.instringln(); System.out.print("Gi bokens tittel:"); tittel = tastatur.instringln(); Bok(String kode, String forfatter, String tittel) { this.kode = kode; this.forfatter = forfatter; this.tittel = tittel; class Laaner { static Inn tastatur = new Inn(); String fnr, navn, epost; int antalllånte = 0; Laaner() { System.out.print("Gi låners fødselsnummer (11 siffer):"); fnr = tastatur.instringln(); System.out.print("Gi låners navn:"); navn = tastatur.instringln(); System.out.print("Gi låners epost-adresse (eller return hvis ingen):"); epost = tastatur.instringln(); Laaner(String fnr, String navn, String epost) { this.fnr = fnr; this.navn = navn; this.epost = epost;

Oppgave 2A Vi antar at formatet til filen er som i følgende eksempel: ha234b4 Olga Hagerup Donaldismen frå eit andeperspektiv 45 be236b2 Kristin Bergmot Bioinformatikkens historie 235 ZZZ Dvs det er fire linjer for hver bok: koden, forfatteren, tittelen, antall utlån. Filen avsluttes med en egen linje hvor det står "ZZZ". Merk: det går ikke fram av oppgaven at man må ha med antall utlån i klassedeklarasjonen i oppgave 1 og følgelig heller ikke at man skal legge antall utlån ut på fil. Derfor ble det til eksamen gitt full uttelling også for korrekt løsning der antall utlån mangler. I klassen Register: HashMap allebøkene = new HashMap(); void lesbøkerfrafil() { String kode, forfatter, tittel; Inn innfil = new Inn("Allebokene.dat"); kode = innfil.instringln(); while (!kode.equals("zzz")) { forfatter = innfil.instringln(); tittel = innfil.instringln(); bok = new Bok(kode, forfatter, tittel); bok.antallutlån = Integer.parseInt(innfil.inStringLn()); allebøkene.put(kode, bok); kode = innfil.instringln(); Oppgave 2B I klassen Register: void skrivbøkertilfil() {

Ut utfil = new Ut("Allebokene.dat"); Iterator it = allebøkene.values().iterator(); while (it.hasnext()) { bok = it.next(); utfil.outstringln(bok.kode); utfil.outstringln(bok.forfatter); utfil.outstringln(bok.tittel); utfil.outstringln(bok.antallutlån); utfil.outstringln("zzz"); utfil.close(); Oppgave 3 Det går ikke klart fram av oppgaven nøyaktig hva som skal inngå i den mentale modellen. Det som iallefall skal være med er de klassene som står i tillegg A + klassene Bok og Laaner + tabell for holde orden på bøker, men det kan være naturlig å ta med den delen av datastrukturen som holder orden på utlån også, samt de tabeller som trengs for å holde orden på lånere og utlån. Jeg velger nedenfor å basere meg på den siste tolkningen (men begge tolkninger bør gi full uttelling dersom det ellers er korrekt). Følgende utvidelser av programmet tenkes da gjort: I klassen Register: final static int MAXLÅNTE = 10; HashMap alleutlån = new HashMap(); HashMap allelånere = new HashMap(); I tillegg kommer følgende nye klasse: class Utlaan { int forfallsdato; Laaner låner; Utlaan (Bok bok, Laaner låner, int forfallsdato) { this.bok = bok; this.låner = låner; this.forfallsdato = forfallsdato;

Bibliotek main Register Register allebøkene alleutlån allelånere Bibliotek reg HashMap kode fnr Nøkkelen i de tre hashtabellene er av typen String (hhv kode, kode og fnr i allebøkene, alleutlån og allelånere). forfatter tittel antallutlån Bok forfallsdato bok låner Utlaan navn epost antalllånte Laaner Merk: tegnemåten ovenfor avviker litt fra det som benyttes i inf101 høsten 2001. Spesielt benyttes det nå en litt annen tegnemåte for HashMap, og vi forlanger ikke lenger at alle klassebokser (stiplede bokser) skal være med. Se hjelpeheftet for detaljerte opplysninger om nåværende tegnemåte. Den gamle tegnemåten illustrert ovenfor skal imidlertid også godtas (og vil bli godtatt til eksamen). Oppgave 4 I klassen Bibliotek: static Inn tastatur = new Inn(); // Punkt 1 void nybok() { String kode, forfatter, tittel; String resultat; System.out.print("Kode:"); System.out.print("Forfatter:"); forfatter = tastatur.instringln();

System.out.print("Tittel:"); tittel = tastatur.instringln(); resultat = reg.nybok(kode, forfatter, tittel); // Punkt 2 void nylåner() { String navn, fnr, epost; System.out.print("Navn:"); navn = tastatur.instringln(); System.out.print("Fødselsnummer:"); fnr = tastatur.instringln(); System.out.print("Epostadresse (blank hvis ingen):"); epost = tastatur.instringln().trim(); resultat = reg.nylåner(fnr, navn, epost); // Punkt 3 void nyttutlån() { String kode, fnr; Laaner låner; int forfallsdato; int resultat; System.out.print("Bokens kode:"); System.out.print("Lånerens fødselsnummer:"); fnr = tastatur.instringln(); resultat = reg.nyttutlån(kode, fnr); // Punkt 4 void innlevering() { String kode; String resultat; System.out.print("Bokens kode:"); resultat = reg.innlevering(kode);

// Punkt 5 void sjekkutlånsstatus() { String kode; String resultat; System.out.print("Bokens kode:"); resultat = reg.sjekkutlånsstatus(kode); // Punkt 6 void listeforfaltebøker() { String [] liste; liste = reg.listeforfaltebøker(); if (liste[0].equals("")) System.out.println("Ingen bøker er forfalt til levering!"); else { System.out.println("FORFATTER\t TITTEL\t LÅNERS NAVN\t EPOSTADRESSE"); for (int i=0;!liste[i].equals(""); i++) System.out.println(liste[i]); // Punkt 7 void listelåntebøker() { String fnr; String [] liste; System.out.print("Lånerens fødselsnummer:"); fnr = tastatur.instringln(); liste = reg.listelåntebøker(fnr); if (liste[0].equals("")) System.out.println("Personen låner ingen bøker for tiden."); else { for (int i=0;!liste[i].equals(""); i++) System.out.println(liste[i]); // Punkt 8 void sjekkantallutlån() { String kode; String resultat; System.out.print("Bokens kode:"); resultat = reg.sjekkantallutlån(kode);

I klassen Register: // Punkt 1 String nybok(string kode, String forfatter, String tittel) { if (allebøkene.containskey(kode)) return "En bok med denne koden var allerede registrert!"; bok = new Bok(kode, forfatter, tittel); allebøkene.put(kode, bok); return "Boken er nå registrert!"; // Punkt 2 String nylåner(string fnr, String navn, String epost) { Laaner låner; if (allelånere.containskey(fnr)) return "Låneren var allerede registrert!"; låner = new Laaner(fnr, navn, epost); allelånere.put(fnr, låner); return "Låneren er nå registrert!"; // Punkt 3 String nyttutlån(string kode, String fnr) { int forfallsdato; Laaner låner; Utlaan utlån; if (!allebøker.containskey(kode)) return "Boken finnes ikke!"; if (!allelånere.containskey(fnr)) return "Låneren finnes ikke!"; if (alleutlån.containskey(kode)) return "Boka er allerede utlånt!"; bok = (Bok) allebøker.get(kode); låner = (Laaner) allelånere.get(fnr); if (låner.antalllånte >= MAXLÅNTE) return "Låneren kan ikke låne mer enn " + MAXLÅNTE + " bøker!"; forfallsdato = adddays(today(), 30); bok.antallutlån++; låner.antalllånte++; utlån = new Utlaan(bok, låner, forfallsdato); alleutlån.put(kode, utlån); return "Utlånet er nå registrert!";

// Punkt 4 String innlevering(string kode) { Utlaan utlån; if (!alleutlån.containskey(kode)) return "Boka er ikke utlånt!"; utlån = (Utlaan) alleutlån.get(kode); alleutlån.remove(kode); utlån.låner.antalllånte--; return "Innleveringen er registrert!"; // Punkt 5 String sjekkutlånsstatus(string kode) { if (!allebøkene.containskey(kode)) return "Boken finnes ikke!"; if (!alleutlån.containskey(kode)) return "Boken er ikke utlånt"; return "Boken er utlånt"; // Punkt 6 String [] listeforfaltebøker() { String [] liste; Utlaan utlån; int antallforfalte = 0; int idag = today(); /* Vi vet ennå ikke hvor lang listen over forfalte bøker blir, men den er ihvertfall ikke lenger enn antall utlånte bøker. Derfor lager vi et array med lengde lik antall utlånte bøker pluss 1 (slik at vi alltid kan legge en tom streng ("") helt bakerst for å markere slutten). */ liste = new String[alleUtlån.size()+1]; Iterator it = alleutlån.values().iterator(); while (it.hasnext()) { utlån = (Utlaan) it.next(); if (utlån.forfalt(idag)) { // må lage forfalt(...) liste[antallforfalte] = utlån.info(); // må lage info() antallforfalte++; liste[antallforfalte] = ""; // Markerer slutten return liste;

// Punkt 7 String [] listelåntebøker(string fnr) { String liste; int antalllånte = 0; /* Det står ikke spesifisert i oppgaven hvilken informasjon man skal oppgi for hver lånt bok. Velger her å oppgi bokens kode, forfatter og tittel (dette er implementert som en egen metode i klassen Bok). */ I denne metoden kunne vi hatt nytte av en tabell (array) over lånte bøker i Laaner-objektene. Velger her en løsning hvor vi ikke har en slik tabell, og hvor vi istedet søker gjennom hele alleutlån-tabellen etter bøker som er lånt ut til personen med spesifisert fødselsnummer. liste = new String[MAXLÅNTE+1]; Iterator it = alleutlån.values().iterator(); while (it.hasnext()) { utlån = (Utlaan) it.next(); if (utlån.låner.fnr.equals(fnr)) { liste[antalllånte] = utlån.bok.info(); // Må lage info() antalllånte++; liste[antalllånte] = ""; // Markerer slutten return liste; // Punkt 8 String sjekkantallutlån(string kode) { if (!allebøkene.containskey(kode)) return "Boken finnes ikke!"; bok = (Bok) allebøkene.get(kode); return "Antall utlån: " + bok.antallutlån; I klassen Utlaan: boolean forfalt (int dato) { return (forfallsdato > dato); String info() { return bok.forfatter + "\t" + bok.tittel + "\t" + låner.navn + "\t" + låner.epost; I klassen Bok: String info() { return kode + "\t" + forfatter + "\t" + tittel;

Oppgave 5 Det er mange måter å løse denne oppgaven på, f.eks.: Sorter alle bøkene avtagende med hensyn på antall utlån, og plukk ut de 10 bøkene som havnet på toppen i den sorterte listen. Denne metoden er lite effektiv (den gjør mye mer enn nødvendig, ettersom rekkefølgen blant bøkene som ikke er 10-på-topp er likegyldig), og dessuten var ikke sortering pensum i in105 dette semesteret. Lag en liste over alle bøkene (f.eks. ved å legge dem inn i et array). Løp gjennom alle bøkene 10 ganger: hver gang plukker en ut boka med flest utlån, legger den inn i listen over mest lånte bøker, og fjerner deretter boka fra listen over alle bøker (slik at den ikke plukkes ut neste gang også). Denne metoden er mer effektiv, men den medfører fortsatt at man må løpe 10 ganger gjennom alle bøkene. Løp gjennom alle bøkene en gang, og hold hele tiden rede på hvilke av de bøkene man har sett på som er blant de 10 mest lånte. Denne metoden er enda mer effektiv siden man bare trenger å løpe en gang gjennom alle bøkene. Nedenfor viser vi denne løsningen. I klassen Bibliotek: void mestlånte() { String liste []; liste = reg.mestlånte(); for (i=0; i<10; i++) System.out.println(liste[i]); I klassen Register: String [] mestlånte() { /* Lager en tabell som til enhver tid inneholder informasjon om de 10 mest lånte bøker blant de vi så langt har gått gjennom. Vi antar for enkelhets skyld at det er minst ti bøker som er registrert i systemet. */ String liste [] = new String[10]; Bok tibeste [] = new Bok[10]; Bok nestebok; int antall = -1; // Antall lån for 10. mest lånte bok ind; // Indeksen i tibeste til boka ovenfor Iterator it = allebøkene.values().iterator();

// Fyll opp tibeste med de 10 første bøkene for (int i=0; i<10; i++) { nestebok = (Bok) it.next(); tibeste[i] = nestebok; if (nestebok.antallutlån > antall) { ind = i; antall = nestebok.antallutlån; // Gå gjennom resten av bøkene og oppdater tibeste etterhvert while (it.hasnext()) { nestebok = (Bok) it.next(); if (nestebok.antallutlån > antall) { tibeste[ind] = nestebok; // Finn 10. mest lånte bok for (int i=0; i<10; i++) if (tibeste[i].antallutlån < antall) { ind = i; antall = nestebok.antallutlån; // Returner resultatet for (int i=0; i<10; i++) liste[i] = tibeste[i].info(); // info() ble laget i oppgave 4 return liste;